
向前看两步——Minimax让AI学会换位思考设计截图如下为什么需要Minimax普通AI的局限只看当前一步不考虑对手的反击。场景AI可以选择形成活三8000分或冲四10000分。普通AI选冲四但对手下一步会堵住冲四AI的活三机会丢失了。Minimax的核心思想假设对手也会做出最优选择选择对自己最不坏的结果。Minimax算法原理AI选择最大化 / | \ 候选1 候选2 候选3 / \ / \ / \ 对手选择最小化 ↓ ↓ ↓ ↓ ↓ ↓ 评估 评估 评估 评估 评估 评估Max层AI回合选择分数最高的走法Min层对手回合选择分数最低的走法对AI最不利叶节点用评估函数计算当前局面的分数代码实现privategetHardMove(board:number[][]):Move{constcandidatesthis.getSortedCandidates(board);constmaxCandidatesMath.min(12,candidates.length);letbestMove:Movecandidates[0];letbestScore:number-Infinity;letalpha:number-Infinity;constbeta:numberInfinity;for(leti0;imaxCandidates;i){constmovecandidates[i];board[move.row][move.col]this.aiColor;// 如果直接获胜立即返回if(this.checkWin(board,move.row,move.col,this.aiColor)){board[move.row][move.col]EMPTY;returnmove;}// Minimax递归对手回合最小化constscorethis.minimax(board,2,alpha,beta,false);board[move.row][move.col]EMPTY;if(scorebestScore){bestScorescore;bestMovemove;}alphaMath.max(alpha,score);}returnbestMove;}minimax递归函数privateminimax(board:number[][],depth:number,alpha:number,beta:number,isMaximizing:boolean):number{// 终止条件深度为0时评估局面if(depth0){returnthis.evaluateBoard(board);}constcandidatesthis.getSortedCandidates(board);constmaxCandidatesMath.min(8,candidates.length);if(isMaximizing){// AI回合找最大值letmaxEval:number-Infinity;for(leti0;imaxCandidates;i){constmovecandidates[i];board[move.row][move.col]this.aiColor;if(this.checkWin(board,move.row,move.col,this.aiColor)){board[move.row][move.col]EMPTY;returnSCORE_FIVE;// AI获胜}constevalScorethis.minimax(board,depth-1,alpha,beta,false);board[move.row][move.col]EMPTY;maxEvalMath.max(maxEval,evalScore);alphaMath.max(alpha,evalScore);if(betaalpha)break;// Alpha-Beta剪枝}returnmaxEval;}else{// 对手回合找最小值letminEval:numberInfinity;for(leti0;imaxCandidates;i){constmovecandidates[i];board[move.row][move.col]this.humanColor;if(this.checkWin(board,move.row,move.col,this.humanColor)){board[move.row][move.col]EMPTY;return-SCORE_FIVE;// 对手获胜对AI最不利}constevalScorethis.minimax(board,depth-1,alpha,beta,true);board[move.row][move.col]EMPTY;minEvalMath.min(minEval,evalScore);betaMath.min(beta,evalScore);if(betaalpha)break;// Alpha-Beta剪枝}returnminEval;}}搜索树图解假设AI在搜索深度2候选3个深度2 AI选择(MAX) / | \ 深度1 对手(MIN) 对手(MIN) 对手(MIN) / \ / \ / \ 深度0 评估 评估 评估 评估 评估 评估 80 50 60 30 90 70 自底向上计算 深度1: min(80,50)50 min(60,30)30 min(90,70)70 深度2: max(50,30,70)70 → 选择候选1关键设计决策1. 深度2的选择constscorethis.minimax(board,2,alpha,beta,false);深度1只看对手反应——不够深度2看AI→对手→AI——合理深度3AI→对手→AI→对手——更好但计算量大移动端选择深度2是性能与棋力的平衡。2. 候选数量限制// 顶层12个候选constmaxCandidatesMath.min(12,candidates.length);// 递归层8个候选constmaxCandidatesMath.min(8,candidates.length);搜索树大小 12 × 8 × 8 768在移动端可接受。3. 立即获胜检查if(this.checkWin(board,move.row,move.col,this.aiColor)){board[move.row][move.col]EMPTY;returnmove;// 不需要继续搜索}找到必胜走法立即返回避免不必要的搜索。4. 评估函数的差异困难模式使用evaluateBoard全盘评估而非普通模式的evaluatePosition单点评估privateevaluateBoard(board:number[][]):number{letaiScore:number0;lethumanScore:number0;aiScorethis.evaluateLines(board,this.aiColor);humanScorethis.evaluateLines(board,this.humanColor);returnaiScore-humanScore*1.1;}总结Minimax算法是博弈树搜索的经典方法换位思考假设对手做出最优选择最大最小AI最大化对手最小化递归搜索从叶节点向上回传深度控制平衡棋力与性能困难模式通过深度2的Minimax搜索能预见2步之后的局面变化显著强于普通AI的单步评估。