0

私は単純な三目並べゲームを作成しており、winAlert というブール値があり、それが true の場合、プレイヤーに勝ったことを警告する必要があります。これはほとんどの場合正しく機能しますが、そうでない場合が 1 つあります。ゲームに勝利し、すべてのセルが埋められた場合、コンソールは winAlert の値が false であることをログに記録しますが、プレイヤーに勝利したことを true であるかのように警告します。誰かがこのコードを調べて、なぜこれがこのように動作するのかを理解できますか? 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()

これを解決する 1 つの方法は、現在のプレーヤーの動きの勝利のみをチェックすることです。

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

私はあなたのコードを少し変更しますFiddle

 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 に答える