(Python3)在python数组上存储10x10游戏地图

时间:2018-05-15 04:05:43

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

如何在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行,in   IndexError:列表索引超出范围"

2 个答案:

答案 0 :(得分:0)

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

试试这个

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

答案 1 :(得分:0)

因此,根据您当前的问题内容,​​我们无法确定您的总体最终目标是什么。我假设您希望在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])

现在虽然这有效,但这不是我想要的。我真正想要的是一个13s的网格与我的尺寸。因此,为什么不使用像这样的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)。有一个数学证明和解释,但我现在不想找到它大声笑。