【问题标题】:Tic tac toe alpha-beta井字游戏 alpha-beta
【发布时间】:2015-03-10 22:29:30
【问题描述】:

我正在用 javascript 编写井字游戏。我完成了 GUI 等,但我仍然对 AI 有问题。我使用 Alpha-beta-Prune 来找到获胜的动作。但是,我的代码从来没有给出可以赢得比赛的动作。我做了很多研究,但仍然不知道我的代码有什么问题。你们能在这里看看我的主要人工智能部分吗? 我的想法是创建一个存储移动的二维数组:1 是人类,-1 是 AI,0 是空的。 初始化调用: var test = getBestMove(-1); `

获取最佳移动功能:

function getBestMove(player)  {

    var alpha    = -maxValue;
    var beta     =  maxValue;

    var bestScore = -maxValue;
    var bestMove  = -1;

    for (var r = 0; r < boardSize; ++r)
    {
        for (var c = 0; c < boardSize; ++c)
        {
            if (gameArray[r][c] === 0)
            {
                gameArray[r][c] = player;
                var score = alphaBeta(gameArray, alpha,beta, r * boardSize + c, player);
                gameArray[r][c] = 0;

                if (score > bestScore)
                {
                    bestScore = score;
                    bestMove = r * boardSize + c;
                }
            }
        }
    }
    console.log(bestScore);
    return bestMove;
}

alpha-beta 搜索:

// 1: human
// -1: AI
// 0: empty
function alphaBeta(board, alpha, beta,lastMove, player) {    
    var bestValue;
    //check if the last move make a win
    //checkwin return the winner / 0 if no winner
    var win = checkwin(board, 
                   Math.floor(lastMove / boardSize), 
                   lastMove % boardSize);

    if (win === - 1){
        return 1000;
    }
    else if (win === 1){
        return -1000;
    }
    else if (checktie(board) === true){
        //console.log(win);
        return 0;
    }
    else{
        //return evaluation(board);
    }
    if (player === -1) 
    {
        bestValue = alpha;
        // Recurse for all children of node.
        for (var r = 0; r < boardSize; r++)
        {
            for (var c = 0; c < boardSize; c++)
            {
                if (board[r][c] === 0)
                {            
                    board[r][c] = player;
                    var childValue = alphaBeta(board, bestValue, beta,r*boardSize+c, -player);
                    board[r][c] = 0;
                    bestValue = Math.max(bestValue, childValue);
                    if (beta <= bestValue) 
                    {
                        return bestValue;
                    }
                }
            }
        }
    }
    else {
        bestValue = beta;       
        // Recurse for all children of node.
        for (var r = 0; r < boardSize; r++)
        {
            for (var c = 0; c < boardSize; c++)
            {
                if (board[r][c] === 0)
                {
                    board[r][c] = player;
                    var childValue = alphaBeta(board, alpha, bestValue,r*boardSize+c, -player);
                    board[r][c] = 0;
                    bestValue = Math.min(bestValue, childValue);
                    if (bestValue <= alpha)
                    {
                        return bestValue;
                    }
                }
            }
        }        
    }
    return bestValue;
}

我没有使用评估功能,因为我认为alpha-beta没有它应该能够找到胜利。

【问题讨论】:

  • 您能否提供一些错误的动作示例?
  • 您好,感谢您的回复。很难解释哪里出了问题,但你可以在这里尝试它的当前版本并得到想法neokites.com/test

标签: javascript artificial-intelligence tic-tac-toe alpha-beta-pruning


【解决方案1】:

我发现了问题,这与算法无关,而与我的实现有关: 由于人工智能总是在人类之后行动,所以 if (player === -1) bestValue = beta; 和 if (player === 1) bestValue = alpha;

第二个错误,子招是其他玩家的,所以: 棋盘[r][c] = -玩家;无处不在

这里是游戏的完整版本:www.neokites.com/gomoku/ 我希望这可以帮助某人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-27
    • 1970-01-01
    • 2015-06-12
    • 2015-01-08
    相关资源
    最近更新 更多