Искусственный интеллект в игре Battleship угадывает то же самое

#python

#python

Вопрос:

Я создал игру battleship на Python. В настоящее время в игре есть простой искусственный интеллект, который случайным образом угадывает место, которое он еще не угадал на доске, чтобы попытаться найти двухблочный большой линкор. Я делаю искусственный интеллект более интеллектуальным, задавая ему шаблон для подражания. Чтобы сгенерировать предположение искусственного интеллекта, я использую следующий код.

 while X == 0 | Y == 0:
     X = 0
     Y = 0
     guess_col = guessCol(0, size - 1)
     guess_row = guessRow(0, size - 1)
     # Make sure the guess follows the pattern
     if (guess_col   guess_row)%2 != 1:
         X = 1
     # Make sure the spot has not already been guessed
     if board[guess_row][guess_col] != "~":
         Y = 1
  

Плата выглядит следующим образом.

   1 2 3 4 5 6 7 8 9 
1 ~ ~ ~ ~ ~ ~ ~ ~ ~
2 ~ ~ ~ ~ ~ ~ ~ ~ ~
3 ~ ~ ~ ~ ~ ~ ~ ~ ~
4 ~ ~ ~ ~ ~ ~ ~ ~ ~
5 ~ ~ ~ ~ ~ ~ ~ ~ ~
6 ~ ~ ~ ~ ~ ~ ~ ~ ~
7 ~ ~ ~ ~ ~ ~ ~ ~ ~
8 ~ ~ ~ ~ ~ ~ ~ ~ ~
9 ~ ~ ~ ~ ~ ~ ~ ~ ~
  

Шаблон работает идеально, но новый ИИ теперь угадывает места, о которых он уже догадался, что делает его очень неэффективным и не очень умным. Я также пробовал использовать if board[guess_row][guess_col] == "~": , но это приводит к тому, что шаблон также не работает. Как я могу заставить искусственный интеллект угадывать только в тех местах, о которых он еще не догадался?

Комментарии:

1. Вы когда-нибудь меняли значение board[guess_row][guess_col] на что-то другое, чем ~ ? Покажите нам этот код.

2. @jwodder Когда блок угадан, он меняется на X, а когда корабль поражен, он меняется на H. У меня есть полный исходный код здесь: github.com/JellyBellyFred/BattleShip

Ответ №1:

Строка:

 while X == 0 | Y == 0:
  

делает не то, что вы думаете. | является побитовым ИЛИ, и в Python (в отличие от семейства C) оно имеет более высокий приоритет, чем == . Таким образом, Python анализирует строку как:

 while X == (0 | Y) == 0:
  

что эквивалентно:

 while X == Y == 0:
  

что из-за цепочки операторов сравнения эквивалентно:

 while (X == Y) and (Y == 0):
  

что эквивалентно:

 while (X == 0) and (Y == 0):
  

чего вы, безусловно, не хотели достичь, написав X == 0 | Y == 0 !

Вместо использования побитового ИЛИ, используйте логическое ИЛИ, которое в Python пишется or :

 while X == 0 or Y == 0:
  

Комментарии:

1. Спасибо! Я бы никогда не догадался, что я должен изложить or !