c++ - 为什么要用树状数据结构来表示文字冒险游戏中的数据?

标签 c++ data-structures graph tree

作为我的 C++ 模块的作业,我必须构建一个文字冒险游戏。我面临的问题是概念性的;每个人都在说我应该使用树数据结构来表示我的游戏。我不明白的是为什么

假设我有一栋有 4 个房间的房子。我们可以将其想象成一个 2x2 数组。在每个房间里我都有两个对象。我想以这样一种方式显示这些数据,即我可以轻松地将我的角色从 0x0 移动到 0x1(直接 – 1 步,或间接 – 3 步),同时随身携带一个物体。

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

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

建议是针对 map 。但后来我也不明白我的角色将如何“导航” map 。

最佳答案

如果您的“房子”是一个网格,并且您可以从任何网格单元移动到任何其他网格单元,那么数组就可以了。我猜你的同龄人在暗示你可能不希望能够从任何房间移动到任何相邻的房间(并且也不能从 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;

关于c++ - 为什么要用树状数据结构来表示文字冒险游戏中的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9657012/

相关文章:

algorithm - 两条边相连的最小生成树

c++ - 用于 ip-camera 的 DirectShow 过滤器

c++ - 使用一个 stringstream 函数参数接受多种类型

c++ - 在 VSCode 上使用 F5 调试失败,提示 "Unable to establish a connection to GDB"

c++ - QNetworkAccessManager 析构函数是否中止当前请求?

list - 存储多重集/无序列表的节省空间的方法

c - 使用 fgets 读取 .CSV 文件

java - 未加权无向图中的最长路径

algorithm - 使用不相交集数据结构,图论

c++ - 是否有适用于 C++ 的 'out-of-the-box' 2D/3D 绘图库?