我是游戏开发的新手,因此我决定要从零开始创建一个爱好项目,以提供体验和娱乐。具体的游戏类似于称为Three Card Brag的扑克。游戏在电影《锁,枪托和两个 pipe 》中播放。
我一直在阅读有关游戏开发的SO的一些主题,尽管主要是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
接口(interface)仅接受当前的游戏状态,我认为如果存储了筹码堆栈,这将不是理想的选择在Player
类中。基本上,我的问题是:我可以同时兼顾两个方面的优点,以便我可以准确地表示游戏状态,同时将与该对象相关的所有数据都保留在游戏状态内的给定对象内吗?
最佳答案
在使用command-pattern(您的IAction)的在线游戏中,这是标准且经过验证的方法。从玩家的角度来看,它不是面向对象的,但是 Action 是面向对象的,因此,我想从纯粹的理论角度来看,它是一种可靠的设计模式。在实践中,这就是我见过的每一个成功的在线游戏都是如何实现的,但是请注意, Action 游戏通常只使用很小的谨慎 Action /数据包,直到实际上变成各种各样的游戏。
编辑:
在回答了很长时间之后,我回到这里,意识到这个问题的另一种解决方案是实现GameState的Players,Deck等...,该实现是从 IState 类派生而来的,该类带有 Apply(IAction action)成员。这样,对象将对自己应用操作,而不是让应用程序对对象应用操作,这会将操作和状态映射到visitor-pattern而不是命令模式。两种解决方案都可以使用,其中访问者具有更大的开销和更多的封装,而命令是使用更少封装的更简单解决方案。
关于c# - 多人纸牌游戏的游戏架构和设计策略,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/605009/