0

我正在创建一个简单的井字游戏,我有一个名为 winAlert 的布尔值,如果它是真的,它应该提醒玩家他们已经赢了。这在大多数情况下都可以正常工作,但有一个实例无法正常工作。如果游戏获胜并且所有单元格都被填满,控制台会记录 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);
});
4

3 回答 3

2

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

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);
于 2013-06-10T00:37:15.113 回答
0

你已经召唤determineWin了每一位球员。所以如果 x 赢了,determineWin(oMoves);就会winAlert做假。这是问题吗?也许您应该创建一个determineWin只调用一次以确定谁是赢家的新方法。

当他的单元格小于 3 时,此代码将跳过另一个用户(winAlert仍然如此),所以这个问题不需要填充所有单元格,但每个玩家都有超过 3 个单元格。

    if (winConditions[i].length > pMoves.length) {
        continue;
    }
于 2013-06-10T00:21:54.647 回答
0

我改变了一点你的代码小提琴

 var determineWin = function (pMoves) {
    for (var i = 0; i < winConditions.length; i++) {
        if (winConditions[i].length > pMoves.length) {
            continue;
        }

        winAlert = false;
        matches = 0;
        for (var j = 0; j < winConditions[i].length; j++) {                       
            for (var k = 0; k < pMoves.length; k++) {
                if (pMoves[k] === winConditions[i][j]) {                        
                    matches++;
                }            
            }               
        }
        if (matches == 3) return true;



    }
   return false;
};

进而

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

** 更新澄清

于 2013-06-10T00:51:13.210 回答