В JavaScript массивы и объекты передаются по ссылке. Поэтому, когда вы делаете это:
var dataOut = data;
Обе эти ссылки указывают на один и тот же массив. Вы можете клонировать массив каждый раз:
var dataOut = JSON.parse(JSON.stringify(data));
Или просто вернуть свой l oop на go снизу вверх. Я позволил себе переименовать переменные, чтобы сделать это более ясным. Попробуйте это ниже:
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 = ''
+ grid.map(row => row.join(' ')).join('\n')
+ '
'; if (t% 20 === 0) {grid [0] [Math.floor (Math.random () * 10)] = chars.block; } t ++; }, 20);