【问题标题】:Python: changing element of a list at a random indexPython:在随机索引处更改列表的元素
【发布时间】:2014-12-12 14:24:30
【问题描述】:

我正在用 python 开发一个简单的扫雷游戏,并试图创建一个将地雷插入空板的函数。

注意,板子是列表形式的,如下:

[[col, col, col...],[col,col,col...],[...],[...]...]

我的函数如下所示:

def insert_mines(NUM_MINES):
for mine in range(NUM_MINES):
    rand_row = randint(0, NUM_ROWS - 1)
    rand_col = randint(0, NUM_COLS - 1)
    if BOARD[rand_row][rand_col] == 'O':
        BOARD[rand_row][rand_col] = 'X'
        NUM_MINES = NUM_MINES - 1
    else:
        BOARD[rand_row][rand_col] = 'X'

print NUM_MINES

当我使用 num_mines = 96 运行它时,它从不打印零,如果所有地雷都已插入,它应该打印的内容。

这可能是什么原因?

请注意,“X”代表一个地雷,“O”只是一个没有地雷的棋盘空间。

【问题讨论】:

  • 顺便说一句,最统一的分配地雷的方法是将所需数量的地雷放在网格的前面,然后将整个地雷洗牌。
  • 不保证在 96 次迭代后所有空白空间都会被选中并替换为我的,因为采样是在网格上均匀进行的;即采样索引可能会重复。

标签: python list loops for-loop random


【解决方案1】:

打印零的唯一方法是如果

BOARD[rand_row][rand_col] == 'O'

每次迭代。根据NUM_ROWSNUM_COLS,这可能由于"birthday paradox" 而不太可能发生

Chris 建议的更简单的制作板的方法

cells = ['O'] * NUM_ROWS * NUM_COLS
cells[:NUM_MINES] = ['X'] * NUM_MINES
random.shuffle(cells)
BOARD = [cells[i::NUM_ROWS] for i in range(NUM_ROWS)]

【讨论】:

  • 一个比我更优雅的答案。谢谢
猜你喜欢
  • 2015-02-01
  • 1970-01-01
  • 2017-04-18
  • 1970-01-01
  • 2020-10-10
  • 1970-01-01
  • 1970-01-01
  • 2019-04-14
  • 1970-01-01
相关资源
最近更新 更多