在javascript中的另一个多维数组中查找数组

时间:2014-08-27 13:19:23

标签: javascript arrays html5 multidimensional-array

我正在使用JavaScript和HTML5画布编写一个简单的蛇游戏。 我有一个多维数组,像这样保存蛇块:

snake=[[1,1],[1,2]];

并使用(snake.indexOf([i],[j])!=-1)在arrayMap上设置它,然后在画布上绘制arrayMap。

        for (var i = 0; i < blocksHeightCount; i++) {
            for (var j = 0; j < blocksWidthCount; j++) {

                if ((snake.indexOf(i,j)!=-1)||
                    (walls.indexOf(i,j)!=-1)||
                    (foods.indexOf(i,j)!=-1)) {
                        arrayMap[i][j]=1;
                } else {
                        arrayMap[i][j]=0;
                }
            }
        }

        for (var i = 0; i < blocksHeightCount; i++) {
            for (var j = 0; j < blocksWidthCount; j++) {
                    Block = arrayMap[i][j];
                    if (Block!=0){
                        ctx.fillStyle = (Block != 9) ? colors[Block]
                            : "#bdc3c7";
                        ctx.fillRect(j * cubeWidth, i * cubeHeight
                            , cubeWidth-.4,cubeHeight-.4);
                    }
            }
        }

问题是indexOf在我设置数组时不起作用! 当我设置indexOf(&#34; i,j&#34;)但它需要它是数组时,它工作正常。

请帮助,thx

1 个答案:

答案 0 :(得分:0)

第一个解决方案:使用Array.map

数组snakewallsfoods的每个元素都是一个包含2个元素的数组。因此,要检查其中一个阵列中是否存在[x,y],您需要一种简单的方法 比较两个数组[x1, y1][x2, y2]。直接使用运算符==比较数组将比较它们的引用而不是值(感谢@Elena的再映射)。一种比较值的方法 会影响每个数组的哈希并比较哈希值。通过哈希,我的意思是一个数字,对于[x, y]类型的每个数组都是唯一的。那可能是x * blocksWidthCount + y 在你的情况下,代码将是:

function getHash(x, y){
    return x * blocksWidthCount + y;
}
var blockHashes = snake.concat(walls).concat(foods).map(function(cell) {
    return getHash(cell[0], cell[1]);
}); // hashes of all blocks in one array

for (var i = 0; i < blocksHeightCount; i++) {
    for (var j = 0; j < blocksWidthCount; j++) {
        if (blockHashes.indexOf(getHash(i, j)) != -1) {
                arrayMap[i][j]=1;
        } else {
                arrayMap[i][j]=0;
        }
    }
}

第二个解决方案改变我们看待事物的方式

而不是循环遍历所有单元并验证每个单元是否是一个块,其复杂度为O(N * M)N个单元数和M个块数)。 我们可以通过假设没有块然后循环遍历块并将它们标记为O(N + M)中的块来做得更好!

function markBlock(cell){
    arrayMap[cell[0]][cell[1]] = 1;
}
for (var i = 0; i < blocksHeightCount; i++)
    for (var j = 0; j < blocksWidthCount; j++)
        arrayMap[i][j] = 0;
snake.forEach(markBlock);
walls.forEach(markBlock);
foods.forEach(markBlock);