Javascript 在随机的时间里没有定义
我将尝试只添加相关的代码,但只是为了以防万一,它所需要的整个页面是,并随时检查它了 我正在使用canvas/javascript和它的一部分构建一个俄罗斯方块游戏Javascript 在随机的时间里没有定义,javascript,arrays,object,canvas,tetris,Javascript,Arrays,Object,Canvas,Tetris,我将尝试只添加相关的代码,但只是为了以防万一,它所需要的整个页面是,并随时检查它了 我正在使用canvas/javascript和它的一部分构建一个俄罗斯方块游戏 //drop the falling piece by one space function dropByOne(){ //loop through the four squares that make up the piece for ( i = 3; i > -1; i-- ) {
//drop the falling piece by one space
function dropByOne(){
//loop through the four squares that make up the piece
for ( i = 3; i > -1; i-- ) {
//empty old spot of piece
board[ fallingPiecePos[i].y ][ fallingPiecePos[i].x ] = 0;
//drop position place-holder by one row
fallingPiecePos[i].y++;
//add square to new spot
board[ fallingPiecePos[i].y ][ fallingPiecePos[i].x ] = fallingPiece;
}
}
board
是一个20*10array
,fallingPiecePos
是一个带有数值x
和y
值的对象数组,即[{y:0,x:4},{y:0,x:5},{y:0,x:6},{y:0,x:7}
(线片)或[{y:0,x:4},y:0,x:5,y:1,{x:1,{使用以下代码渲染到板中的
:
for ( i = 0; i < 4; i++ ) {
board[ fallingPiecePos[i].y ][ fallingPiecePos[i].x ] = fallingPiece;
}
(board[fallingPiecePos[i].y][fallingPiecePos[i].x]=fallingPiece;
是上述代码块的最后一行)
我有一个可以检查工件是否已经到达底部的工具,所以我很困惑为什么会发生这种情况
编辑
我在这一点上还不够清楚,它在前3-4个部件(除了部件碰撞保护之外)工作正常,并且仅在fallingPiece
具有先前保留的值时,才给出上述错误
编辑
问题似乎是这样的,我有一个数组形状
var shapes = [
[{y:0,x:4},{y:0,x:5},{y:0,x:6},{y:0,x:7}],
[{y:0,x:4},{y:0,x:5},{y:0,x:6},{y:1,x:4}],
[{y:0,x:4},{y:0,x:5},{y:0,x:6},{y:1,x:5}],
[{y:0,x:4},{y:0,x:5},{y:0,x:6},{y:1,x:6}],
[{y:0,x:4},{y:0,x:5},{y:1,x:4},{y:1,x:5}],
[{y:0,x:4},{y:0,x:5},{y:1,x:3},{y:1,x:4}],
[{y:0,x:4},{y:0,x:5},{y:1,x:5},{y:1,x:6}]
];
我有一行代码将一个形状分配给一个新的工件
fallingPiecePos = shapes[fallingPiece - 1];
似乎当我稍后引用fallingPiecePos
并更改值(fallingPiecePos[i].y++;
)时,它也会更改形状中的值
简单来说以下代码
var myArray = [
[{a:0,b:1},{a:1,b:1}],
[{a:0,b:0},{a:1,b:0}]
];
var foo = myArray[0];
foo[0].a++;
console.log(myArray[0][0][a]);
将给我1
,因为不仅foo
而且myArray
都已更新,那么我如何才能创建一个变量,该变量包含一个新的数组(foo
),其中包含myArray[0]
的值,并且可以在不更新myArray[0]
的情况下进行更新是未定义的”,这意味着无论fallingPiecePos[i].y在该时间点的值是多少,它都超出了board
数组的范围
我快速地看了一眼,它似乎总是在第四个tetromino块上抛出错误,因为它试图在板上的(x,20)位置绘制它(fallingPiecePos[I].y
在该点是20),当板只能绘制到第19行时,请记住索引从0开始,而不是从1开始
我建议您修复nothing is below
函数,以检查tetromino是否已“固定”在另一个tetromino的顶部或游戏屏幕的底部边缘。在将当前tetromino放置到位之前。“board[fallingPiecePos[i].y]未定义”,意味着无论fallingPiecePos[i].y
在该时间点的值是什么,它都超出了board
数组的范围
我快速地看了一眼,它似乎总是在第四个tetromino块上抛出错误,因为它试图在板上的(x,20)位置绘制它(fallingPiecePos[I].y
在该点是20),当板只能绘制到第19行时,请记住索引从0开始,而不是从1开始
我建议您修复nothing is below
函数,以检查tetromino是否已“固定”在另一个tetromino的顶部或游戏屏幕的底部边缘。在将当前的tetromino放置到位之前。修改write piece函数,使其如下所示:
检查小提琴:没有错误
function writePiece(){
var shapeCopy = JSON.parse(JSON.stringify(shapes));
fallingPiecePos = shapeCopy[fallingPiece - 1];
for ( i = 0; i < 4; i++ ) {
board[ fallingPiecePos[i].y ][ fallingPiecePos[i].x ] = fallingPiece;
}
}
函数writePiece(){
var shapeCopy=JSON.parse(JSON.stringify(shapes));
fallingPiecePos=形状复制[fallingPiece-1];
对于(i=0;i<4;i++){
板[fallingPiecePos[i].y][fallingPiecePos[i].x]=落件;
}
}
这应该可以解决问题。修改write piece函数,使其如下所示:
检查小提琴:没有错误
function writePiece(){
var shapeCopy = JSON.parse(JSON.stringify(shapes));
fallingPiecePos = shapeCopy[fallingPiece - 1];
for ( i = 0; i < 4; i++ ) {
board[ fallingPiecePos[i].y ][ fallingPiecePos[i].x ] = fallingPiece;
}
}
函数writePiece(){
var shapeCopy=JSON.parse(JSON.stringify(shapes));
fallingPiecePos=形状复制[fallingPiece-1];
对于(i=0;i<4;i++){
板[fallingPiecePos[i].y][fallingPiecePos[i].x]=落件;
}
}
这应该可以解决问题。您正在修改形状
数组。当一个特定的工件落下并更新其位置时,实际上是更新该数组,而不仅仅是fallingPiecePos
。这意味着当工件n
第一次落下时,它会停在第行board[19]
,但当再次选择时,它会停在不存在的board[20]
您可以在运行游戏时通过检查形状数组的内容来检查这一点-注意位置会发生变化。要解决此问题,您需要避免修改每个工件的形状数组,或者在每次选择工件时重置数组值
例如:
function writePiece() {
var copy = JSON.parse(JSON.stringify(shapes));
fallingPiecePos = copy[fallingPiece - 1];
for ( i = 0; i < 4; i++ ) {
board[ fallingPiecePos[i].y ][ fallingPiecePos[i].x ] = fallingPiece;
}
}
函数writePiece(){
var copy=JSON.parse(JSON.stringify(shapes));
fallingPiecePos=复制[fallingPiece-1];
对于(i=0;i<4;i++){
板[fallingPiecePos[i].y][fallingPiecePos[i].x]=落件;
}
}
您正在修改形状
数组。当一个特定的工件落下并更新其位置时,实际上是更新该数组,而不仅仅是fallingPiecePos
。这意味着当工件n
第一次落下时,它会停在第行board[19]
,但当再次选择时,它会停在不存在的board[20]
您可以在运行游戏时通过检查形状数组的内容来检查这一点-注意位置会发生变化。要解决此问题,您需要避免修改每个工件的形状数组,或者在每次选择工件时重置数组值
例如:
function writePiece() {
var copy = JSON.parse(JSON.stringify(shapes));
fallingPiecePos = copy[fallingPiece - 1];
for ( i = 0; i < 4; i++ ) {
board[ fallingPiecePos[i].y ][ fallingPiecePos[i].x ] = fallingPiece;
}
}
函数writePiece(){
var copy=JSON.parse(JSON.stringify(shapes));
fallingPiecePos=复制[fallingPiece-1];
对于(i=0;i<4;i++){
板[fallingPiecePos[i].y][fallingPiecePos[i].x]=落件;
}
}
如果您放置控制台.log(板[fallingPiecePos[i