为了好玩,我正在尝试将我儿子最喜欢的棋盘游戏之一写成一个软件.最终我希望在它之上构建一个WPF UI,但是现在我正在构建一个模拟游戏及其规则的机器.
当我这样做时,我一直看到许多棋盘游戏常见的问题,也许其他人已经比我更好地解决了这些问题.
(注意AI玩游戏,高性能模式对我来说并不感兴趣.)
到目前为止我的模式是:
代表游戏盒中的实体的几种不可变类型,例如骰子,棋子,卡片,棋盘,棋盘上的空格,金钱等.
每个玩家的一个对象,其中包含玩家资源(例如金钱,分数),他们的名字等.
表示游戏状态的对象:玩家,转向的人,棋盘上的peices布局等.
管理转弯序列的状态机.例如,许多游戏都有一个小的赛前游戏,每个玩家都会看到谁先出现; 这是开始状态.当一个玩家的回合开始时,首先他们滚动,然后他们移动,然后他们必须跳舞到位,然后其他玩家猜测他们是什么品种的鸡,然后他们获得积分.
我可以利用一些现有技术吗?
编辑:我最近意识到的一件事是游戏状态可以分为两类:
游戏神器状态."我有10美元"或"我的左手是蓝色的".
游戏序列状态."我已经两次翻过双打;下一次让我入狱".状态机可能在这里有意义.
编辑:我真正想要的是实现像Chess或Scrabble或Monopoly这样的多人回合制游戏的最佳方式.我确信我可以通过从头开始完成来创建这样的游戏,但是,像其他设计模式一样,可能有一些方法可以让事情变得更加顺利,如果不仔细研究就不会显而易见.这就是我所希望的.
看来这是一个2个月大的线程,我现在才注意到,但是到底是什么.我以前为商业网络棋盘游戏设计和开发了游戏框架.我们有一个非常愉快的经验.
你的游戏可能处于(接近)无限数量的状态,因为玩家A有多少钱,玩家B有多少钱等等的排列......所以,我很确定你想要的远离国家机器.
我们框架背后的想法是将游戏状态表示为结构,所有数据字段在一起,提供完整的游戏状态(即:如果您想将游戏保存到磁盘,则将该结构写出来).
我们使用命令模式来表示玩家可以制作的所有有效游戏动作.这将是一个示例动作:
class RollDice : public Action { public: RollDice(int player); virtual void Apply(GameState& gameState) const; // Apply the action to the gamestate, modifying the gamestate virtual bool IsLegal(const GameState& gameState) const; // Returns true if this is a legal action };
因此,您可以看到,要确定移动是否有效,您可以构造该操作,然后调用其IsLegal函数,传入当前游戏状态.如果它有效,并且玩家确认了该动作,则可以调用Apply功能来实际修改游戏状态.通过确保您的游戏代码只能通过创建和提交合法操作来修改游戏状态(换句话说,Action :: Apply系列方法是唯一直接修改游戏状态的东西),那么您可以确保您的游戏国家永远不会无效.此外,通过使用命令模式,您可以序列化播放器所需的移动并通过网络发送它们以在其他玩家的游戏状态上执行.
最终成为这个系统的一个问题,结果是有一个相当优雅的解决方案.有时行动会有两个或更多阶段.例如,玩家可以登陆Monopoly的财产,现在必须做出新的决定.玩家掷骰子之间,以及决定购买房产之前的游戏状态是什么?我们通过展示游戏状态的"动作上下文"成员来管理这样的情况.动作上下文通常为空,表示游戏当前不处于任何特殊状态.当玩家掷骰子并且骰子滚动动作应用于游戏状态时,它将意识到玩家已经登陆了非拥有的财产,并且可以创建新的"PlayerDecideToPurchaseProperty" 包含我们正在等待决策的玩家的索引的动作上下文.当RollDice动作完成时,我们的游戏状态表示它正在等待指定的玩家决定是否购买房产.现在,除了"BuyProperty"和"PassPropertyPurchaseOpportunity"操作之外,所有其他操作'IsLegal方法都很容易返回false,这些操作仅在游戏状态具有"PlayerDecideToPurchaseProperty"操作上下文时才合法.
通过使用动作上下文,在棋盘游戏的生命周期中从来没有一个点,其中游戏状态结构并不完全完全代表那个时间点游戏中发生的事情.这是您的棋盘游戏系统非常理想的属性.当你通过只检查一个结构找到你想知道的关于游戏中发生的事情的一切时,编写代码会更容易.
此外,它可以很好地扩展到网络环境,客户可以通过网络将其操作提交给主机,主机可以将操作应用到主机的"官方"游戏状态,然后将该操作回送给所有其他客户端.让他们将它应用于他们复制的游戏状态.
我希望这简洁有用.
游戏引擎的基本结构使用状态模式.游戏盒中的物品是各种类型的单件.每个州的结构可以使用策略模式或模板方法.
一个工厂用于创建被插入的球员,另一单名单的球员.GUI将使用Observer模式监视游戏引擎,并使用命令模式创建的几个Command对象之一与之交互.Observer和Command的使用可以在被动视图的上下文中使用但是根据您的偏好,可以使用任何MVP/MVC模式.当你保存游戏时,你需要抓住它当前状态的纪念品
我建议查看本网站上的一些模式,看看他们是否抓住你作为起点.游戏板的核心将再次成为状态机.大多数游戏将由游戏前/设置前的两个州和实际游戏代表.但是如果您正在建模的游戏有几种不同的游戏模式,那么您可以获得更多状态.国家不必是连续的,例如战争游戏Axis&Battles有一个战斗板,玩家可以用它来解决战斗.所以游戏前有三个状态,主板,战斗板与游戏在主板和战斗板之间不断切换.当然,转弯序列也可以由状态机表示.
我刚刚完成了使用多态性设计和实现基于状态的游戏.
使用一个名为的基本抽象类GamePhase
有一个重要的方法
abstract public GamePhase turn();
这意味着每个GamePhase
对象都保持游戏的当前状态,并调用turn()
查看当前状态并返回下一个状态GamePhase
.
每个混凝土GamePhase
都有构建器,可以保持整个游戏状态.每种turn()
方法都有一些游戏规则.虽然这会扩展规则,但它会使相关规则保持紧密.每个的最终结果turn()
只是创建下一个GamePhase
并将完整状态传递到下一个阶段.
这允许turn()
非常灵活.根据您的游戏,给定的州可以分支到许多不同类型的阶段.这形成了所有游戏阶段的图表.
在最高级别,驱动它的代码非常简单:
GamePhase state = ...initial phase while(true) { // read the state, do some ui work state = state.turn(); }
这非常有用,因为我现在可以轻松地创建游戏的任何状态/阶段以进行测试
现在回答你问题的第二部分,这在多人游戏中是如何运作的?在某些GamePhase
需要用户输入的S,从呼叫turn()
会问目前Player
他们Strategy
给出的当前状态/相位. Strategy
只是一个Player
可以做出的所有可能决定的界面.此设置也允许Strategy
使用AI实现!
Andrew Top也说:
你的游戏可能处于(接近)无限数量的状态,因为玩家A有多少钱,玩家B有多少钱等等的排列......所以,我很确定你想要的远离国家机器.
我认为这种说法非常具有误导性,但确实有很多不同的游戏状态,只有少数游戏阶段.为了处理他的例子,它将是我具体GamePhase
的构造函数的整数参数.
一些GamePhase
s的例子是:
GameStarts
PlayerRolls
PlayerLandsOnProperty(FreeParking,GoToJail,Go等)
PlayerTrades
PlayerPurchasesProperty
PlayerPurchasesHouses
PlayerPurchasesHotels
PlayerPaysRent
PlayerBankrupts
(所有机会和公益金卡)
基地的一些州GamePhase
是:
球员名单
现任球员(轮到谁了)
玩家的金钱/财产
房屋/酒店物业
球员位置
然后一些阶段将根据需要记录他们自己的状态,例如PlayerRolls将记录玩家连续掷双打的次数.一旦我们离开PlayerRolls阶段,我们就不再关心连续的滚动了.
许多阶段可以重复使用并链接在一起.例如,GamePhase
CommunityChestAdvanceToGo
将PlayerLandsOnGo
使用当前状态创建下一个阶段并返回它.在PlayerLandsOnGo
当前玩家的构造函数中,将移动到Go,他们的钱将增加200美元.
当然,关于这个主题有很多很多很多很多很多很多资源.但我认为你在正确的道路上划分对象并让它们处理自己的事件/数据等等.
在进行基于平铺的棋盘游戏时,你会发现在棋盘阵列和行/ col之间以及其他功能之间进行映射是很好的.我记得我的第一个棋盘游戏(很久很久以前),当我开始讨论如何从boardarray 5获得row/col时.
1 2 3 4 (5) 6 BoardArray 5 = row 2, col 2 7 8 9
Nostalgy.;)
无论如何,http://www.gamedev.net/是一个获取信息的好地方. http://www.gamedev.net/reference/
我在网上找到的大部分材料都是已发表参考文献的清单.游戏设计模式的出版物部分链接到文章和论文的PDF版本.其中许多看起来像学术论文,如设计模式的游戏.亚马逊至少还有一本书,游戏设计模式.