На этом шаге мы приведем тесты для проверки работоспособности минимакса.
Крестики-нолики - такая простая игра, что даже нам, людям, легко найти в ней правильный ход для текущей позиции. Это позволяет легко разрабатывать модульные тесты.
В следующем фрагменте кода мы испытаем минимаксный алгоритм и попытаемся найти правильный ход из трех различных позиций. Первый тест простой: требуется найти лишь один ход, чтобы одержать победу. Второй тест требует блокировать соперника - искусственный интеллект должен помешать противнику одержать победу. Последний тест немного сложнее и требует от искусственного интеллекта продумать игру на два шага вперед.
import unittest from typing import List from minimax import find_best_move from tictactoe import TTTPiece, TTTBoard from board import Move class TTTMinimaxTestCase(unittest.TestCase): def test_easy_position(self): # выигрыш за один ход to_win_easy_position: List[TTTPiece] = [TTTPiece.X, TTTPiece.O, TTTPiece.X, TTTPiece.X, TTTPiece.E, TTTPiece.O, TTTPiece.E, TTTPiece.E, TTTPiece.O] test_board1: TTTBoard = TTTBoard(to_win_easy_position, TTTPiece.X) answer1: Move = find_best_move(test_board1) self.assertEqual(answer1, 6) def test_block_position(self): # нужно помешать противнику выиграть to_block_position: List[TTTPiece] = [TTTPiece.X, TTTPiece.E, TTTPiece.E, TTTPiece.E, TTTPiece.E, TTTPiece.O, TTTPiece.E, TTTPiece.X, TTTPiece.O] test_board2: TTTBoard = TTTBoard(to_block_position, TTTPiece.X) answer2: Move = find_best_move(test_board2) self.assertEqual(answer2, 2) def test_hard_position(self): # найти лучший ход, чтобы выиграть в два хода to_win_hard_position: List[TTTPiece] = [TTTPiece.X, TTTPiece.E, TTTPiece.E, TTTPiece.E, TTTPiece.E, TTTPiece.O, TTTPiece.O, TTTPiece.X, TTTPiece.E] test_board3: TTTBoard = TTTBoard(to_win_hard_position, TTTPiece.X) answer3: Move = find_best_move(test_board3) self.assertEqual(answer3, 1) if __name__ == '__main__': unittest.main()
Для выполнения всех трех тестов запустите этот файл.
На следующем шаге мы рассмотрим разработку ИИ для игры в крестики-нолики.