07-开发井字棋AI
8.2.4 开发井字棋AI
现在所有组件都已就绪,接下来就简单了,就可以开发一个完整的能够走完一局井字棋的人工棋手了。AI不再是对测试棋局进行评分,而是要对两个棋手下棋形成的棋局进行评分。在代码清单8-11所示的代码段中,井字棋AI将会与执先手的人类棋手进行对战。
代码清单8-11 tictactoe_ai.py
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("Enter a legal square (0-8):"))
player_move = Move(play)
return player_move
if __name__ == "__main__":
# main game loop
while True:
human_move: Move = get_player_move()
board = board.move(human_move)
if board.is_win:
print("Human wins!")
break
elif board.is_draw:
print("Draw!")
break
computer_move: Move = find_best_move(board)
print(f"Computer move is {computer_move}")
board = board.move(computer_move)
print(board)
if board.is_win:
print("Computer wins!")
break
elif board.is_draw:
print("Draw!")
break
因为 find_best_move() 中的 max_depth 默认为8,所以这个井字棋AI一定能分析完游戏终局。井字棋最多只能走9步,而此AI是后手。因此,它应该能完美下完每一局。完美的游戏是指两个棋手在每个回合中都能走出最佳的走法。完美的井字棋结果就是平局。有鉴于此,井字棋AI应该是不可战胜的。如果人类竭尽全力,最多也就是平局。如果人类走错一步,AI就会赢棋。请尝试一下吧。AI应该不会输棋。