我是相对新手的游戏开发者,所以我决定从头开始创建一个业余项目,以获取经验和娱乐。具体的游戏类似于扑克,称为Three Card Brag。这个游戏在电影《大阴谋》中出现过。
我一直在阅读有关游戏开发的一些主题,尤其是this question。这有助于改进我最初创建对象的方式。
我遇到的一个特别问题是定义游戏状态。我的最初方法是将所有内容分开(例如,在
现在我非常强烈地感到这违背了面向对象编程的宗旨,因为与玩家相关的数据(在本例中是筹码堆、手牌和当前状态)没有被封装在
另一方面,如果一个玩家要加注,我将创建一个实现
基本上,我的问题是:我能否在保留给定对象内所有与游戏状态特定相关的数据的同时拥有游戏状态的精确表示?
我一直在阅读有关游戏开发的一些主题,尤其是this question。这有助于改进我最初创建对象的方式。
我遇到的一个特别问题是定义游戏状态。我的最初方法是将所有内容分开(例如,在
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
对象中。另一方面,如果一个玩家要加注,我将创建一个实现
IAction
的RaiseAction
,但是IAction
接口只接受当前游戏状态,如果筹码堆存储在Player
类中,我认为这并不理想。基本上,我的问题是:我能否在保留给定对象内所有与游戏状态特定相关的数据的同时拥有游戏状态的精确表示?