Design patterns 有没有模拟棋盘游戏的图案?

Design patterns 有没有模拟棋盘游戏的图案?,design-patterns,Design Patterns,为了好玩,我试着把我儿子最喜欢的一款棋盘游戏作为一个软件来编写。最终我希望在上面构建一个WPF用户界面,但现在我正在构建一台模拟游戏及其规则的机器 当我这么做的时候,我一直看到我认为在许多棋盘游戏中常见的问题,也许其他人已经比我更好地解决了这些问题 (请注意,我对玩游戏的AI和围绕高性能的模式不感兴趣。) 到目前为止,我的模式是: 代表游戏盒中实体的几种不可变类型,例如骰子、跳棋、卡片、棋盘、棋盘上的空格、货币等 每个玩家的一个对象,包含玩家资源(如金钱、分数)、姓名等 代表游戏状态的对象:玩

为了好玩,我试着把我儿子最喜欢的一款棋盘游戏作为一个软件来编写。最终我希望在上面构建一个WPF用户界面,但现在我正在构建一台模拟游戏及其规则的机器

当我这么做的时候,我一直看到我认为在许多棋盘游戏中常见的问题,也许其他人已经比我更好地解决了这些问题

(请注意,我对玩游戏的AI和围绕高性能的模式不感兴趣。)

到目前为止,我的模式是:

  • 代表游戏盒中实体的几种不可变类型,例如骰子、跳棋、卡片、棋盘、棋盘上的空格、货币等

  • 每个玩家的一个对象,包含玩家资源(如金钱、分数)、姓名等

  • 代表游戏状态的对象:玩家、轮到谁、棋盘上的棋子布局等

  • 管理转弯顺序的状态机。例如,许多游戏都有一个小的赛前游戏,每个玩家都要掷骰子看谁先去;这是开始状态。当一个玩家的回合开始时,首先他们滚动,然后他们移动,然后他们必须在原地跳舞,然后其他玩家猜他们是什么品种的鸡,然后他们得到分数

是否有我可以利用的现有技术

编辑:我最近意识到,游戏状态可以分为两类:

  • 游戏神器状态。“我有10美元”或“我的左手是蓝色的”

  • 游戏序列状态。“我打了两次双打,下一次我就进监狱了。”。在这里,状态机可能是有意义的

编辑:我在这里真正想要的是实现多人回合制游戏(如国际象棋、拼字游戏或垄断游戏)的最佳方式。我相信我可以通过从头到尾的工作来创建这样一个游戏,但是,像其他设计模式一样,可能有一些方法可以让事情进行得更加顺利,如果不仔细研究,这些方法是不明显的。这就是我所希望的

提供LGPL的Java库。Nenya和Vilya是游戏相关资料的库


当然,如果您的问题提到您可能受到的平台和/或语言限制,这会有所帮助。

当然,关于这个主题有很多很多很多很多很多资源。 但是我认为您在正确的道路上划分对象,让它们处理自己的事件/数据等等

在进行基于平铺的棋盘游戏时,你会发现在棋盘阵列和行/列之间以及在其他功能之间映射例程很好。我记得我的第一次棋盘游戏(很久以前),当时我绞尽脑汁研究如何从boardarray 5中获取行/列

1  2  3  
4 (5) 6  BoardArray 5 = row 2, col 2
7  8  9  
占卜术

不管怎样,这是一个很好的信息来源。

游戏引擎的基本结构使用。游戏盒中的物品属于不同类别。每个州的结构可以使用或

A用于创建插入到播放器列表中的播放器,另一个单件。GUI将通过使用来监视游戏引擎,并通过使用创建的多个命令对象之一与之交互。观察器和命令的使用可以在的上下文中使用,但根据您的偏好,几乎可以使用任何MVP/MVC模式。当你保存游戏时,你需要抓取它的当前状态


我建议大家仔细看一下这方面的一些模式,看看是否有任何一种模式能抓住你作为起点。同样,游戏板的核心将是一个状态机。大多数游戏将由两个状态表示:游戏前/设置和实际游戏。但是如果你正在建模的游戏有几种不同的游戏模式,你可以有更多的状态。状态不必是连续的,例如,战争游戏轴和战斗有一个战斗板,玩家可以使用它来解决战斗。所以游戏前有三种状态:主板、战斗板,游戏在主板和战斗板之间不断切换。当然,翻转顺序也可以用状态机来表示。

我刚才注意到这是一个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方法系列是唯一直接修改游戏状态的方法),您就可以确保您的游戏状态永远不会无效。此外,通过使用命令模式,您可以序列化您的玩家所需的移动,并通过网络发送这些移动,以便在其他玩家的游戏状态下执行

这个系统最终被证明有一个相当优雅的解决方案。有时行动会有两个或多个阶段。例如
abstract public GamePhase turn();
GamePhase state = ...initial phase
while(true) {
    // read the state, do some ui work
    state = state.turn();
}
StartPhase();
EndPhase();
Action();
phase = new MovePhase();
phase.StartPhase();
GameState state; //Set in constructor.
Die die;         // Only relevant to the roll phase.
int doublesRemainingBeforeJail;
StartPhase()
{
    die = new Die();
    doublesRemainingBeforeJail = 3;
}

Action()
{
    if(doublesRemainingBeforeJail<=0)
    {
       state.phase = new JailPhase(); // JailPhase::StartPhase(){set moves to 0};            
       state.phase.StartPhase();
       return;
    }

    int die1 = die.Roll();
    int die2 = die.Roll();

    if(die1 == die2)
    {
       --doublesRemainingBeforeJail;
       state.activePlayer.AddMovesRemaining(die1 + die2);
       Action(); //Roll again.
    }

    state.activePlayer.AddMovesRemaining(die1 + die2);
    this.EndPhase(); // Continue to moving phase. Player has X moves remaining.
}
While(movesRemaining>0)
  AdvanceTo(currentTile.nextTile);