Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在随机的时间里没有定义_Javascript_Arrays_Object_Canvas_Tetris - Fatal编程技术网

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-- ) {

我将尝试只添加相关的代码,但只是为了以防万一,它所需要的整个页面是,并随时检查它了

我正在使用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-- ) {
            //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*10
array
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