javascript - 为什么俄罗斯方 block 会同时掉落而不是一次掉落一个?

标签 javascript arrays loops deep-copy tetris

我正在用 JS 制作俄罗斯方 block 。当让方 block 下落时,它会让方 block 一次到达屏幕底部,而不是慢慢接近底部。我尝试创建一个变量来存储要进行的更改,以便它只查看当前的板,但没有运气。检查输出变量对于棋盘是否为 == 后,看来棋盘毕竟发生了变化,因为它返回 true。这是怎么回事?

编辑:我已成功制作了数组的浅拷贝。但它仍然立即跌至谷底。这是怎么回事?

var data = [];
          function array(x, text) {
              var y = [];
              for (var i = 0; i < x-1; i++) {y.push(text);}
              return y;
          }          
for (var i=0; i<20; i++){data.push(array(10, "b"));}
function draw(){
    var j;
    var i;
    var dataOut = [...data];
    for (i = 0; i < data.length - 1; i++){
        for (j = 0; j < data[i].length; j++){
            if (data[i][j] == "a" && data[i + 1][j] == "b" && i < data.length - 1) {
                
                dataOut[i][j] = "b";
                dataOut[i + 1][j] = "a";
               
            }
        }
    }
    data = dataOut;
}
data[0][4] = 'a';
draw();
console.log(data);

最佳答案

在 JavaScript 中,数组和对象是通过引用传递的。所以当你这样做时:

var dataOut = data;

这两个引用都指向同一个数组。您可以每次克隆数组:

var dataOut = JSON.parse(JSON.stringify(data));

或者简单地恢复循环,从底部到顶部。我冒昧地重命名了变量以使这一点更加清晰。请尝试以下操作:

var chars = {empty: '.', block: '#'},
    grid = createEmptyGrid(10, 20);

function createEmptyGrid(width, height) {
  var result = [], x, y;
  for (y = 0; y < height; y++) {
    var row = [];
    for (x = 0; x < width; x++) {
      row.push(chars.empty);
    }
    result.push(row);
  }
  return result;
}

function draw() {
  var x, y;
  for (y = grid.length - 1; y > 0; y--) {
    for (x = 0; x < grid[y].length; x++) {
      if (grid[y][x] === chars.empty && grid[y - 1][x] === chars.block) {
        grid[y][x] = chars.block;
        grid[y - 1][x] = chars.empty;
      }
    }
  }
}

// Just for the demo
var t = 0, loop = setInterval(function () {
  draw();
  if (grid[0].includes(chars.block)) {
    clearInterval(loop);
    grid[9] = 'GAME OVER!'.split('');
  }
  document.body.innerHTML = '<pre style="font-size:.6em">'
                          +   grid.map(row => row.join(' ')).join('\n')
                          + '</pre>';
  if (t % 20 === 0) {
    grid[0][Math.floor(Math.random() * 10)] = chars.block;
  }
  t++;
}, 20);

关于javascript - 为什么俄罗斯方 block 会同时掉落而不是一次掉落一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60421353/

相关文章:

javascript - Bootstrap 模态自动在第二个打开模态时添加右边距

javascript - 本地存储未设置

python - Bash 脚本在 python 变量上循环

Java 高级循环 : what is (not) evaluated in the loop's header?

Python 3 : List of over 100 indices cycles back around after index 47. 为什么?我该如何阻止呢?

javascript - 使用 a 标签中的链接在点击时发出 AJAX 请求

frameworks - JavaScript Windows 框架

c# - 计算字母频率

javascript - 使用 Javascript 制作表格

Javascript 数组 - 指定键