在二维列表中的随机位置插入值
Insert value at random place in 2D list
我正在尝试使用 python 中的列表制作扫雷游戏。到目前为止我有这个代码:
import random as r
import sys
#dimension of board and number of bombs
width = int(sys.argv[1])
height = int(sys.argv[2])
b = int(sys.argv[3])
#creates the board
board = [[0.0] * width] * height
#places bombs
for i in range(b):
x = r.randint(0, width - 1)
y = r.randint(0, height - 1)
board.insert(x, y, 0.1)
#prints board
for i in range(len(board)):
for j in range(len(board[i]))
print(board[i][j], end=" ")
我正在尝试将炸弹放置在棋盘上的随机位置,但 insert()
只接受 2 个参数。我还有其他方法可以做到这一点吗?
我想在第 1 行放置一个随机炸弹,然后在第 2 行放置一个随机炸弹,依此类推,一旦它命中第 n 行,它就会循环回到第 1 行,直到放置了足够多的炸弹,但是我我不确定它是否会起作用(而且我无法测试它,因为我也知道该怎么做)。我觉得这个解决方案效率很低,所以我也想知道是否有更有效的方法来做到这一点。
您可以只使用 board[x][y] = 0.1
来访问面板行 x
中的索引 y
。另外,您也不想构建那样的电路板。您这样做的方式实际上只会创建 1 个带有数字的数组。这是经过一些修改的代码。
import random as r
# dimension of board and number of bombs
# (I'm using hard coded values as an example)
width = 5
height = 7
b = 10
#creates the board
board = []
for i in range(height): # create a new array for every row
board.append([0.0] * width)
#places bombs
for i in range(b):
x = r.randint(0, height - 1)
y = r.randint(0, width - 1)
board[x][y] = 0.1 # this is how you place a bomb at a random coordinate
#prints board
for row in board:
print(row)
我的结果板看起来像:
[0.0, 0.0, 0.1, 0.0, 0.0]
[0.0, 0.0, 0.0, 0.0, 0.0]
[0.0, 0.0, 0.0, 0.0, 0.0]
[0.1, 0.0, 0.1, 0.0, 0.1]
[0.1, 0.0, 0.0, 0.0, 0.1]
[0.0, 0.1, 0.0, 0.0, 0.1]
[0.0, 0.1, 0.0, 0.0, 0.0]
请注意,如果随机 x 和 y 值重复,您最终可能会得到少于 b
个炸弹。这是接下来要解决的好问题。
使用赋值而不是插入:
board[x][y] = 0.1
.
此外,请小心初始化您的 2D 板。 board = [[0.0] * width] * height
将制作一个大小为 width
的列表,然后将所有 height
的指针复制到该列表,即如果您将 0.1 分配给第一行中的第一个单元格 board[0][0]
将分配 every 行中的第一项,因为它们都是相同的列表。你必须改为使用
board = [[0.0]*width for _ in range(height)]
我们正在处理列表中的列表。如果我们运行你的板初始化代码和修改板值如下:
>>> width = 2; height = 3
>>> board = [[0.0] * width] * height
>>> print board
[[0.0, 0.0], [0.0, 0.0], [0.0, 0.0]]
>>> x = 0; y = 1; board[y][x] = 1.1
>>> print board
[[1.1, 0.0], [1.1, 0.0], [1.1, 0.0]]
我们看到我们的修改出现了三个地方。这是因为我们已经把同一个列表 ([0.0] * width) height 次了。一种正确的方法是 board = [[0.0] * width for _ in range(3)]。请参考 Two dimensional array in python .
由于我们使用的是列表的列表,为 x 和 y 插入元素 0.1 的一种方法是使用 insert 将是 board[y].insert(x, 0.1)。但我觉得你想做的是 board[y][x]=0.1.
对于放置炸弹,你所描述的可以这样实现:
n = <the number of bombs>
for i in xrange(n):
x = i % width # x will iterate over 0 to width
y = r.randint(0, height - 1)
# insert bomb
干杯,
我正在尝试使用 python 中的列表制作扫雷游戏。到目前为止我有这个代码:
import random as r
import sys
#dimension of board and number of bombs
width = int(sys.argv[1])
height = int(sys.argv[2])
b = int(sys.argv[3])
#creates the board
board = [[0.0] * width] * height
#places bombs
for i in range(b):
x = r.randint(0, width - 1)
y = r.randint(0, height - 1)
board.insert(x, y, 0.1)
#prints board
for i in range(len(board)):
for j in range(len(board[i]))
print(board[i][j], end=" ")
我正在尝试将炸弹放置在棋盘上的随机位置,但 insert()
只接受 2 个参数。我还有其他方法可以做到这一点吗?
我想在第 1 行放置一个随机炸弹,然后在第 2 行放置一个随机炸弹,依此类推,一旦它命中第 n 行,它就会循环回到第 1 行,直到放置了足够多的炸弹,但是我我不确定它是否会起作用(而且我无法测试它,因为我也知道该怎么做)。我觉得这个解决方案效率很低,所以我也想知道是否有更有效的方法来做到这一点。
您可以只使用 board[x][y] = 0.1
来访问面板行 x
中的索引 y
。另外,您也不想构建那样的电路板。您这样做的方式实际上只会创建 1 个带有数字的数组。这是经过一些修改的代码。
import random as r
# dimension of board and number of bombs
# (I'm using hard coded values as an example)
width = 5
height = 7
b = 10
#creates the board
board = []
for i in range(height): # create a new array for every row
board.append([0.0] * width)
#places bombs
for i in range(b):
x = r.randint(0, height - 1)
y = r.randint(0, width - 1)
board[x][y] = 0.1 # this is how you place a bomb at a random coordinate
#prints board
for row in board:
print(row)
我的结果板看起来像:
[0.0, 0.0, 0.1, 0.0, 0.0]
[0.0, 0.0, 0.0, 0.0, 0.0]
[0.0, 0.0, 0.0, 0.0, 0.0]
[0.1, 0.0, 0.1, 0.0, 0.1]
[0.1, 0.0, 0.0, 0.0, 0.1]
[0.0, 0.1, 0.0, 0.0, 0.1]
[0.0, 0.1, 0.0, 0.0, 0.0]
请注意,如果随机 x 和 y 值重复,您最终可能会得到少于 b
个炸弹。这是接下来要解决的好问题。
使用赋值而不是插入:
board[x][y] = 0.1
.
此外,请小心初始化您的 2D 板。 board = [[0.0] * width] * height
将制作一个大小为 width
的列表,然后将所有 height
的指针复制到该列表,即如果您将 0.1 分配给第一行中的第一个单元格 board[0][0]
将分配 every 行中的第一项,因为它们都是相同的列表。你必须改为使用
board = [[0.0]*width for _ in range(height)]
我们正在处理列表中的列表。如果我们运行你的板初始化代码和修改板值如下:
>>> width = 2; height = 3
>>> board = [[0.0] * width] * height
>>> print board
[[0.0, 0.0], [0.0, 0.0], [0.0, 0.0]]
>>> x = 0; y = 1; board[y][x] = 1.1
>>> print board
[[1.1, 0.0], [1.1, 0.0], [1.1, 0.0]]
我们看到我们的修改出现了三个地方。这是因为我们已经把同一个列表 ([0.0] * width) height 次了。一种正确的方法是 board = [[0.0] * width for _ in range(3)]。请参考 Two dimensional array in python .
由于我们使用的是列表的列表,为 x 和 y 插入元素 0.1 的一种方法是使用 insert 将是 board[y].insert(x, 0.1)。但我觉得你想做的是 board[y][x]=0.1.
对于放置炸弹,你所描述的可以这样实现:
n = <the number of bombs>
for i in xrange(n):
x = i % width # x will iterate over 0 to width
y = r.randint(0, height - 1)
# insert bomb
干杯,