摘要
本文介绍了两种用于表示图结构的数据结构:邻接矩阵和邻接表,并探讨了它们在游戏开发中的应用。邻接矩阵通过二维数组表示节点之间的关系,适合节点少、关系密集的场景,如小型地图或全员对战关系。邻接表则通过链表或数组记录每个节点的邻居,适合节点多、关系稀疏的场景,如大型开放世界地图或社交网络。文章还通过代码示例展示了如何用这两种数据结构实现迷宫寻路功能,并总结了它们的优缺点及适用场景。开发者可以根据具体需求选择合适的数据结构来优化游戏性能。
1. 邻接矩阵(Adjacency Matrix)
形象解释
邻接矩阵就像一张“关系表”大表格:
- 假设有5个小伙伴,每个人都在表格的行和列上有一个名字。
- 如果小明和小红是朋友,就在“小明”那行“小红”那列打个“√”。
- 这样,表格的每个格子都能告诉你两个人之间有没有关系。
举例:
小明 | 小红 | 小刚 | 小丽 | 小强 | |
---|---|---|---|---|---|
小明 | 0 | 1 | 1 | 0 | 0 |
小红 | 1 | 0 | 0 | 1 | 0 |
小刚 | 1 | 0 | 0 | 1 | 1 |
小丽 | 0 | 1 | 1 | 0 | 0 |
小强 | 0 | 0 | 1 | 0 | 0 |
- 1表示有关系(比如是朋友),0表示没关系。
游戏中的实际应用
- 小型地图的路径规划:比如战棋游戏、迷宫游戏,地图格子不多时,用邻接矩阵存储格子之间是否能走。
- 全员对战关系:如大乱斗,每个人都能攻击每个人,关系密集时用邻接矩阵查找快。
- 小型社交关系:比如一个小型公会,成员之间的好友关系。
优点:查找两点是否有关系非常快(O(1)),适合点数不多、关系密集的场景。
缺点:点多时很占空间(n²),不适合大规模稀疏关系。
2. 邻接表(Adjacency List)
形象解释
邻接表就像每个人有一个“好友名单”:
- 每个人手里有一张纸,纸上只写着自己的朋友名字。
- 比如小明的名单上写着“小红、小刚”,小红的名单上写着“小明、小丽”。
- 这样,只有有关系的人才会被记录下来,没关系的就不写。
举例:
- 小明:[小红, 小刚]
- 小红:[小明, 小丽]
- 小刚:[小明, 小丽, 小强]
- 小丽:[小红, 小刚]
- 小强:[小刚]
游戏中的实际应用
- 大型开放世界地图:如《塞尔达传说:旷野之息》,地图很大但每个地点只和少数地点相连,用邻接表节省空间。
- 任务依赖关系:每个任务只记录自己能解锁的后续任务。
- 社交网络:大型游戏的好友系统,每个玩家只记录自己的好友列表。
- 技能树/剧情树:每个技能/剧情节点只记录自己的后续节点。
优点:节省空间,适合点多、关系稀疏的场景。
缺点:查找某两点是否有关系时需要遍历(O(度数)),但一般够快。
3. 对比总结
表示方式 | 形象比喻 | 适用场景 | 游戏应用举例 |
---|---|---|---|
邻接矩阵 | 关系大表格 | 点少、关系密集 | 小型地图、全员混战、社交关系 |
邻接表 | 好友名单 | 点多、关系稀疏 | 大地图、任务依赖、好友系统 |
4. 代码小示例
邻接矩阵
# 5个点的邻接矩阵
matrix = [
[0,1,1,0,0],
[1,0,0,1,0],
[1,0,0,1,