代表游戏板的最佳数据结构

Dav*_*ard 6 language-agnostic data-structures

我正在尝试将棋盘游戏带到计算机世界,棋盘由16个空间组成,每侧6个,中间4个.该板是菱形的,两端代表团队基础.在游戏中,peices只向敌人的基地移动(当然还有特殊的能力).所以这是我的问题:你认为什么是代表游戏板的最佳数据结构?第一件事来到我的心灵是一棵树,但我真的不喜欢这个主意,因为会有两个"根".有什么建议吗?

董事会看起来像这样:

    &
   & &
 &  &  &
*  *  *  *
 $  $  $
  $  $
    $
Run Code Online (Sandbox Code Playgroud)

所以&团队只能走向$ team,反之亦然,*处于中立区域

Jus*_*eff 11

它本质上是一个正方形吗?钻石的形状只是解释的问题?像这样......

M A A A
B M A A
B B M A
B B B M
Run Code Online (Sandbox Code Playgroud)

如果是这样,也许只需使用2D阵列,并使用您的显示系统将其"变成"钻石.

编辑

我认为你可以将你的移动设置映射到数组 - 如果你的'$'部分只是向上或向左或向上移动,那就像我的'B'部分只移动'向上'或'向右' .类似地,如果'&'件仅向下或向左或向右移动,那就像'A'件仅向下或向左移动.

这个想法是,在程序内部,你可以"上下"地看待你的数据,但是当你向用户展示你的游戏状态时,只需在钻石配置中绘制它.

  • 2D阵列绝对是最佳选择.它不仅是一种快速方便的结构,而且运动规则应该易于编码.把事情简单化! (2认同)

Ble*_*eek 5

您关心的不仅是如何表示棋盘,还包括如何表示棋子,因为棋盘和棋子需要传达它们的相互存在和效果。

因此,你如何代表你的棋盘将取决于你如何代表你的棋子以及约束棋盘和棋子的游戏规则。

您首先关心的是如何表示这些碎片。

游戏块或游戏自动机是面向对象编程的完美模型。

让我通过放弃诸如 public、static 等声明来进行说明。

abstract class BasicUnit
{
 // determine constraints of movement here.
 // update position and return new position
 abstract Position move(Direction d);

 abstract Position getPosition();
 Arsenal arsenal;
}

class Worker
extends BasicUnit
{
 Position move(Direct d)
 {
  //whateveer, etc
 }
}

class farmer
extends Worker
{
 Position move(Direct d)
 {
  //whateveer, etc
 }
}

class Warrior
extends BasicUnit
{
 Position move(Direct d)
 {
  //whateveer, etc
 }
}

class Sniper
extends Warrior
{
 Position move(Direct d)
 {
  //whateveer, etc
 }
}
Run Code Online (Sandbox Code Playgroud)

现在你必须决定棋盘上棋子的位置是否是

  • 以棋盘为中心:棋子的位置仅记录在棋盘上
  • 以件为中心:位置仅在件上注册
  • 冗余:当棋子移动时,您必须冗余地更新棋子和棋盘。

对于大多数棋盘游戏来说,以棋子为中心并不是一个好主意,因为您必须搜索每个棋子以确定位置是否被占用。

如果以棋盘为中心,则需要搜索棋盘的每个位置以找到棋子的位置。

对于冗余,您必须确保棋盘和棋子注册的位置没有错位。如果您打算允许您的游戏通过互联网进行,会话可以暂停和休眠 - 您可能会面临同步方面的挑战。

所以,你的问题的答案是 - 一个代表棋盘的散列向量。

哈希向量是具有两个访问门的集合 - 一个通过位置访问,第二个通过密钥访问。您的散列向量将允许您访问

  • 按位置查看棋盘,找出某个位置上有哪些单位
  • 棋子的 ID,以找出它在棋盘上的位置。

除非您的棋盘游戏是多维棋盘游戏,否则您不能将棋盘表示为树。当你有树、梯子或城堡位于棋盘位置时,就需要一棵树,这样当一个单位到达棋盘的水平位置时,它需要前进到梯子或城堡的垂直位置。在城堡中,该单元需要转移到许多房间。或者树上有一个女巫,能够将单位捕获到瓶子中,并提供令人困惑的逃生路径。因此,使用树结构来表示棋盘会给游戏编程带来不必要的复杂性。

不管是正方形、菱形还是圆形等,你只需要枚举棋盘的位置即可。枚举的方法必须方便您的规则捕获。

这意味着,您不应该将一个片段枚举为 (1,3),然后将其相邻片段枚举为 (2,7) - 这只是常识。因为 (1,3) 的邻居是 (0,2), (1,2), (2,2), (0,3), (2,3), (0,4), (1,4 ) 和 (2,4) 但不是 (2,7)。

因此,您需要一个二维哈希向量。

为了满足您查找板的 x,y 位置上的单位的需要:

BasicUnit getPosition(x,y)
Run Code Online (Sandbox Code Playgroud)

以及找出单元的 (x,y) 位置。

Position getUnit(BasicUnit unit)
Run Code Online (Sandbox Code Playgroud)

然后,您可能会计划您的游戏是可扩展的,以便获得胜利的玩家可以继续玩具有不同棋盘形状的下一个级别。您的二维散列向量仍将被使用,因为您将软件的表示层与其数据结构分开。

您只需在向量中插入更多位置即可。

您可以在http://code.google.com/p/synthfuljava/wiki/HashVector查看我的一维哈希向量的 Java 实现

将其转换为您选择的编程语言,并为其添加一个向量维度。