Data structures 表示游戏板的最佳数据结构 我试图把一个棋盘游戏带到电脑世界,棋盘由16个空间组成,每边6个,中间4个。棋盘呈菱形,两端代表两个团队基地。在游戏中,peices只向前移动到敌人的基地(当然有特殊能力)。所以我的问题是:你认为代表游戏板的最佳数据结构是什么?我首先想到的是一棵树,但我真的不喜欢这个想法,因为它有两个“根”。有什么建议吗

Data structures 表示游戏板的最佳数据结构 我试图把一个棋盘游戏带到电脑世界,棋盘由16个空间组成,每边6个,中间4个。棋盘呈菱形,两端代表两个团队基地。在游戏中,peices只向前移动到敌人的基地(当然有特殊能力)。所以我的问题是:你认为代表游戏板的最佳数据结构是什么?我首先想到的是一棵树,但我真的不喜欢这个想法,因为它有两个“根”。有什么建议吗,data-structures,language-agnostic,Data Structures,Language Agnostic,董事会如下所示: & & & & & & * * * * $ $ $ $ $ $ 所以&team只能向$team移动,反之亦然,*作为中立区域我会使用一种图表。比如: class Field { private List<Field> neighbours; } 类字段 { 私人名单邻居; } 或者不是一个列表,而是一个包含边框字段空引用的数组。任何板都可以用它来表示。它本质

董事会如下所示:

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

所以&team只能向$team移动,反之亦然,*作为中立区域

我会使用一种图表。比如:

class Field
{
     private List<Field> neighbours;
}
类字段
{
私人名单邻居;
}

或者不是一个列表,而是一个包含边框字段空引用的数组。任何板都可以用它来表示。

它本质上是一个正方形吗?菱形只是一个解释问题吗?就像这样

M A A A
B M A A
B B M A
B B B M
如果是这样的话,可以使用2D阵列,并使用您的显示系统将其“转换”为菱形

编辑

我认为你可以将你的移动集映射到数组中——如果你的“$”片段只向上和向左或向上和向右移动,这类似于我的“B”片段只向上或向右移动。同样,如果“&”片段只向下和向左或向下和向右移动,这就像“A”片段只向下或向左移动一样


其思想是,在程序内部,考虑数据的“上下”,但当您向用户呈现游戏状态时,只需在菱形配置中绘制它。

为什么不使用简单的阵列结构?如果棋盘是菱形的,它是方形/矩形的,对吗

Dim myBoard(5,5) As Array

当然,如果棋盘形状奇怪(比如中间有空格和东西),这可能不起作用。

中间四个字段相同的两棵树呢?(我指的是引用相同的对象)

您关心的不仅仅是如何表示电路板,还包括如何表示各个部分,因为电路板和各个部分需要传达它们的相互存在和影响

因此,如何表示棋盘将取决于如何表示棋子以及限制棋盘和棋子的游戏规则

你首先关心的是如何表现作品

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

让我通过省去诸如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
 }
}
现在你必须决定棋盘上棋子的位置是否正确

  • 以板为中心:工件的位置仅在板上登记
  • 以工件为中心:位置仅在工件上注册
  • 冗余:移动工件时,必须冗余更新工件和电路板
对于大多数棋类游戏来说,以棋子为中心不是一个好主意,因为你必须搜索每一个棋子来确定一个位置是否被占据

如果以电路板为中心,则需要搜索电路板的每个位置,以找到工件的位置

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

所以,你的问题的答案是-一个散列向量来代表董事会

散列向量是一个具有两个访问门的集合-一个通过位置访问,另一个通过键访问。您的散列向量允许您访问

  • 董事会按职位划分,以了解职位上的单位
  • 工件的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实现:


把它翻译成你的编程语言,并给它添加一个向量维度。

你能上传一个棋盘的某个地方吗?我不确定我能很好地解释你的描述。它仍然可以工作,只要中间的东西是菱形的,它们可以被表示为空值或类似的东西。正方形,但我使用菱形,因为在正方形的情况下,peices必须斜向另一个角移动,而不是向上或向下,wi