邻接矩阵与邻接表:游戏中的关系管理利器

摘要

本文介绍了两种用于表示图结构的数据结构:邻接矩阵和邻接表,并探讨了它们在游戏开发中的应用。邻接矩阵通过二维数组表示节点之间的关系,适合节点少、关系密集的场景,如小型地图或全员对战关系。邻接表则通过链表或数组记录每个节点的邻居,适合节点多、关系稀疏的场景,如大型开放世界地图或社交网络。文章还通过代码示例展示了如何用这两种数据结构实现迷宫寻路功能,并总结了它们的优缺点及适用场景。开发者可以根据具体需求选择合适的数据结构来优化游戏性能。


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,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你一身傲骨怎能输

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值