10-四子棋AI
8.3.2 四子棋AI
我们为井字棋开发的 minimax() 和 find_best_move() 函数,可以不加修改地直接供四子棋实现代码使用,这很神奇吧。代码清单8-19所示的代码段与井字棋AI代码只有一点点不同。最大的区别就是,现在 max_depth 设成了 3 。这能把计算机每一步的思考时间控制在合理范围内。换句话说,这里的四子棋AI最多只能看到后3步的(评分)棋局。
代码清单8-19 connectfour_ai.py
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("Enter a legal column (0-6):"))
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, 3)
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
请试着运行一下上述四子棋AI程序。与井字棋AI不同,它对于每一步的生成都需要耗费几秒的时间。除非你仔细思考每一步棋,否则它仍有可能会获胜。至少它不会犯任何明显的错误。通过增加搜索的深度,我们可以提升它的游戏水平,但计算机每走一步的计算时间将呈指数级增长。
提示 你知道四子棋游戏已经被计算机科学家“解决”了吗?游戏的“解决”意味着我们对任何棋局下的最佳走法都已弄清楚了。最佳的四子棋开局走法是把棋子放在中间列。