Javascript 测试数组是否包含八个3键值中的任意一个——Tic-Tac-Toe游戏

Javascript 测试数组是否包含八个3键值中的任意一个——Tic-Tac-Toe游戏,javascript,arrays,Javascript,Arrays,我正在用Javascript编写一个简单的井字游戏。现在,为了检查是否有赢家,我有一个函数,它首先得到轮到谁,然后找到棋盘上有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]]; var winner = false; for (va

我正在用Javascript编写一个简单的井字游戏。现在,为了检查是否有赢家,我有一个函数,它首先得到轮到谁,然后找到棋盘上有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]];
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;
}
对于测试数组,它应该是一个赢家,因为它包含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>

var检验=[2,4,5,8]
var Winning组合=[[1,2,3]、[4,5,6]、[7,8,9]、[1,4,7]、[2,5,8]、[3,6,9]、[1,5,9]、[3,5,7];
对于(变量x=0;x-1){
警惕(“赢!”);
}否则{
警惕(“不赢”);
}
}

我认为现在它只是测试[2,4,5,8]作为一个整数值,而不是测试其中单个数字的实例。这就是我被难倒的地方。如何检查测试数组是否以任何顺序匹配任何winningCombinations值?

这可能不是最佳答案,但在我的脑海中,您可以循环遍历WinningConditions中的值,并执行一个if语句,该语句要求所有3个IndexOf都为-一,


i、 对于获胜组合中的每个数组,循环遍历数组中的每个值,并执行test.indexOf(value)并检查它是否为-1。如果所有3个值都不等于-1,那么您就有了获胜的条件。

这可能不是最佳答案,但在我的脑海中,您可以循环遍历获胜条件中的值,并执行一个If语句,要求所有3个索引都为-一,

i、 对于获胜组合中的每个数组,循环遍历数组中的每个值,并执行test.indexOf(value)并检查它是否为-1。如果所有3个值都返回为不等于-1,则您有一个赢的条件。

尝试以下方法:

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]];
var combLength = 0;
for (var i in winningCombinations) {
    combLength = winningCombinations.length;
    for (var j in winningCombinations[i]) {
        if (-1 == test.indexOf(winningCombinations[i][j])) {
            break;
        }
    }

    if (combLength - 1 == j) {
        alert("Win!");
    }
}
在第一个
if
语句中,我们正在检查当前循环数组中的当前循环项(我知道这似乎令人困惑)是否存在于
test
数组中。如果不是,我们已经知道
test
array不是一个获胜的数组

此外,我建议将所有这些内容包装在如下函数中:

function isWinner(playerNumbers, winningCombinations) {
    var combLength = 0;
    for (var i in winningCombinations) {
        combLength = winningCombinations.length;
        for (var j in winningCombinations[i]) {
            if (-1 == playerNumbers.indexOf(winningCombinations[i][j]) {
                break;
            }
        }

        if (combLength - 1 == j) {
            return true;
        }
    }

    return false;
}

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]];

if (isWinner(test, winningCombinations)) {
    alert("Win!");
} else {
    alert ("No win.");
}
试试这个:

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]];
var combLength = 0;
for (var i in winningCombinations) {
    combLength = winningCombinations.length;
    for (var j in winningCombinations[i]) {
        if (-1 == test.indexOf(winningCombinations[i][j])) {
            break;
        }
    }

    if (combLength - 1 == j) {
        alert("Win!");
    }
}
在第一个
if
语句中,我们正在检查当前循环数组中的当前循环项(我知道这似乎令人困惑)是否存在于
test
数组中。如果不是,我们已经知道
test
array不是一个获胜的数组

此外,我建议将所有这些内容包装在如下函数中:

function isWinner(playerNumbers, winningCombinations) {
    var combLength = 0;
    for (var i in winningCombinations) {
        combLength = winningCombinations.length;
        for (var j in winningCombinations[i]) {
            if (-1 == playerNumbers.indexOf(winningCombinations[i][j]) {
                break;
            }
        }

        if (combLength - 1 == j) {
            return true;
        }
    }

    return false;
}

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]];

if (isWinner(test, winningCombinations)) {
    alert("Win!");
} else {
    alert ("No win.");
}

实际上,您并不是在检查相等性,而是在检查一个数组是否是另一个数组的子集。为此,我建议将test更改为{2:1,4:1,5:1,8:1}形式的对象。在那里的那些只是评估为真,它们其实并不重要。重要的是关键

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(winningcombines[x],test)。
也就是说,有更好的方法来评估tic-tac趾板的状态。

你实际上不是在检查相等,而是在检查一个数组是否是另一个数组的子集。为此,我建议将test更改为{2:1,4:1,5:1,8:1}形式的对象。在那里的那些只是评估为真,它们其实并不重要。重要的是关键

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(winningcombines[x],test)。
也就是说,有更好的方法来评估tic-tac趾板的状态。

简单的方法只是检查每个组合,并确保
test
包含其中一个组合的每个元素:

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]];
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;
}

naive方法只需检查每个组合,并确保
test
包含其中一个组合的每个元素:

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]];
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;
}
这可能会有帮助:这可能会有帮助:我在第7行添加了一个“'),因为它看起来像一个打字错误。我在第7行添加了一个“'),因为它看起来像一个打字错误。