我正在尝试为井字游戏实现一个人工智能,它足够聪明,不会输。我尝试了两种不同的算法,但人工智能仍然会出错。
我从这个minimax alpha-beta pruning algorithm开始。这是一个现场演示:http: //iioengine.com/ttt/minimax.htm
它运行没有错误,但如果你先占据左下角,然后是底行的其他两个方块中的任何一个 - AI 不会看到这种情况。我确定这不是 minimax 算法中的缺陷 - 任何人都可以在我的源代码中看到错误吗?您可以检查演示页面以查看所有内容,但这是主要的 ai 功能:
function bestMove(board,depth,low,high,opponent){
var best=new Move(null,-iio.maxInt);
var p;
for (var c=0;c<grid.C;c++)
for(var r=0;r<grid.R;r++){
if (board[c][r]=='_'){
var nuBoard=board.clone();
nuBoard[c][r]=getTypeChar(opponent);
if(checkWin(nuBoard,getTypeChar(opponent)))
p=new Move([c,r],-evaluateBoard(board,getTypeChar(opponent))*10000);
else if (checkScratch(nuBoard))
p=new Move([c,r],0);
else if (depth==0)
p=new Move([c,r],-evaluateBoard(board,getTypeChar(opponent)));
else {
p=bestMove(nuBoard,depth-1,-high,-low,!opponent);
}
if (p.score>best.score){
best=p;
if (best.score > low)
low=best.score;
if (best.score >= high) return best;
}
}
}
return best;
}
如果您更熟悉 negamax,我也尝试过。我直接从这个页面中提取了逻辑。这是一个现场演示:http: //iioengine.com/ttt/negamax.htm
一旦你达到胜利状态,它就会冻结,但你已经可以看到人工智能非常愚蠢。代码集成有问题吗?
如果您在我的代码中发现阻止这些算法正常运行的缺陷,请告诉我。谢谢。
用代码更新:
function checkWin(board,type){
for (var i=0;i<3;i++)
if (evaluateRow(board,[i,0,i,1,i,2],type) >= WIN_SCORE
||evaluateRow(board,[0,i,1,i,2,i],type) >= WIN_SCORE)
return true;
if(evaluateRow(board,[0,0,1,1,2,2],type) >= WIN_SCORE
||evaluateRow(board,[2,0,1,1,0,2],type) >= WIN_SCORE)
return true;
return false;
}
function evaluateBoard(board,type){
var moveTotal=0;
for (var i=0;i<3;i++){
moveTotal+=evaluateRow(board,[i,0,i,1,i,2],type);
moveTotal+=evaluateRow(board,[0,i,1,i,2,i],type);
}
moveTotal+=evaluateRow(board,[0,0,1,1,2,2],type);
moveTotal+=evaluateRow(board,[2,0,1,1,0,2],type);
return moveTotal;
}