我对游戏开发还比较陌生,所以我决定从头开始创建一个爱好项目,既可以体验又可以娱乐。特定的游戏类似于被称为三张牌吹牛的扑克。该游戏在电影Lock, Stock 和 Two Smoking Barrels中播放。
我一直在阅读一些关于游戏开发的 SO 主题,尽管主要是这个问题。这有助于改进我创建对象的原始方式。
我遇到的一个特殊问题是定义游戏状态。我最初的方法是将所有内容分开(例如将筹码堆放在一个Player
类中),但是在阅读了对我之前提到的问题的回答之后,似乎游戏的所有可能状态都应该在一个GameState
对象中维护。我想出的基本上是这样的:
abstract class CardGameState
{
protected List<Player> _Players;
protected Player _CurrentPlayer;
protected Dictionary<Player, int> _Chips;
protected Dictionary<Player, Hand> _CurrentHand;
protected Dictionary<Player, PlayerStatuses> _PlayerStatus; // PlayerStatuses.InHand, PlayerStatuses.Folded, PlayerStatuses.SittingOut, etc.
/* etc. */
其中每个CardGameState
都通过一些操作进行修改:
public interface IAction
{
string Name { get; }
CardGameState Apply(CardGameState state);
bool IsLegal(CardGameState state);
}
现在我强烈地感觉到这违背了面向对象编程的目的,因为与玩家相关的数据(在这种情况下,是他的筹码堆、手牌和当前状态)没有被Player
对象封装。
另一方面,如果玩家加注,我将创建一个RaiseAction
that implements IAction
,但接口只接受当前游戏状态,如果筹码堆存储在类IAction
中,我认为这不是理想的Player
.
基本上,我的问题是:我是否可以两全其美,这样我就可以准确表示游戏状态,同时将所有与游戏状态中的对象特别相关的数据保存在给定对象中?