我正在创建一个简单的井字游戏,并且我有一个名为winAlert的布尔值,如果为true,它将提醒玩家他们已经赢了。这在大多数情况下都可以正常工作,但是在某些情况下却不能。如果游戏获胜并且所有单元格都已填满,则控制台会记录winAlert的值为false,但仍会警告玩家他们已经获胜,就好像它是真实的一样。有人可以看一下这段代码,看看为什么这样做吗? http://jsfiddle.net/Z5c9P/3/
我认为问题出在哪里,但是我不确定。

var determineWin = function (pMoves) {
    for (var i = 0; i < winConditions.length; i++) {
        if (winConditions[i].length > pMoves.length) {
            continue;
        }
        for (var j = 0; j < winConditions[i].length; j++) {
            winAlert = false;
            for (var k = 0; k < pMoves.length; k++) {
                if (pMoves[k] === winConditions[i][j]) {
                    winAlert = true;
                    break;
                }

            }
            if (!winAlert) break;
        }
        if (winAlert) {
            alert(currentPlayer + " wins!");
            break;
        }
    }
};


这是调用此函数的代码:

$('td').one('click', function () {
    turnCount += 1;
    setCurrentPlayer();
    $(this).text(currentPlayer);
    cellTracker = $(this).attr('id');
    storeMoves();
    determineWin(xMoves);
    determineWin(oMoves);
    if(turnCount === 9 && winAlert === false) {
        alert("Tie game!");
    }
    console.log(turnCount, xMoves, oMoves, winAlert);
});

最佳答案

发生这种情况是因为您的代码执行以下操作:

storeMoves();
determineWin(xMoves);
determineWin(oMoves);
if(turnCount === 9 && winAlert === false) {
    alert("Tie game!");
}
console.log(turnCount, xMoves, oMoves, winAlert);


因此,如果X赢了游戏,则determineWin(xMoves)会将变量设置为true,而determinWin(oMoves)会将其设置为false,所有变量均在console.log()之前

解决此问题的一种方法是仅检查当前玩家的举动是否获胜:

storeMoves();
determineWin(currentPlayer == 'X' ? xMoves : yMoves);
if(turnCount === 9 && winAlert === false) {
    alert("Tie game!");
}
console.log(turnCount, xMoves, oMoves, winAlert);

09-25 20:13