На этом шаге мы реализуем эту игру.
Удивительно, но функции minimax() и find_best_move(), которые мы разработали для игры в крестики-нолики, можно без изменений использовать в реализации Connect Four. В следующем фрагменте кода добавилась лишь пара изменений по сравнению с кодом ИИ для игры в крестики-нолики. Главное различие заключается в том, что значение max_depth теперь равно 3. Это обеспечивает разумное время, отводимое компьютеру на обдумывание хода. Другими словами, наш ИИ для Connect Four рассматривает (оценивает) позиции не более чем на три хода вперед.
from minimax import find_best_move from connectfour import C4Board from board import Move, Board board: Board = C4Board() def get_player_move() -> Move: player_move: Move = Move(-1) while player_move not in board.legal_moves: play: int = int (input("Задайте номер столбца (0-6):")) 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, 3) print(f"Компьютер сходил на {computer_move}") board = board.move(computer_move) print(board) if board.is_win: print("Компьютер выиграл!") break elif board.is_draw: print("Ничья!") break
На рисунке 1 приведен протокол одной игры.
Рис.1. Протокол игры в Connect Four
На следующем шаге мы рассмотрим улучшение минимакса с помощью альфа-бета-отсечения .