Я ищу способ заставить мою игру в сапера добавлять числа вокруг бомб

#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. Неважно, попробовал первый метод, и он сработал безупречно, большое спасибо!