0

Javascript で簡単な Tic Tac Toe ゲームを作成しています。現在、勝者を確認するために、最初に誰のターンであるかを取得し、次にボード上の X または O がある場所を見つける関数があります。それらが持つスペースには番号 (1 ~ 8) が付けられ、配列に追加されます。ここまでは順調ですね。

今、私は別の配列、すべての勝利の組み合わせを持つ配列を比較しようとしています:

var winningCombinations = [[1,2,3],[4,5,6],[7,8,9],[1,4,7],[2,5,8],[3,6,9],[1,5,9],[3,5,7]];

テスト配列では、2、5、および 8 が含まれているため、勝者になるはずです。

私のテストのソース:

<script>

    var test = [2,4,5,8]
    var winningCombinations = [[1,2,3],[4,5,6],[7,8,9],[1,4,7],[2,5,8],[3,6,9],[1,5,9],[3,5,7]];

    for(var x=0; x<winningCombinations.length; x++) {

        if (winningCombinations[x].indexOf(test) > -1) {
            alert("Win!");
        } else {
            alert ("No win.");
        }

    }

</script>

現時点では、値全体として [2,4,5,8] のみをテストしていると思います。内部の個々の数値のインスタンスではありません。これは私が困惑しているところです。テスト配列が任意の順序で、winningCombinations 値のいずれかと一致するかどうかを確認するにはどうすればよいですか?

4

4 に答える 4

1

test素朴な方法では、すべての組み合わせをチェックし、いずれかの組み合わせのすべての要素が含まれていることを確認します。

var winner = false;

for (var i = 0; i < winningCombinations.length && !winner; i++) {
    var matches = true;

    for(var j = 0; j < winningCombinations[i].length && matches; j++)
        if(test.indexOf(winningCombinations[i][j]) == -1)
            matches = false;

    if(matches)
        winner = true;
}

これらを関数と戻り値にカプセル化するとmatcheswinner醜いループ条件を取り除くことができます:

function matchesCombination(test, combination)
{
    for(var i = 0; i < combination.length; i++)
        if(text.indexOf(combination[i]) == -1)
            return false;

    return true;
}

function isWinner(test, combinations)
{
    for(var i = 0; i < combinations.length; i++)
        if(matchesCombination(test, combinations[i])
            return true;

    return false;
}
于 2013-10-08T14:38:29.103 に答える
1

ある配列が別の配列のサブセットであるかどうかをチェックしています。このため、test を {2: 1, 4: 1, 5: 1, 8: 1} の形式のオブジェクトに変更することをお勧めします。それらは true と評価するためだけに存在し、実際には重要ではありません。大事なのは鍵です。

function checkSubset(a, b) {
    //returns true if EVERY element in the array causes the next function to return true
    return a.every(function(e) {
        return !!b[e]; //returns true if b contains e
    });
}

次に、checkSubset(winingCombinations[x], test) を呼び出します。そうは言っても、三目並べボードの状態を評価するもっと良い方法があります。

于 2013-10-08T14:38:05.057 に答える
0

それは最良の答えではないかもしれませんが、私の頭の上から、勝利条件の値をループして、3 つの indexOfs すべてが != -1 であることを要求する if ステートメントを実行することができます。

つまり、勝利の組み合わせの配列ごとに、配列内の各値をループし、test.indexOf(value) を実行して、-1 でないことを確認します。3 つの値すべてが -1 に等しくない場合、勝利条件があります。

于 2013-10-08T14:34:23.333 に答える