(Python3)在python阵列上存储10x10游戏地图
如何在2D python3阵列上存储10x10(100个单位)的游戏地图 这是我目前的代码:(Python3)在python阵列上存储10x10游戏地图,python,arrays,python-3.x,2d,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 no
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)
正在抛出错误:
“回溯(最近一次呼叫最后一次):
文件“python”,第244行,在
索引器:列表索引超出范围“
您需要嵌套的两级循环才能遍历映射。您所拥有的仅在地图对角线上生成块,即您正在为(0,0)、(1,1)、(2,2)生成地图,这也解释了索引超出范围的错误 试试这个
for genX in range(10):
for genY in range(10):
worldMap[genX][genY] = randint(1, 12)
因此,从您当前的问题内容来看,我们无法确定您的总体最终目标到底是什么。我将在这样一个假设下工作,即希望用Python表示
nxn
矩阵,并在其中包含某种数字。我将在这个矩阵中填入数字13
,您可以根据需要对其进行更改
矩阵基本上是行和列,类似这样
13 13 13
13 13 13
13 13 13
这是一个3x3
矩阵,有3行3列
for row in range(5):
for column in range(5):
print(collection_of_13s[row][column])
我可以用集合(列表列表、元组列表、元组列表等)来表示矩阵,其中每个内部集合表示一行
我不会使用您想要的矩阵大小,因为您需要能够计算出来,我将使用5x5
这就是Python列表术语中的5x5
矩阵
[[13,13,13,13,13],[13,13,13,13,13],[13,13,13,13],[13,13,13,13],[13,13,13,13]。
要做到这一点,我可以做得更短一些
[[13用于范围(5)中的列]用于范围(5)中的行]
现在,您需要一个矩阵,集合的集合可能有点不必要而且速度慢,让我们尝试在Python中使用这个名为numpy
的库。您必须从源代码、通过Python代码或pip或其他工具安装它,然后进行查找
假设我有我的旧列表集合,现在我不想使用它,因为它是不必要的,而且看起来有点混乱。我必须用我自己的代码来正确地将其打印成矩阵,对其进行矩阵运算,等等。为什么不使用一些为我包装的东西,比如一个
假设我需要访问第3行和第4列的元素。在我的集合集合中,这意味着我需要获得第三行,然后是其中的第四个元素。这意味着
一系列[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更加高效且易于使用
我还想再提一个选项,这是一个超级简单的概念,您不需要任何集合或numpy集合。只需使用1D数组来表示网格。这个概念实际上用于图像的主成分分析,但这是不相关的
本质上,一个13秒的网格只是一个普通的列表
[13, 13, 13, 13, 13, 13, 13, 13, 13]
任何元素的新索引都将是
(列+1)*(行)
。这有一个数学证明和解释,但我现在不想找到它。lol。你能在代码上写行号吗?回溯显示第244行,但我们不知道这是哪一部分,因为这只是一个片段。第244行是worldMap[genX][genY]=genIncomingI添加了行号OK如果您想要tldr,请检查我答案的最后一部分。为您提供了一种简单的方法,无需担心多个for循环之类的问题。正如在另一个答案中所说的,您正在增加列和行索引,因此您正在访问对角线中的元素。此外,您的while条件是而不是worldmap中的13,这总是错误的,因为第一个worldmap
不会改变,第二个,它包含13个列表,而不是数字13本身。