如何在C#中基于文本的游戏中编写游戏事件

时间:2013-03-10 09:05:56

标签: c#

因此,我正在尝试使用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)轻松保存并从保存文件加载值。

真的是最好的方法吗?我是第一个承认我能够提出......“创造性”的方法,这些方法对于解决问题并不是那么有用。真的很感激第二意见。提前谢谢。

1 个答案:

答案 0 :(得分:3)

这看起来像是Observer pattern的经典示例。

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

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混淆。你可以在这里阅读它们: Explaining action

此外,还有一些关于事件的信息: Events in C#