为什么使用树数据结构来表示文本冒险游戏中的数据?

Adr*_*ian 7 c++ tree graph data-structures

作为我的C++模块的一项任务,我必须构建一个文本冒险游戏.我面临的问题是一个概念问题; 每个人都说我应该使用树数据结构来表示我的游戏.我没有得到的是为什么.

假设我有4个房间的房子.我们可以把它想象成一个2x2阵列.在每个房间里我都有两个物体.我希望以这样一种方式显示这些数据:我可以轻松地将我的角色从0x0移动到0x1(直接 - 一步,或间接 - 三步),同时携带一个对象.

为什么使用树来保存所有数据以及我的角色将如何从一个节点移动到另一个节点更好?或者角色也是节点?我的角色不应该是列表作为其库存的对象吗?

我对此有点困惑.我不是在寻找任何代码,只是更好地理解数据表示和操作.

建议是地图.但是我不明白我的角色将如何"导航"地图.

Eri*_* J. 10

如果你的"房子"是一个网格,你可以从任何网格单元格移动到任何其他网格单元格,阵列就可以了.我猜你的同行所暗示的是你可能不希望能够从任何房间移动到任何相邻的房间(并且也无法从0,0移动到42,13).

但是,对于树结构,您仍然无法表示房间之间的任意过渡集.

更灵活的方法是邻接列表,它是一种特殊类型的图形.将每个房间视为一个节点,并为每个节点提供可以转换到的其他房间的列表.通过这种结构,您甚至可以允许单向转换(想想许多冒险游戏中的单向门).

伪代码

class Room
{
    string Name;
    string Description
    List<Room> ConnectedRooms;
}
Run Code Online (Sandbox Code Playgroud)

然后在表示角色时

class Character
{
    string Name;
    Room CurrentRoom;
}
Run Code Online (Sandbox Code Playgroud)

要查看给定角色能够移动到的位置:

List<Room> availableRooms = myCharacter.CurrentRoom.ConnectedRooms;
Run Code Online (Sandbox Code Playgroud)


Jer*_*fin 9

你要找的不是树,而是图.

最好的原因是一系列"地方"并不一定代表你想要的东西.所有相邻房间之间不一定有门,因此您可能无法直接从一个房间到另一个房间.在当时,在一个典型的文字冒险类型的游戏中,你可能有一些走廊(或其他),或多或少直接从一个房间到另一个房间,而不是相邻(甚至接近).此外,您可能会有单向通道,将您从一个地方带到另一个地方,但您无法转身并返回.所有这些都很容易用有向图表示,但很难用数组表示.

  • @Adrian:不 - 你的角色可能有一个"当前位置"成员,它是指向图中节点的指针.如果它是一个多玩家游戏,您可能还希望每个节点都有一个指向当前占用该节点的玩家的指针列表(在这种情况下,遍历节点通常会让玩家在进入时注册新节点,并取消注册在退出). (2认同)