
从找到就做到比较后选最优——评估函数是AI的灵魂设计截图如下普通AI核心逻辑privategetNormalMove(board:number[][]):Move{constcandidatesthis.getCandidates(board,2);letbestMove:Movecandidates[0];letbestScore:number-1;for(constmoveofcandidates){// 评估攻击分数AI落在此处board[move.row][move.col]this.aiColor;constattackScorethis.evaluatePosition(board,move.row,move.col,this.aiColor);board[move.row][move.col]EMPTY;// 评估防守分数人类落在此处board[move.row][move.col]this.humanColor;constdefendScorethis.evaluatePosition(board,move.row,move.col,this.humanColor);board[move.row][move.col]EMPTY;// 攻防加权consttotalScoreattackScore*1.1defendScore;if(totalScorebestScore){bestScoretotalScore;bestMovemove;}}returnbestMove;}攻防加权策略consttotalScoreattackScore*1.1defendScore;为什么攻击系数是1.1进攻优先攻击系数略高于防守让AI更倾向于进攻避免过度防守如果攻防系数相同AI会过于保守1.1是经验值太大会鲁莽进攻太小会消极防守对比简单AI只能能赢就赢或被动防守普通AI能权衡攻防——即使不能立即赢也会选择对己方最有利、对对方最不利的位置。evaluatePosition位置评估函数privateevaluatePosition(board:number[][],row:number,col:number,player:number):number{constdirections:number[][][[0,1],[1,0],[1,1],[1,-1]];lettotalScore:number0;for(constdirofdirections){totalScorethis.evaluateDirection(board,row,col,dir[0],dir[1],player);}returntotalScore;}评估一个位置的四个方向累加所有方向的分数。evaluateDirection单方向评估privateevaluateDirection(board:number[][],row:number,col:number,dr:number,dc:number,player:number):number{letcount:number1;// 包含当前位置letleftOpen:booleanfalse;letrightOpen:booleanfalse;// 正方向计数letrrowdr;letccoldc;while(r0rBOARD_SIZEc0cBOARD_SIZEboard[r][c]player){count;rdr;cdc;}if(r0rBOARD_SIZEc0cBOARD_SIZEboard[r][c]EMPTY){rightOpentrue;}// 反方向计数rrow-dr;ccol-dc;while(r0rBOARD_SIZEc0cBOARD_SIZEboard[r][c]player){count;r-dr;c-dc;}if(r0rBOARD_SIZEc0cBOARD_SIZEboard[r][c]EMPTY){leftOpentrue;}constopenCount(leftOpen?1:0)(rightOpen?1:0);returnthis.scoreForCount(count,openCount);}棋型识别评估函数通过count连续棋子数和openCount开放端数识别棋型countopenCount棋型名称分数说明≥5任意五连1,000,000直接获胜42活四100,000必胜两端都能成五41冲四10,000威胁一端能成五32活三8,000强威胁可变活四31眠三500弱威胁22活二400潜力21眠二50微弱潜力12单子10基础值privatescoreForCount(count:number,openEnds:number):number{if(count5)returnSCORE_FIVE;if(count4){if(openEnds2)returnSCORE_OPEN_FOUR;if(openEnds1)returnSCORE_FOUR;return0;}if(count3){if(openEnds2)returnSCORE_OPEN_THREE;if(openEnds1)returnSCORE_THREE;return0;}if(count2){if(openEnds2)returnSCORE_OPEN_TWO;if(openEnds1)returnSCORE_TWO;return0;}if(count1){if(openEnds2)returnSCORE_ONE;return0;}return0;}开放端的意义活四openEnds2 _ ● ● ● ● _ 两端开放 → 必胜 冲四openEnds1 × ● ● ● ● _ 一端封闭 → 对手可防 死四openEnds0 × ● ● ● ● × 两端封闭 → 无威胁openEnds0时返回0——两端被封死的棋型毫无价值。评估示例假设AI在(7,7)落子后水平方向连成3子两端开放 → 活三 → 8000分垂直方向单独1子两端开放 → 单子 → 10分对角线连成2子一端开放 → 眠二 → 50分副对角单独1子两端开放 → 单子 → 10分总攻击分 8000 10 50 10 8070对比简单AI维度简单AI普通AI决策方式优先级链全候选评估进攻能力仅能赢就赢识别所有进攻棋型防守能力仅堵四连和活三识别所有威胁棋型评估精度二值有/无连续分数总结普通AI的核心是评估函数——将棋盘状态量化为分数。通过count和openEnds两个维度识别8种棋型每种棋型赋予不同分数。攻防加权1.1:1让AI在进攻和防守之间取得平衡。评估函数的设计思路可以推广到所有棋类游戏AI——定义棋型、赋予分值、加权决策。