2014-08-27 120 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); 
相關問題