作为我的C ++模块的作业,我必须构建一个文本冒险游戏。我面临的问题是一个概念问题;每个人都说我应该使用树数据结构来表示我的游戏。我没有得到的是为什么。
假设我有4个房间的房子。我们可以把它想象成一个2x2阵列。在每个房间里我都有两个物体。我希望以这样一种方式显示这些数据:我可以轻松地将我的角色从0x0移动到0x1(直接 - 一步,或间接 - 三步),同时携带一个对象。
为什么使用树来保存所有数据以及我的角色将如何从一个节点移动到另一个节点更好?或者角色也是节点?我的角色不应该是列表作为其库存的对象吗?
我对此有点困惑。我不是在寻找任何代码,只是更好地理解数据表示和操作。
建议是地图。但是我不明白我的角色将如何“导航”地图。
答案 0 :(得分:10)
如果你的“房子”是一个网格,你可以从任何网格单元格移动到任何其他网格单元格,阵列就可以了。我猜你的同行所暗示的是你可能不希望能够从任何房间移动到任何相邻的房间(并且也无法从0,0移动到42,13)。
但是,对于树形结构,您仍然无法表示房间之间的任意一组过渡。
更灵活的方法是Adjacency List,这是graph的特殊类型。将每个房间视为一个节点,并为每个节点提供可以转换到的其他房间的列表。通过这种结构,您甚至可以允许单向转换(想想许多冒险游戏中的单向门)。
伪代码
class Room
{
string Name;
string Description
List<Room> ConnectedRooms;
}
然后表示角色
class Character
{
string Name;
Room CurrentRoom;
}
要查看给定角色能够移动到的位置:
List<Room> availableRooms = myCharacter.CurrentRoom.ConnectedRooms;
答案 1 :(得分:9)
您要找的不是树,而是图表。
最好的原因是“地方”数组并不一定代表你想要的东西。所有相邻房间之间不一定有门,因此您可能无法直接从一个房间到另一个房间。在当时,在一个典型的文字冒险类型的游戏中,你可能有一些走廊(或其他),或多或少直接从一个房间到另一个房间,而不是相邻(甚至接近)。此外,您可能会有单向通道,将您从一个地方带到另一个地方,但您无法转身并返回。所有这些都很容易用有向图表示,但很难用数组表示。
答案 2 :(得分:0)
我认为树是更好的选择,因为除了房间本身之外,你想要表示房间之间可能的状态转换。
将其视为图形:状态是房间,但特定事件将触发从一个到另一个的转换。它表达了一个事实,即用户不能随便从一个州到另一个州。
考虑有限自动机和状态机。