如何编写函数在嵌套列表表示的扫雷棋盘上随机放置地雷
扫雷lay_mines函数正确实现方案
你之前的参考代码存在几个核心错误:
- 不能直接遍历数字类型的
number_of_mines,for _ in number_of_mines会直接触发类型错误 random.sample(free, number_of_mines)本身就会一次性返回指定数量的不重复坐标,不需要放在循环里重复执行- 列表取值赋值用方括号
[],你写的field(mines)用了圆括号属于语法错误,且拿到坐标后需要分别取出行列索引再赋值 - 你定义的
field是行优先存储:field[行索引][列索引],而free里存的元组是(x,y)对应(列索引, 行索引),赋值时要注意顺序对应
方案1:用random.sample实现(推荐,不会重复选坐标)
直接一次性抽取指定数量的不重复空闲坐标,遍历赋值即可,代码如下:
import random def lay_mines(field, free, number_of_mines): # 一次性抽取number_of_mines个不重复的空闲坐标 mine_coords = random.sample(free, k=number_of_mines) for col, row in mine_coords: # field[行][列] 赋值为地雷标记"x" field[row][col] = "x"
如果你后续还要用free列表存储剩余空闲坐标,可以在赋值后把对应坐标从free里移除:
def lay_mines(field, free, number_of_mines): mine_coords = random.sample(free, k=number_of_mines) for col, row in mine_coords: field[row][col] = "x" free.remove((col, row))
方案2:用random.choice实现
如果要每次抽一个坐标,抽到后移除避免重复,代码如下:
import random def lay_mines(field, free, number_of_mines): for _ in range(number_of_mines): # 随机选一个空闲坐标 col, row = random.choice(free) field[row][col] = "x" # 从空闲列表里移除已经布雷的坐标,避免重复布雷 free.remove((col, row))
内容的提问来源于stack exchange,提问作者Goro
相关产品推荐
相关产品推荐

