在2D列表中的任意位置插入值

时间:2018-10-02 02:47:26

标签: python list 2d minesweeper

我正在尝试使用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行,直到放置了足够的炸弹为止,但是我不知道它是否会工作(我也无法测试它,因为我已经知道如何做到这一点)。我觉得这种解决方案效率很低,所以我也想知道是否有一种更有效的方法。

3 个答案:

答案 0 :(得分:1)

使用赋值代替插入: board[x][y] = 0.1

此外,请小心初始化2D电路板。 board = [[0.0] * width] * height将创建一个大小为width的列表,然后将所有height的指针复制到该列表,即如果您将0.1分配给第一行{{1} } 每个行中的第一项将被分配,因为它们都是相同的列表。您必须改为使用

board[0][0]

答案 1 :(得分:0)

您可以仅使用board[x][y] = 0.1来访问板子行y中的索引x。此外,您也不想建立这样的董事会。您这样做的方式实际上只会创建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。这是接下来要解决的好问题。

答案 2 :(得分:0)

正在处理清单的清单。如果我们运行您的电路板初始化代码并按如下所示修改电路板值:

void(*p)(int row, int col, const int arr[row][col]) = min;

我们看到我们的修改出现在三个地方。这是因为我们将相同的列表([0.0] *宽度) height 次数了。正确执行此操作的一种方法是board = [[0.0] * _的宽度在range(3)中]。请参阅Two dimensional array in python

由于我们使用的是列表列表,因此将x和y插入元素0.1的一种方法是使用board [y] .insert(x,0.1)。但是我觉得您想做的是board [y] [x] = 0.1。

对于放置炸弹,您所描述的可以像以下那样实现:

>>> 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]]

干杯