【博弈论】经典游戏三子棋如何做到100%不败


前言

看似简单的井字棋(Tic Tac Toe),其实蕴藏着深奥的策略。当两位玩家都熟悉游戏的基本技巧时,常常会以平局告终。不过,通过一些巧妙的策略和战术,你可以在每一局游戏中增加胜算。本文将为你揭示这些秘诀,帮助你成为井字棋的常胜将军。

人类玩家策略

这里说的人类玩家是说从一个真人的角度去玩这个游戏,本文下面还有一个电脑玩家策略主要是讲从计算机的角度如何实现

先手玩家的制胜策略

角落策略

从任意角落下手

将第一个X放在任意一个角落。这一开局能使对手更容易犯错。如果对手落子位置不在中心,可以做到百分之百的胜率。

对手不在中心落子

8a8e762b1b754bc8edf39228e57ff0e.jpg

对手在中心落子

如果对手首先将O放在中心,只有在他犯错的情况下才能赢得比赛。如果比赛中双方都没有失误,游戏结果将是平局。
22e99fdab21ec4fd87bfbc580a7651f.jpg

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是基于博弈树搜索算法的井字棋代码示例: ```python import copy # 定义棋盘大小 BOARD_SIZE = 3 # 定义玩家和电脑的棋子 PLAYER = 'X' COMPUTER = 'O' # 定义博弈树搜索算法的深度 SEARCH_DEPTH = 5 # 初始化棋盘 def init_board(): board = [] for i in range(BOARD_SIZE): row = [] for j in range(BOARD_SIZE): row.append('-') board.append(row) return board # 打印棋盘 def print_board(board): for row in board: print(' '.join(row)) # 判断当前棋盘状态(胜利、平局或未结束) def get_game_status(board): for i in range(BOARD_SIZE): # 检查行 if board[i][0] != '-' and len(set(board[i])) == 1: return board[i][0] # 检查列 if board[0][i] != '-' and len(set([board[j][i] for j in range(BOARD_SIZE)])) == 1: return board[0][i] # 检查对角线 if board[0][0] != '-' and len(set([board[i][i] for i in range(BOARD_SIZE)])) == 1: return board[0][0] if board[0][BOARD_SIZE-1] != '-' and len(set([board[i][BOARD_SIZE-1-i] for i in range(BOARD_SIZE)])) == 1: return board[0][BOARD_SIZE-1] # 检查平局 if all([cell != '-' for row in board for cell in row]): return 'Tie' # 未结束 return None # 计算当前棋盘得分 def get_score(board): # 如果玩家获胜,则得分为-10 if get_game_status(board) == PLAYER: return -10 # 如果电脑获胜,则得分为10 elif get_game_status(board) == COMPUTER: return 10 # 平局得分为0 else: return 0 # 实现博弈树搜索算法 def minimax(board, depth, is_maximizing): # 判断是否达到搜索深度或者当前棋盘状态已经结束 game_status = get_game_status(board) if depth == 0 or game_status is not None: return get_score(board) # 如果当前是电脑的回合 if is_maximizing: best_score = float('-inf') for i in range(BOARD_SIZE): for j in range(BOARD_SIZE): if board[i][j] == '-': # 模拟电脑下棋 new_board = copy.deepcopy(board) new_board[i][j] = COMPUTER # 递归搜索 score = minimax(new_board, depth-1, False) # 更新最优得分 best_score = max(best_score, score) return best_score # 如果当前是玩家的回合 else: best_score = float('inf') for i in range(BOARD_SIZE): for j in range(BOARD_SIZE): if board[i][j] == '-': # 模拟玩家下棋 new_board = copy.deepcopy(board) new_board[i][j] = PLAYER # 递归搜索 score = minimax(new_board, depth-1, True) # 更新最优得分 best_score = min(best_score, score) return best_score # 实现电脑下棋 def computer_move(board): best_score = float('-inf') best_move = None for i in range(BOARD_SIZE): for j in range(BOARD_SIZE): if board[i][j] == '-': # 模拟电脑下棋 new_board = copy.deepcopy(board) new_board[i][j] = COMPUTER # 计算当前得分 score = minimax(new_board, SEARCH_DEPTH, False) # 更新最优得分和最优下法 if score > best_score: best_score = score best_move = (i, j) # 执行最优下法 board[best_move[0]][best_move[1]] = COMPUTER print(f"电脑下棋 ({best_move[0]}, {best_move[1]})") print_board(board) # 实现玩家下棋 def player_move(board): while True: try: row = int(input("请输入行号(从1开始):")) - 1 col = int(input("请输入列号(从1开始):")) - 1 if row < 0 or row >= BOARD_SIZE or col < 0 or col >= BOARD_SIZE or board[row][col] != '-': print("请输入合法的行号和列号!") continue board[row][col] = PLAYER print_board(board) break except ValueError: print("请输入合法的行号和列号!") # 实现井字棋游戏 def play_game(): board = init_board() print("游戏开始!") print_board(board) while True: player_move(board) if get_game_status(board) is not None: break computer_move(board) if get_game_status(board) is not None: break game_status = get_game_status(board) if game_status == 'Tie': print("平局!") elif game_status == PLAYER: print("恭喜你获胜!") else: print("很遗憾,你输了。") # 启动游戏 play_game() ``` 在此示例中,我们定义了一个 `minimax()` 函数来实现博弈树搜索算法,并将搜索深度设为了 5。同时,我们还定义了 `computer_move()` 和 `player_move()` 函数来模拟电脑和玩家下棋的过程。最后,我们通过 `play_game()` 函数来实现整个井字棋游戏的流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想要AC的dly

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值