【发布时间】:2009-03-03 03:36:07
【问题描述】:
我对游戏开发比较陌生,所以我决定从头开始创建一个爱好项目,既可以体验又可以娱乐。具体游戏类似于扑克牌Three Card Brag。该游戏在电影 Lock, Stock 和 Two Smoking Barrels 中进行。
我一直在阅读一些关于游戏开发的 SO 主题,但主要是 this question。这有助于改进我创建对象的原始方式。
我遇到的一个特殊问题是定义游戏状态。我最初的方法是将所有内容分开(例如,将筹码堆放在Player 类中),但在阅读了我之前提到的question 的回复之后,似乎游戏的所有可能状态都应该保持在@987654325 中@ 目的。我想出的基本上是这样的:
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 类中,那将是理想的。
基本上,我的问题是:我是否可以两全其美,这样我就可以准确表示游戏状态,同时将所有与游戏状态中的对象特别相关的数据保存在给定对象中?
【问题讨论】:
-
嗨,约翰,我刚刚回顾了这个问题,并意识到您还可以通过使用访问者模式将 IAction.Apply 替换为 IState.Apply 来获得两全其美的效果。现在可能为时已晚,但无论如何它可能会作为未来的参考。
标签: c# .net design-patterns playing-cards