#python #minesweeper
#питон #тральщик
Вопрос:
В настоящее время мой код добавляет бомбы через случайные координаты x и y в мою скрытую сетку. Что я должен был бы добавить здесь, чтобы код добавлял числа, если пространство сетки касается бомбы?
def addBombNum(bombs,gSize,hiddenGrid,bCount): fNum = "" for i in range(bombs): randPlace = True while randPlace: x = random.randint(0,gSize - 1) y = random.randint(0,gSize - 1) if hiddenGrid[y][x] == "[-]": hiddenGrid[y][x] = "33[90m[*]33[m" ; randPlace = False if hiddenGrid[y][x] == "33[90m[*]33[m": pass for i in range(gSize): for j in range(gSize): if hiddenGrid[i][j] == "33[90m[*]33[m": continue
Это мой хидденГрид, если понадобится.
hiddenGrid = [["[-]" for y in range(gSize)] for x in range(gSize)]
Ответ №1:
Я бы лично рекомендовал хранить массив бомб в виде числового массива и иметь возможность впоследствии обрабатывать его в выходных данных. Однако, чтобы прямо ответить на ваш вопрос, я бы рекомендовал делать следующее: каждый раз, когда вы кладете бомбу, вы увеличиваете счетчик для каждой соседней с ней ячейки.
Итак, в верхней части вашей функции вы можете сначала создать сетку чисел: grid = [[0 for y in range(gSize)] for x in range(gSize)]
.
Далее, каждый раз, когда вы добавляете бомбу, увеличивайте счетчик для каждого пространства сетки, которое касается ее:
for a in range(y - 1, y 2): for b in range(x - 1, x 2): if 0 lt;= a lt; gSize and 0 lt;= b lt; gSize: grid[a][b] = 1
Наконец, в самом конце вы можете просто передать эту информацию из сетки на выход. Таким образом, после if hiddenGrid[i][j] == "33[90m[*]33[m": continue
строки (которую, я полагаю, вы добавили, чтобы предотвратить ее перезапись бомбами с цифрами) вы можете добавить этот блок:
if grid[i][j] gt; 0: hiddenGrid[i][j] = "33[90m[%d]33[m" % grid[i][j]
Другой способ, которым вы могли бы это сделать, — просто добавить этот блок в самый конец после проверки пропуска бомбы:
count = 0 for a in range(i - 1, i 2): for b in range(j - 1, j 2): if 0 lt;= a lt; gSize and 0 lt;= b lt; gSize: if hiddenGrid[a][b] == "33[90m[*]33[m": count = 1 if count gt; 0: hiddenGrid[i][j] = "33[90m[%d]33[m" % count
Таким образом, вам не нужно иметь сетку счетчиков и не нужно увеличивать ее каждый раз. Однако наличие сетки означает, что если вам понадобится использовать ее позже для других целей, она у вас есть, и вам не нужно каждый раз пересчитывать ее.
Комментарии:
1. При использовании второго метода, который вы опубликовали (тот, который не нужно увеличивать), он каждый раз выдает мне ошибку «индекс списка вне диапазона». Я не понимаю, почему, может быть, в этом есть какое-то решение?
2. @Problemat1c О. Вам также нужно добавить
if 0 lt;= a lt; gSize and 0 lt;= b lt; gSize
чек ко второму. Моя вина, я отредактирую это.3. Неважно, попробовал первый метод, и он сработал безупречно, большое спасибо!