函数改变全局变量
Function changing global variable
我将这个数组传递给一个函数,该函数假设将数组旋转 90 度并 return 结果。然后我想检查新数组是否与 canvas.
上的其他东西发生碰撞
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() 函数将始终执行相同的操作。
我想 select 检查旋转矩阵是否与其他东西碰撞后要绘制的数组。
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;
}
所以你是对的 - rotate 函数中使用的 Array.reverse()
方法不是 return 一个新数组,它修改了同一个数组 (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reverse);
我建议更改旋转函数以首先克隆传递给它的数组,然后才执行 Array.reverse()
等。
您可以使用 let newMatrix = JSON.parse(JSON.stringify(matrix));
克隆这个传递给示例中旋转函数的简单数组,然后对 newMatrix
和 return 执行剩余的操作。
如果您不喜欢这种方法,您也可以创建一个新的空数组并使用双 for 循环(当您使用二维网格时,循环中的循环)使用来自原来的。
是的,您的 rotate
函数正在改变您的数组,因此进入哪个 if
子句并不重要。把它改成这个,因为你必须克隆你的矩阵。
function rotate(matrix) {
newNatrix = matrix.slice().map( function(row){ return row.slice(); });
for (var i = 0; i < newNatrix.length; i++) {
for (var j = 0; j < i; j++) {
var temp = newNatrix[i][j];
newNatrix[i][j] = newNatrix[j][i];
newNatrix[j][i] = temp;
}
}
return newNatrix;
}
我将这个数组传递给一个函数,该函数假设将数组旋转 90 度并 return 结果。然后我想检查新数组是否与 canvas.
上的其他东西发生碰撞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() 函数将始终执行相同的操作。
我想 select 检查旋转矩阵是否与其他东西碰撞后要绘制的数组。
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;
}
所以你是对的 - rotate 函数中使用的 Array.reverse()
方法不是 return 一个新数组,它修改了同一个数组 (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reverse);
我建议更改旋转函数以首先克隆传递给它的数组,然后才执行 Array.reverse()
等。
您可以使用 let newMatrix = JSON.parse(JSON.stringify(matrix));
克隆这个传递给示例中旋转函数的简单数组,然后对 newMatrix
和 return 执行剩余的操作。
如果您不喜欢这种方法,您也可以创建一个新的空数组并使用双 for 循环(当您使用二维网格时,循环中的循环)使用来自原来的。
是的,您的 rotate
函数正在改变您的数组,因此进入哪个 if
子句并不重要。把它改成这个,因为你必须克隆你的矩阵。
function rotate(matrix) {
newNatrix = matrix.slice().map( function(row){ return row.slice(); });
for (var i = 0; i < newNatrix.length; i++) {
for (var j = 0; j < i; j++) {
var temp = newNatrix[i][j];
newNatrix[i][j] = newNatrix[j][i];
newNatrix[j][i] = temp;
}
}
return newNatrix;
}