数据结构在游戏地图中的选择:List vs. Dictionary

92 阅读3分钟

在开发一款游戏的过程中,需要存储游戏地图数据。当前使用的是一个二维列表,每个元素代表地图上的一块瓷砖。在将代码用于其他用途时,开发者考虑是否应该使用字典来存储地图数据,或者继续使用列表。在列表中,索引表示地图的 x 和 y 坐标,而在字典中,(x, y) 元组将成为字典的键。

开发者提出这个问题的原因是,地图很少发生变化,因此数据是相当静态的。并且据了解,字典在相当恒定的查找操作中比列表更快。使用字典还应该 упростить 遍历地图以绘制地图。开发者认为使用字典将 упростить 访问数据,尽管他并不确定在所有情况下都会如此。

这些好处是否值得字典可能占用的额外内存?或者我对这些好处甚至是对的吗?

2、解决方案

  • 不要过早优化

回答者警告不要过早优化。当前方法是否具有不可接受的性能?你所使用的数据结构是否使推理或编写代码变得更加困难?

如果没有需要解决的特定问题,而且当前架构无法解决,那么最好不要改变它。

  • 性能测试

回答者建议进行性能测试以确定字典是否确实比列表更快。可以编写一个脚本或程序来生成不同大小的地图,使用列表和字典存储数据,然后测量每次操作所需的时间。

  • 考虑内存消耗

字典比列表消耗更多的内存,因此在对内存有限的设备(如移动设备)进行开发时,这一点很重要。如果内存消耗是一个问题,那么可以使用稀疏数组或其他表示方法。

  • 考虑代码的可读性和可维护性

字典可能比列表更难阅读和维护,因为它们使用键值对存储数据。这可能会使查找和更新数据更加困难,尤其是对于大型或复杂的地图。

  • 权衡利弊

在决定使用列表还是字典之前,需要权衡使用列表和字典的利弊。对于一些应用程序,列表可能是一个更好的选择,而对于其他应用程序,字典可能是一个更好的选择。

以下是列表和字典用于存储游戏地图数据的优缺点总结:

列表

  • 优点:
    • 简单易用
    • 随机访问
    • 内存消耗较少
  • 缺点:
    • 查找和更新数据可能很慢
    • 遍历地图可能很困难

字典

  • 优点:
    • 查找和更新数据很快
    • 遍历地图很容易
  • 缺点:
    • 比列表更难阅读和维护
    • 内存消耗更多

代码例子

列表

map = [
    [0, 1, 2],
    [3, 4, 5],
    [6, 7, 8]
]

# 访问元素
print(map[1][2])  # 输出:5

# 遍历地图
for row in map:
    for col in row:
        print(col)  # 输出:0 1 2 3 4 5 6 7 8

字典

map = {
    (0, 0): 0,
    (0, 1): 1,
    (0, 2): 2,
    (1, 0): 3,
    (1, 1): 4,
    (1, 2): 5,
    (2, 0): 6,
    (2, 1): 7,
    (2, 2): 8
}

# 访问元素
print(map[(1, 2)])  # 输出:5

# 遍历地图
for key, value in map.items():
    print(key, value)  # 输出:(0, 0) 0 (0, 1) 1 (0, 2) 2 (1, 0) 3 (1, 1) 4 (1, 2) 5 (2, 0) 6 (2, 1) 7 (2, 2) 8