我对游戏开发相对较新,因此我决定从零开始创建一个业余项目,以获得经验和娱乐。具体的游戏类似于扑克,称为 三张牌。这个游戏在电影《抢钱夺宝》中出现过。
我一直在阅读有关游戏开发的一些主题,尤其是这个问题。 这有助于重构我最初创建对象的方法。
我遇到的一个特定问题是定义游戏状态。我的初始方法是分离一切(例如将筹码堆放在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类中的筹码堆栈理想的解决方案。
我的问题其实是:我能否两全其美,即在保持游戏状态的精确表示的同时,将所有与游戏状态中的特定对象相关的数据都保存在其给定对象内?