0

だから私は、UI を備えたテキストベースのようなゲームを作成しようとしています (解析とすべての楽しいものを備えた真のテキストベースとは対照的に)、これは基本的に RPG です。この目的のために、ゲームには発生する可能性のあるさまざまなイベントがたくさんあります (ただし、発生することは保証されておらず、全体的な順序で発生することもありません)。これをコーディングする最も効率的な方法を考えています。

現時点では、GameState と呼ばれる静的クラスを作成することを考えています。このクラスには、他の情報が含まれるほか、その中に配列と列挙型が含まれます。配列は、会話または複数オプションのイベントの選択のために、おそらくバイトになります。0 はイベントが発生していないことを示し、数値 1 - X は、可能な X の中からどのオプションが選択されたかを表します。このようなもの:

public enum GameEvents{
                       Event 1,
                       Event 2,
                       Event 3 };

public static byte[] GameEventStates = new byte[Enum.GetNames(typeof(GameEvents)).Length];

イベントなどで、次のような行を実行できるようになります。

if(GameState.GameEventStates[GameState.GameEvents.Event2] == 1)
{
  Stuff Here;
}

また

GameState.GameEventStates[GameState.GameEvents.Event4] = 1;

(注: 厳密に「見たことがある」イベントの場合、見たことがない場合は 0、見たことがある場合は 1 になります)。

ただし、これの一部は強制されているように感じますが、私には思いつかないよりエレガントな方法があるようです。それがどうなるかはわかりませんが、それでも私は

A) イベントが発生したときに値を変更するためにグローバルにアクセスし、それらの発生をチェックできるようにする。

B) 時間の経過とともにゲームのコンテンツが拡大するにつれて、より多くのイベントを簡単に追加できます。

C) 保存ファイルとの間で値を簡単に保存およびロードします。

これは本当にこれを行うための最良の方法ですか?私が思いつくことができることを認めたのは私が初めてです...「創造的な」方法は、問題を解決するのにはあまり適していません。セカンドオピニオンをいただければ幸いです。前もって感謝します。

4

1 に答える 1

3

これはObserver パターンの古典的な例のように見えます。

ゲームの状態を保持するクラスを作成する必要があります。状態が変化すると、すべてのサブスクライバーに通知されます。

public class GameStateManager 
{
 public GameStateFileReader fileReader = new GameStateFileReader() //this class can read gamestate to file, and save it back 

 public void SaveState() {//save using fileReader}
 public void LoadState() {//load}

 public event Action<GameEvents> StateChanged;

}

Game クラスは StateChanged イベントをサブスクライブできます。

 gameStateManager.StateChanged += OnStateChanged;
 //....
 public void OnStateChanged(GameEvents event)
  {
     //react on new game state
  }

一部のゲーム エージェントはゲームの状態を変更できます (たとえば、ユーザーが怒っているボスにドアを開けたなど)。そのため、GameStateManager はゲームの状態を変更する方法を提供する必要があります。

public void SetNewState (GameEvents newEvent) 
  {
     //Save new state to some Property
     //...

     //and notify everybody about new state
     if(StateChanged != null)
     {
        StateChanged(newEvent);
     }
   }

ゲームの状態が誰かによって変更されたことをクラスが知りたい場合は、このイベントにもサブスクライブする必要があります。

と混同したくなかったAction。ここでそれらについて読むことができます: アクションの説明

また、イベントに関する詳細情報: Events in C#

于 2013-03-10T09:20:08.210 に答える