0

所以我试图创建一个基于文本的游戏,它的用户界面(而不是真正的基于文本的解析和所有有趣的东西)基本上是一个角色扮演游戏。为此,游戏有许多可能发生的不同事件(但不能保证会发生,也不能以任何整体顺序发生),我想知道最有效的编码方式。

目前,我的想法是创建一个名为 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

这看起来像是观察者模式的经典示例。

您需要创建将保存游戏状态的类,如果状态发生变化,它将通知所有订阅者。

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. 你可以在这里阅读它们: 解释动作

此外,有关事件的更多信息: C# 中的事件

于 2013-03-10T09:20:08.210 回答