我正在尝试编写一个命令行扫雷克隆,我在使用我的生成器代码时遇到了一些麻烦。
def genWorld(size, mines):
world = []
currBlock = []
for i in range(size):
for j in range(size):
currBlock.append("x")
world.append(currBlock)
currBlock = []
for i in range(mines):
while True:
row = randint(0, size)
col = randint(0, size)
if world[row[col]] != "M":
break
world[row[col]] = "M"
printWorld(world)
当我运行时,我收到错误:
Traceback (most recent call last):
File "C:\Python33\minesweeper.py", line 28, in <module>
genWorld(9, 10)
File "C:\Python33\minesweeper.py", line 23, in genWorld
if world[row[col]] != "M":
TypeError: 'int' object is not subscriptable
我想这意味着我以错误的方式引用了这个列表,但是我怎么能正确地做这个呢?
答案 0 :(得分:3)
您为row
提供一个整数值。 row[col]
然后尝试访问该整数的元素,这会产生错误。我想你想要的是world[row][col]
。
答案 1 :(得分:1)
您可能需要world[row][col]
,因为world[row]
会提供一个列表,然后[col]
会从该列表中选择一个元素。
答案 2 :(得分:0)
我会考虑使用dict而不是嵌套数组:
# positions for mines
mines = set()
while len(mines) != mines:
pos = (randint(0, size), randint(0, size))
if not pos in mines:
mines.add(pos)
# initialize world
world = {}
for x in range(size):
for y in range(size):
if (x, y) in mines:
world[x, y] = 'M'
else:
world[x, y] = ' '
你也可以使用dict的get()函数,如果没有我的函数会返回None
,但是你也可以使用集合(if pos in mines: booom()
)来保持容易。< / p>