我对游戏开发比较陌生,所以决定从头开始为体验和娱乐创建一个业余爱好项目。具体游戏类似于Three Card Brag扑克。本场比赛在电影锁,股票和两个吸烟桶。多人纸牌游戏的游戏体系结构和设计策略
我一直在阅读关于游戏开发的一些主题,但主要是this question。这有助于改变我创建对象的原始方式。
我遇到的一个特殊问题是定义游戏状态。我最初的做法是把所有东西都分开(例如把筹码堆放在一个Player
类中),但是在阅读了我之前提到的question的回复之后,似乎所有可能的游戏状态都应该保持在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
实现IAction
,但IAction
接口只接受当前的游戏状态,我认为这是不理想的,如果芯片堆栈被存储在Player
类中。基本上,我的问题是:我能否拥有两全其美的世界,让我可以精确地表示游戏状态,同时保持与给定对象内的游戏状态内的对象有关的所有数据?
嘿,约翰,我只是在回顾这个问题,并意识到你也可以通过使用访问者模式替换IAction.Apply并使用访问者模式来获得两全其美的好处。现在可能太晚了,但无论如何它可能会作为未来的参考。 – 2009-05-19 03:25:40