【问题标题】:Multi-dimensional loop assistance多维循环辅助
【发布时间】:2014-01-07 01:46:04
【问题描述】:

尝试检查这种数组中可能的组合:

[ ["X","X","X"], ["","",""], ["","",""] ]

组合包括: tic tac toe logic

所以,这些是true

[ ["X","",""], ["","X",""], ["","","X"] ]

[ ["","","X"], ["","X",""], ["X","",""] ]

[ ["","X",""], ["","X",""], ["","X",""] ]

到目前为止,只要我的array[0][0] 是选定的选项之一,我就可以使用它,但我觉得我正在朝着code堆栈移动。

function testWin(){
    var cs=b.length, ph=0, pv=0, pd=0;
    for(var i=0;i<cs;i++){
        if(b[0][i]==="X"){ ph++; }
        if(b[i][0]==="X"){ pv++; }
        if(b[i][i]==="X"){ pd++; }
    }
    if(ph===cs || pv===cs || pd===cs){ alert("YOU WIN!"); }
}

在这里提琴:http://jsfiddle.net/z4XLj/

  1. 一直在尝试另一个for loop,但没有成功识别0
  2. 尝试了while loop,但它崩溃了,我认为这不是最有效的方法。
  3. 需要查找是否...
    • 任何array[i][this] 只包含X
    • 任何array[this][i] 只包含X

【问题讨论】:

  • 没有理由对一切都大胆

标签: javascript jquery arrays multidimensional-array


【解决方案1】:

我现在看起来像黑魔法,但你有:

function testWin(){
    var cs = b.length, I = [], J = [], d = [0, 0];
    for(var i=0; i<cs; i++){
       for(var j=0; j<cs; j++){
           if(b[i][j] != 'X') continue;
           I[i] = (I[i] || 0) + 1;
           J[j] = (J[j] || 0) + 1;
           if(i == j) d[0]++;  //Diagonal \
           if(i == cs-j-1) d[1]++;  //Diagonal /
       }
    }
    if(d.concat(I).concat(J).indexOf(cs) >=0) alert("You win");
}

jsfiddle:http://jsfiddle.net/edgarinvillegas/z4XLj/3/

它考虑任何尺寸的棋盘的任何水平、垂直或对角线胜利

:O 它有效! :)

干杯,来自玻利维亚拉巴斯

【讨论】:

    【解决方案2】:
    function testWin() {
        var xCount;
        var rowsCount = b.length;
        // First check rows
        for (var row = 0; row < rowsCount; row++) {
            xCount = 0;
            colsCount = b[row].length;
            for (var col = 0; col < colsCount; col++) {
                if (b[row][col] == "X") {
                    xCount++;
                } else {
                    break;
                }
            }
            if (xCount == colsCount) {
                alert ("YOU WIN!");
                return true;
            }
        }
        // Now check columns -- just invert the above nested loops
        colsCount = b[0].length;
        for (var col = 0; col < colsCount; col++) {
            xCount = 0;
            for (var row = 0; row < rowsCount; row++) {
                if (b[row][col] == "X") {
                    xCount++;
                } else {
                    break;
                }
            }
            if (xCount == rowsCount) {
                alert ("YOU WIN!");
                return true;
            }
        }
        // Check diagonals
        if (b[1][1] == "X" && 
            ((b[0][0] == "X" && b[2][2] == "X") || (b[0][2] == "X" && b[2][0] == "X"))) {
            alert ("YOU WIN!");
            return true;
        }
        return false;
    }
    

    【讨论】:

    • 因此,功能有所改进,但仍将 2 硬编码为 index。让我玩它。谢谢:-)
    • underscore.js 中可能有一些内容,但原生 Javascript 中没有。
    • 谢谢 :-) 最终要打这个代码,所以试图找到极简的方法来实现简单的功能。
    • 所以请选择 Edgar 的回答——我认为你不能再简约了。
    • 我正在努力 :-) 我找到了一个更加简约的解决方案,但是在调试对角线时遇到了麻烦。今晚我会把我的代码贴在上面。
    猜你喜欢
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-28
    • 2017-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多