2

私はゲームを開発していますが、ゲームには異なるモードがあります。簡単、普通、難しい。ということで、ゲームモードの保存方法を考えています。私の最初のアイデアは、数字を使用して難易度を表すことです。

簡単 = 0 普通 = 1 難しい = 2

したがって、私のコードは次のようになります。

switch(gameMode){

case 0:
//easy
break;

case 1:
//normal
break;

case 3:
//difficult
break;

}

しかし、いくつか問題があると思います。たとえば、「エクストリーム」などの新しいモードを追加する場合、ケース 4 を追加する必要があります... ... gd デザインではないようです。

ということで、gameMode オブジェクトを作ってみようかと思ってますが、別の gameMode はスーパークラス gameMode のサブクラスです。gameMode オブジェクトは次のようなものです。

    class GameMode{
    int maxEnemyNumber;
    int maxWeaponNumber;
      public static GameMode init(){
         GameMode gm = GameMode();
         gm.maxEnemyNumber = 0;
         gm.maxWeaponNumber = 0;
         return gm;
      }    

    }

class EasyMode extends GameMode{

      public static GameMode init(){
         GameMode gm = super.init();
         gm.maxEnemyNumber = 10;
         gm.maxWeaponNumber = 100;
         return gm;
      }    
}


class NormalMode extends GameMode{

      public static GameMode init(){
         GameMode gm = super.init();
         gm.maxEnemyNumber = 20;
         gm.maxWeaponNumber = 80;
         return gm;
      }    
}

しかし、gameMode を格納するオブジェクトを作成するのは「かさばる」ように思えます。私の「gameMode」は、ゲーム設定のさまざまな変数のみを格納します....オブジェクトを作成する代わりに、データのみを格納する簡単な方法はありますか? ええ。

4

8 に答える 8

2

構成データのテーブルを表現しようとしていると思います。それをサポートする言語を使用している場合は、これを構成ファイルに入れるか、コードでリテラル データを使用します。

たとえば、C では次のように記述できます。

typedef enum difficulties {
  DIFFICULTY_EASY,
  DIFFICULTY_MEDIUM,
  DIFFICULTY_HARD
} difficulties;

struct {
  int max_enemies;
  int max_weapons;
} difficulty_settings[] = {
  {10, 4},
  {20, 5},
  {30, 6}
};

また、簡単なレベルの max_enemies など、特定の設定を読み取りたい場合は、次のように記述できます。difficulty_settings[DIFFICULTY_EASY].max_enemies

テーブルを拡張することで、より多くの構成 (より多くのパラメーターまたはより多くの難易度レベル) を簡単に追加できます。

于 2010-05-22T12:17:44.297 に答える
1

私はJavaを知らないので(これはあなたの例がどのように見えるかです)、簡単なC#でアイデアを提示します。

ここにアイデアがあります。代わりに、ゲーム モードをフラグとして使用してください。次から始める場合:

[Flags]
enum GameModes
{
    Unknown = 0,
    ModeA = 1,
    ModeB = 2,
    ModeC = 4,
}

これで、レベル 1 ~ 7 が利用可能になりました。

GameModes Difficulty = GameModes.ModeA | GameModes.ModeB;    // difficulty = 3
GameModes Difficulty = GameModes.ModeB;    // difficulty = 2

さらに、示したいずれの方法でも、レベル (モード) の変更、追加などのオプションを追加する必要があります。モード テンプレートを XML (または選択した他のソース) から読み込み、モード データをシリアライズ可能な形式に保存します。クラス。基本クラスを何かで拡張する必要はないと思います。

于 2010-05-22T12:02:00.487 に答える
1

ここでの最も重要な目標は、さまざまなレベルに関連する値を取得するためのロジックを一元化することです。これらの値を保存する場所を 1 つ指定することで、別のレベルを追加したり、他の値を追加したりする場合に変更する必要があるコード内の場所の数を最小限に抑えることができます。

クラス インターフェイスは、このソリューションに適しています。ただし、クラスによって表される構成オプションの数が限られている場合は、継承を使用する必要はありません。ロジックをカプセル化する単一のクラスから始めることができます。コードの残りの部分がクラス インターフェイスを介して設定を取得する場合、必要に応じて、ゲームの残りの部分への限定的な変更が必要になった場合に、各モードのサブクラスなど、より複雑な設計を後で導入できます。

たとえば、最初の実装は次のようになります。

enum mode {
    MODE_EASY = 0,
    MODE_NORMAL = 1,
    MODE_DIFFICULT = 2,
};

class gameSettings {
    public gameSettings(mode GameMode) {
        m_mode = GameMode;
    }

    public int getMaxWeaponNumber() {
        int maxWeaponNumber;
        switch(m_mode) {
            case EASY_MODE:
                maxWeaponNumber = 100;
                break;

            // Other mode settings.               
         }

         return maxWeaponNumber;
    }

    // Other game settings....

    private mode m_mode;

}

これにより、switch() ステートメントの単純さとクラス インターフェイスの利点が組み合わされます。別のポスターで提案されているように、switch() ステートメントをルックアップ テーブル、またはアプリケーションに適した他のメカニズムと交換することもできます。

于 2010-05-22T13:46:33.583 に答える
0

GameMode クラスのコンストラクターでスイッチ アプローチを使用します。

于 2010-05-22T11:53:29.443 に答える
0

いくつかの構文の問題に加えて、あなたは正しい方向に進んでいると思います。おそらく一度に 1 つのモードしかないことを考えると、メモリについて心配する必要はないと思います。これは戦略パターンの一形態です。モードがより多くのことを行うように拡張できます。たとえば、基本的に定数を保持するだけでなく、実際に敵のセットまたはリストを作成する generateEnemies メソッドが存在する可能性があります。これにより、より多くの戦略がモード オブジェクトに移動します。スーパークラスの適切なデフォルトは、冗長なコードを避けるのに役立ちます。

于 2010-05-22T11:53:46.473 に答える
0

他のクラスに関する情報が少なすぎるため、ここでどのようなリファクタリングを行うことができるかを判断するのは困難です。ただし、さまざまな状態オブジェクトにさまざまな動作をカプセル化するState パターンを確認できます。基本の GameMode クラスを拡張するアプローチは、状態パターンに非常に似ています。switch-case-block よりも優れていると思います...そしてパターンは、うまく適用されれば、物事を行うための信頼できる方法です。

于 2010-05-22T11:55:19.543 に答える
0

スイッチの維持が難しいのはなぜだと思いますか? 別のモードを追加する場合は、採用するソリューションに関係なく、コードを追加する必要があります。

別のモードを追加する場合にコードを追加する必要がない唯一のケースは、 の値からゲームのパラメーターを生成する場合ですgameMode

例えば:maxenemy = 5 * gameMode;

スイッチを実行するための非常に複雑な初期化がない限り、十分すぎると思います。オブジェクトとクラスは素晴らしいものですが、いくつかの var を定義するだけで問題なく機能する場合、複雑なゲームモード クラスの開発に時間を費やすことは、結局のところ、やりがいのある解決策ではないかもしれません (私はつまり、いくつのゲームモードを追加する予定ですか?)

于 2010-05-22T12:25:22.233 に答える
0

戦略パターンを活用してください。

Java 用語では、次のようになります。

public interface Strategy {
    void execute();
}

public class SomeStrategy implements Strategy {
    public void execute() {
        System.out.println("Some logic.");
    }
}

次のように使用します。

Map<String, Strategy> strategies = new HashMap<String, Strategy>();
strategies.put("strategyName1", new SomeStrategy1());
strategies.put("strategyName2", new SomeStrategy2());
strategies.put("strategyName3", new SomeStrategy3());

// ...

strategies.get(s).execute();
于 2010-05-22T12:36:09.013 に答える