该模板提供极简Minimax井字棋实现:定义GameState类(含board/player)、胜负判断、合法动作生成、动作应用(需copy)、无剪枝minimax递归(含深度衰减)、最优步选择接口,复制即跑。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

想快速验证Minimax算法在井字棋或简单博弈场景中的效果,但被冗长的类定义、状态展开逻辑和递归剪枝细节卡住?这个极简模板跳过所有工程封装,只保留核心决策骨架,复制粘贴就能跑通完整对弈流程。
初始化基础博弈环境
新建 Python 文件,写入以下三行代码,构建最小可行游戏状态容器:
class GameState:
def __init__(self, board=None, player='X'):
self.board = board or [''] * 9
self.player = player
这一步不实现任何方法,只确保后续能传入board列表和当前玩家标识——少了它,后续所有递归调用都会因self.board缺失而报错。
定义胜负与终止判断
在GameState类内部添加check_winner和is_terminal两个方法:
def check_winner(self):
wins = [(0,1,2),(3,4,5),(6,7,8),(0,3,6),(1,4,7),(2,5,8),(0,4,8),(2,4,6)]
for a,b,c in wins:
if self.board[a] == self.board[b] == self.board[c] != '': return self.board[a]
return None
def is_terminal(self):
return self.check_winner() is not None or '' not in self.board
注意:win组合必须按行→列→对角线顺序穷举,漏掉(2,4,6)会导致AI在右上到左下对角线胜出时无法识别终局。
生成合法动作列表
继续在GameState类中追加get_actions方法:
def get_actions(self):
return [i for i, v in enumerate(self.board) if v == '']
返回空位索引列表,这是Minimax递归展开的唯一入口。如果返回坐标元组或字符串数字,后续state.board[action]赋值会直接抛TypeError。
执行动作并返回新状态
添加apply_action方法,严格按以下签名和逻辑编写:
def apply_action(self, action):
new_board = self.board.copy()
new_board[action] = self.player
next_player = 'O' if self.player == 'X' else 'X'
return GameState(new_board, next_player)
这里【必须用copy()而非赋值】,否则所有递归分支操作的都是同一份board引用,导致状态污染、评估值全乱。
编写核心Minimax递归函数
在类外部定义minimax函数,接受state和depth两个参数:
def minimax(state, depth=0):
if state.is_terminal():
winner = state.check_winner()
if winner == 'X': return 10 - depth
elif winner == 'O': return depth - 10
else: return 0
if state.player == 'X':
return max(minimax(state.apply_action(a), depth+1) for a in state.get_actions())
else:
return min(minimax(state.apply_action(a), depth+1) for a in state.get_actions())
这段代码没有剪枝,但已具备完整博弈树搜索能力。X方追求最大得分,O方追求最小得分,深度衰减项让AI优先选择速胜或拖延败局。
封装AI决策接口
最后添加一个独立函数,输入当前局面,输出最优落子位置:
def get_best_move(current_state):
actions = current_state.get_actions()
scores = [(a, minimax(current_state.apply_action(a))) for a in actions]
return max(scores, key=lambda x: x[1])[0] if current_state.player == 'X' else min(scores, key=lambda x: x[1])[0]
调用时只需传入一个GameState实例,例如get_best_move(GameState(['X','','','O','','','','',''], 'X')),函数立刻返回整数索引。


















