函数更改全局变量

时间:2018-09-14 14:41:57

标签: javascript arrays tetris

我将这个数组传递给一个函数,该函数应该将数组旋转90度并返回结果。然后,我想检查新数组是否与画布上的其他事物发生碰撞。

let newArray = [
[0,0,1],
[1,1,1],   
[0,0,0]
];

let test = rotate(newArray);

if ( collision(test) ){
  draw(newArray);
} else {
  draw(test);
}

这是问题所在。我认为Rotate()会更改newArray变量,因此,如果if语句的计算结果无关紧要,则draw()函数将始终执行相同的操作。

在检查旋转后的矩阵是否与其他东西碰撞后,我想选择要绘制的数组。

function rotate(matrix) {

matrix = matrix.reverse();

for (var i = 0; i < matrix.length; i++) {
 for (var j = 0; j < i; j++) {
  var temp = matrix[i][j];
  matrix[i][j] = matrix[j][i];
  matrix[j][i] = temp;
 }
}
return matrix
}


function collision(mat){

let collision = false;

for ( let i = 0; i < mat.length; i++){
for ( let j = 0; j < mat.length; j++){
  if (mat[i][j] == 1){
    let test = ctx.getImageData(x + 10*j +10, y + 10*i, 1, 1);
      if (test.data != "255,255,255,255" && test.data != "0,0,0,0"){
        collision = true;
      }
  }
 }
 }
return collision;
}

1 个答案:

答案 0 :(得分:0)

所以您是正确的-旋转函数中使用的Array.reverse()方法不会返回新数组,而是会修改相同的数组(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reverse);

我建议更改rotate函数,以先克隆传递给它的数组,然后再执行Array.reverse()等。

您可以使用let newMatrix = JSON.parse(JSON.stringify(matrix));克隆到示例中传递给旋转函数的简单数组,然后在newMatrix上执行其余操作,然后将其返回。

如果您不喜欢这种方法,您还可以创建一个新的空数组,并使用double for循环(当您使用2D网格时,在一个循环内循环)用原始数组中的值填充新数组