如何在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:列表索引超出范围"
答案 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)
。有一个数学证明和解释,但我现在不想找到它大声笑。