На этом шаге мы рассмотрим создание ИИ для игры в крестики-нолики.
Теперь, когда у нас есть все необходимые ингредиенты, можно легко сделать следующий шаг - разработать полностью искусственного противника, способного пройти всю игру в крестики-нолики. Вместо того чтобы оценивать тестовую позицию, ИИ будет оценивать только позицию, генерируемую на каждом ходе противника. В следующем фрагменте короткого кода ИИ играет в крестики-нолики против оппонента-человека, который делает первый ход.
from minimax import find_best_move from tictactoe import TTTBoard from board import Move, Board board: Board = TTTBoard() def get_player_move() -> Move: player_move: Move = Move(-1) while player_move not in board.legal_moves: play: int = int(input("Укажите допустимый номер поля (0-8):")) player_move = Move(play) return player_move if __name__ == '__main__': # главный цикл игры while True: human_move: Move = get_player_move() board = board.move(human_move) if board.is_win: print("Человек победил!") break elif board.is_draw: print("Ничья!") break computer_move: Move = find_best_move(board) print(f"Компьютер сходил на {computer_move}") board = board.move(computer_move) print(board) if board.is_win: print("Компьютер победил!") break elif board.is_draw: print("Ничья!") break
Поскольку по умолчанию значение max_depth для find_best_move() равно 8, этот ИИ для игры в крестики-нолики всегда будет просматривать ходы до конца игры. (Максимальное количество ходов в крестиках-ноликах равно девяти, а ИИ ходит вторым.) Поэтому ИИ всегда должен играть идеально. Идеальная игра - это игра, в которой оба противника каждый раз выбирают наилучший ход. Результатом идеальной игры в крестики-нолики является ничья. Учитывая это, вы никогда не сможете выиграть у искусственного интеллекта. Если вы будете играть идеально, то сыграете вничью, если сделаете ошибку, то ИИ победит. Попробуйте сами. Вы не должны победить.
Со следующего шага мы начнем рассматривать игру Connect Four.