我正在使用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
答案 0 :(得分:0)
第一个解决方案:使用Array.map
数组snake
,walls
和foods
的每个元素都是一个包含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);