javascript - 为什么俄罗斯方块会一次全部掉落而不是一次掉落?
问题描述
我在 JS 中制作俄罗斯方块。当方块下落时,它会在一次绘制中使方块到达屏幕底部,而不是慢慢接近底部。我尝试创建一个变量来存储要进行的更改,以便它只查看当前板,但没有运气。在检查了输出变量是否==
对板子之后,板子似乎在发生变化,因为它返回 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);
推荐阅读
- c - 如何使用 fread 函数从文件中下载不受限制的行?
- python - 使用烧瓶传递变量python Web应用程序时出错
- c# - 内存池之间的区别
和数组池 - c# - 将组合键与 Entity Framework Core 一起使用并将其中的一部分用作外键
- flutter - 从颤动中运行 cURL 推荐
- python - 神经网络决策边界垂直于真实边界
- java - 配置覆盖默认应用程序上下文 bean 的 Spring 的 @DataJpaTest
- javascript - 在儿童内部设置状态与作为道具发送有什么区别?
- python - 从python中的列表中遍历树进行计算?
- python - 在 python 中写入串行端口以供 arduino 使用的问题(打开灯/移动伺服等...)