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

时间:2009-08-07 00:06:56

标签: data-structures language-agnostic

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

董事会看起来像这样:

    &
   & &
 &  &  &
*  *  *  *
 $  $  $
  $  $
    $

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

5 个答案:

答案 0 :(得分:11)

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

M A A A
B M A A
B B M A
B B B M

如果是这样,可能只是使用2D阵列,并使用您的显示系统将其“变成”钻石。

修改

我认为你可以将移动设置映射到数组 - 如果你的'$'部分只是向上或向左或向上移动,这类似于我的'B'部分只移动'向上'或'对'。相似,如果'&'碎片只能向下或向左或向右移动,就像“A”碎片只向下移动或向左移动。

这个想法是,在程序内部,“向上和向下”看你的数据,但当你向用户展示你的游戏状态时,只需在菱形配置中绘制。 / p>

答案 1 :(得分:4)

您关心的不仅仅是如何代表董事会,还有如何代表董事会,因为董事会和董事会需要传达他们的共同存在和影响。

因此,您如何代表您的董事会将取决于您如何代表您的棋子以及限制棋盘和棋子的游戏规则。

您首先要关注的是如何表现这些作品。

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

让我通过分配公共,静态等声明来说明

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
 }
}

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

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

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

如果以电路板为中心,您需要搜索电路板的每个位置以找到一个位置。

对于冗余,您必须确保板和板块注册的位置不会错位。如果您计划允许您的游戏通过互联网播放,会话可以暂停和休眠 - 您可能会面临同步方面的挑战。

因此,您的问题的答案是 - 用于表示电路板的散列矢量。

散列矢量是一个带有两个检修门的集合 - 一个通过位置访问,第二个通过密钥访问。您的散列矢量将允许您访问

  • 董事会按职位查明职位是什么单位
  • 该片的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)

同样,找出单位的(x,y)位置。

Position getUnit(BasicUnit unit)

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

您只需在矢量中插入更多位置。

您可以在以下位置查看我的Java实现的一维散列矢量 http://code.google.com/p/synthfuljava/wiki/HashVector

将其翻译为您选择的编程语言,并为其添加一个矢量维度。

答案 2 :(得分:1)

中间四个区域的两棵树是一样的? (我的意思是引用相同的对象)

答案 3 :(得分:0)

我会使用一种图表。像:

class Field
{
     private List<Field> neighbours;
}

或者不是列表,而是包含边框字段的空引用的数组。任何董事会都可以用这个代表。

答案 4 :(得分:0)

为什么不使用简单的数组结构?如果电路板是菱形的,那就是方形/矩形,对吧?

Dim myBoard(5,5) As Array

当然,如果电路板形状奇特,(如中间有空格和东西),这可能不起作用。