Javascript 为什么俄罗斯方块会一下子掉下来,而不是一次掉一个?

Javascript 为什么俄罗斯方块会一下子掉下来,而不是一次掉一个?,javascript,arrays,loops,deep-copy,tetris,Javascript,Arrays,Loops,Deep Copy,Tetris,我正在用JS制作俄罗斯方块。当使一个块落下时,它使块在一次绘制中到达屏幕底部,而不是缓慢接近底部。我试着创建一个变量来存储要进行的更改,这样它只会查看当前的板,而不会有运气。在检查输出变量是否为线路板的==后,线路板似乎在改变,因为它返回true。发生什么事了 编辑:我已成功制作了阵列的浅层副本。不过,它仍然会立即跌到谷底。发生什么事? var数据=[]; 函数数组(x,文本){ 变量y=[]; 对于(var i=0;i

我正在用JS制作俄罗斯方块。当使一个块落下时,它使块在一次绘制中到达屏幕底部,而不是缓慢接近底部。我试着创建一个变量来存储要进行的更改,这样它只会查看当前的板,而不会有运气。在检查输出变量是否为线路板的
==
后,线路板似乎在改变,因为它返回true。发生什么事了

编辑:我已成功制作了阵列的浅层副本。不过,它仍然会立即跌到谷底。发生什么事?
var数据=[];
函数数组(x,文本){
变量y=[];
对于(var i=0;i对于JavaScript中的(var i=0;i,数组和对象是通过引用传递的。因此,执行此操作时:

var dataOut = data;
这两个引用都指向同一个数组。您可以每次克隆该数组:

var dataOut = JSON.parse(JSON.stringify(data));
或者简单地还原您的循环,从下到上。我冒昧地重命名了变量以使其更清晰。请尝试以下操作:

var chars={empty:'',block:'#'},
网格=createEmptyGrid(10,20);
函数createEmptyGrid(宽度、高度){
var结果=[],x,y;
对于(y=0;y<高度;y++){
var行=[];
对于(x=0;x0;y--){
对于(x=0;xrow.join(“”)).join(“\n”)
+ '';
如果(t%20==0){
网格[0][Math.floor(Math.random()*10)]=chars.block;
}
t++;

},20);
在JavaScript中,数组和对象是通过引用传递的。因此,执行此操作时:

var dataOut = data;
这两个引用都指向同一个数组。您可以每次克隆该数组:

var dataOut = JSON.parse(JSON.stringify(data));
或者简单地还原您的循环,从下到上。我冒昧地重命名了变量以使其更清晰。请尝试以下操作:

var chars={empty:'',block:'#'},
网格=createEmptyGrid(10,20);
函数createEmptyGrid(宽度、高度){
var结果=[],x,y;
对于(y=0;y<高度;y++){
var行=[];
对于(x=0;x0;y--){
对于(x=0;xrow.join(“”)).join(“\n”)
+ '';
如果(t%20==0){
网格[0][Math.floor(Math.random()*10)]=chars.block;
}
t++;

}, 20)
每次你在一行上循环,你把
a
推到下一行。然后,在下一行,你再次遇到
a
,所以你把它推到下一行。然后,在下一行,你再次遇到它…它下降到下一行bottom@blex阅读问题。看起来应该是这样的,但我把它放在一个单独的数组中,并设置为在循环结束后,将主板连接到辅助阵列,因此在实际更改之前,它应该注意要更改的内容。我觉得您的逻辑很好。问题是所有这些代码都将同步运行-它将在一个动画帧的空间中运行,因此您将永远不会看到任何东西,只有最终产品。在我看来,您需要基于css的代码或者使用
setTimeout()
或类似工具,或者更好但更复杂的
requestAnimationFrame()的基于JavaScript的(异步)动画
@JSScratchDouble在JS中,数组和对象是通过引用传递的,而不是通过值传递的。因此,当您这样做时:
var dataOut=data;
,它们是相同的数组。使用任一引用修改它都会得到相同的结果result@avocadatoria我正在使用
requestAnimationFrame
。在这种情况下,它应该只运行一次!每次在一行上循环,你将
a
推到下面的一行。然后,在下一行上,你再次遇到
a
,因此你将它推到下面。然后,在下面的一行上,你再次遇到它…它下降到下一行bottom@blex阅读这个问题。看起来应该是这样,但我把它放在一个单独的阵列上,并将主板设置为sec循环结束后的第二个数组,因此在实际更改它之前,它应该注意要更改的内容。我觉得您的逻辑很好。问题是所有这些代码都将同步运行-它将在一个动画帧的空间中运行,因此除了最终产品之外,您永远不会看到任何东西。在我看来,您需要基于css或基于JavaScript的代码(和异步)使用
setTimeout()
或类似的方法制作动画,或者使用更好但更复杂的
requestAnimationFrame()制作动画
@JSScratchDouble在JS中,数组和对象是通过引用传递的,而不是通过值传递的。因此,当您这样做时:
var dataOut=data;
,它们是相同的数组。使用任一引用修改它都会得到相同的结果result@avocadatoria我正在使用
requestAnimationFrame
。在这种情况下,它应该只运行一次!