2014-08-27 140 views
0

我正在使用JavaScript和HTML5画布编写简单的蛇游戏。 我有保持蛇块这样的多维数组:在javascript中查找另一个多维数组中的数组

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(“我,j”),但我需要它是数组。

请帮助,THX

+2

[i],[j]是不正确的语法。也许你的意思是'snake [i] [j] .indexOf(someInt)' – mplungjan 2014-08-27 13:22:19

+2

尝试将其称为'indexOf([i,j])' – webNeat 2014-08-27 13:23:03

+0

注意:考虑通过从一个空数组开始设置arrayMap点,然后遍历蛇,墙,食物并在arrayMap中设置包含点;所以你不要搜索网格中的每一个点的所有三个数组 - 并且根本不需要indexOf :-) – fast 2014-08-27 13:26:56

回答

0

第一溶液:使用Array.map

您的阵列snakewallsfoods的每个元素都是与2个元素的阵列。因此,要检查一个阵列中是否存在[x,y],您需要一个简单的方法来比较[x1, y1][x2, y2]之间的两个阵列 。直接使用运算符==比较数组将比较它们的引用而不是值(Thanks @Elena for remarque)。比较值 的一种方法是对每个阵列影响散列并比较散列。通过散列我的意思是一个数字是唯一的每个阵列[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); 
相关问题