【问题标题】:(Python3) Storing a 10x10 game map on a python array(Python3) 在 python 数组上存储 10x10 游戏地图
【发布时间】:2018-10-24 19:30:54
【问题描述】:

如何在 2D python3 数组上存储 10x10(100 单位)游戏地图?

这是我当前的代码:

53    worldMap = [[13, 13, 13, 13, 13, 13, 13, 13, 13, 13], [13, 13, 13, 
                    13, 13, 13, 13, 13, 13, 13]]
236    porq = 0
237 genX = 0
238 genY = 0
239 
240 #world generator
241 while not 13 in worldMap:
242     porq = porq + 1
243     genIncoming = randint(1, 12)
244     worldMap[genX][genY] = genIncoming
245     genX = genX + 1
246     genY = genY + 1
247 print(worldMap)

正在抛出错误:

"Traceback(最近一次调用最后一次): 文件“python”,第 244 行,在 IndexError: 列表索引超出范围"

【问题讨论】:

  • 你能在代码上加上行号吗?回溯说第 244 行,但我们不知道那是哪一部分,因为这只是一个 sn-p。
  • 第 244 行是 worldMap[genX][genY] = genIncoming
  • 我添加了行号
  • 好的,如果你想要一个 tldr,请检查我答案的最后一部分。为您提供了一种简单的方法,无需担心多个 for 循环和其他东西。同样正如在另一个答案中所说,您正在增加列索引和行索引,因此您正在访问对角线中的元素。此外,您的 while 条件是 while not 13 in worldmap 始终为假,因为首先 worldmap 不会改变,其次,它包含 13 的列表列表,而不是数字 13 本身。

标签: python arrays python-3.x 2d


【解决方案1】:

您需要嵌套的两级 for 循环来遍历地图。您所拥有的仅在地图的对角线上生成块,即您正在为(0,0),(1,1),(2,2),...生成地图,这也解释了索引超出范围错误。

试试这个

for genX in range(10):
    for genY in range(10):
        worldMap[genX][genY] = randint(1, 12)

【讨论】:

    【解决方案2】:

    因此,从您当前的问题内容来看,我们无法准确判断您的总体最终目标是什么。我将假设您希望在 Python 中表示 n x n 矩阵,并在其中包含某种数字。我将用数字13 填充此矩阵,您可以根据需要对其进行更改。

    矩阵基本上是行和列,像这样

    13 13 13
    13 13 13
    13 13 13
    

    这是一个3x3 矩阵,有 3 行 3 列。

    我可以用集合的集合(列表的列表、元组的元组、元组的列表等)来表示矩阵,其中每个内部集合代表一行。

    我不会使用你想要的大小的矩阵,因为你需要能够弄清楚,我会选择5x5

    这就是5x5 矩阵在 Python 列表项中的样子

    [[13, 13, 13, 13, 13], [13, 13, 13, 13, 13], [13, 13, 13, 13, 13], [13, 13, 13, 13, 13], [13, 13, 13, 13, 13]]

    为了做到这一点,我可以做一些更短的事情

    [[13 for column in range(5)] for row in range(5)]

    现在,您需要一个矩阵,集合的集合可能有点不必要且速度慢,让我们尝试在 Python 中使用这个名为 numpy 的库。您必须通过 Python 代码或 pip 或其他工具从源代码安装它,查找它。

    假设我有我的旧列表集合,现在我不想使用它,因为它没有必要而且看起来有点混乱。我必须编写自己的代码才能将其正确打印为矩阵,对其进行矩阵运算等。为什么不使用为我包装的东西,例如numpy matrix

    import numpy as np
    
    matrix_of_13s = np.matrix([[13 for column in range(5)] for row in range(5)]])
    

    假设我需要访问第 3 行和第 4 列的元素。在我的集合中,这意味着我需要获取第三行,然后是其中的第四个元素。这转化为

    collection_of_13s[3][4]

    如果我想遍历所有元素,我将使用@thekingofkings 的答案,当然在这种情况下是 5 行和 5 列。

    for row in range(5):
        for column in range(5):
            print(collection_of_13s[row][column])
    

    虽然这可行,但这不是我想要的。我真正想要的是一个 13 的网格和我的尺寸。因此,为什么不使用这样的 numpy 矩阵呢?

    matrix_of_13s = np.matrix(collection_of_13s)
    for element in np.nditer(matrix_of_13s):
        print(element)
    

    这将遍历矩阵中的每个元素,从左到右按行顺序排列。

    您还会注意到,随着项目规模的扩大,numpy 更加高效且易于使用,for a reason

    我还想再提一个选项,这是一个超级简单的概念,您不需要任何集合或 numpy.只需使用一维数组来表示您的网格。这个概念实际上用于图像的主成分分析,但这无关紧要。

    本质上,一个 13s 的网格变成了一个普通的列表

    [13, 13, 13, 13, 13, 13, 13, 13, 13]
    

    任何元素的新索引都是(column +1)*(row)。对此有数学证明和解释,但我现在不想找到它,哈哈。

    【讨论】:

      猜你喜欢
      • 2020-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-21
      • 2014-08-26
      • 1970-01-01
      • 2020-12-31
      • 1970-01-01
      相关资源
      最近更新 更多