Вставить значение в произвольном месте в 2D-списке - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь сделать игру тральщика, используя списки в 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 голосов
/ 02 октября 2018

Используйте назначение вместо вставки: board[x][y] = 0.1.

Кроме того, будьте осторожны при инициализации 2D-доски.board = [[0.0] * width] * height создаст один список размером width, а затем скопирует указатели в этот список для всех height, т. Е. Если вы присвоите 0,1 первой ячейке в первой строке board[0][0] первому элементу в каждая строка будет назначена, поскольку все они находятся в одном списке.вместо этого вы должны использовать

   board = [[0.0]*width for _ in range(height)]
0 голосов
/ 02 октября 2018

Мы занимаемся списком списков.Если мы запустим код инициализации вашей платы и изменим значение платы следующим образом:

>>> 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] * ширина) высота раз.Один из способов сделать это правильно - доска = [[0.0] * ширина для _ в диапазоне (3)].Пожалуйста, обратитесь к Двумерный массив в python .

Поскольку мы используем список списка, одним из способов вставки элемента 0.1 для x и y будет использование insert - board [y].вставить (х, 0,1).Но я чувствую, что то, что вы хотели сделать, это доска [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

Ура

0 голосов
/ 02 октября 2018

Вы можете просто использовать 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]

Обратите внимание, что в случае случайной случайности вы можете получить менее b бомбЗначения x и y повторяются.Это хорошая проблема, которую нужно решить дальше.

...