我将尝试仅添加相关代码,但以防万一其所需的整页为here,也可以随时在github上进行查看。

我正在使用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 arrayfallingPiecePos是具有数字xy值的对象的数组,即[{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:4},{y:1,x:5}](正方形),并渲染为board,包含以下代码:

for ( i = 0; i < 4; i++ ) {
    board[ fallingPiecePos[i].y ][ fallingPiecePos[i].x ] = fallingPiece;
}


fallingPiece是一个随机分配的数字(1-7),由canvas使用该数字将作品呈现为正确的颜色。

希望这很清楚,现在的问题是,每当fallingPiece具有它在我得到之前所拥有的值

TypeError: board[fallingPiecePos[i].y] is undefined
[Break On This Error]

board[ fallingPiecePos[i].y ][ fallingPiecePos[i].x ] = fallingPiece;


board[ fallingPiecePos[i].y ][ fallingPiecePos[i].x ] = fallingPiece;是以上代码块的最后一行)

我有一个function nothingIsBelow(),它检查棋子是否到达底部,所以我很困惑为什么会发生这种情况。

编辑

我在这一点上还不够清楚,然后才可以对前3-4个块进行正常工作(除了用于块碰撞保护),并且仅当fallingPiece具有先前保持的值时才给我上述错误

编辑

看来问题是这样的,我有一个数组shapes

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++;)时,它也更改了shapes中的值

简单来说,以下代码

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]

最佳答案

您正在修改shapes数组。当特定的一块掉落并更新其位置时,实际上是更新该数组,而不是仅仅更新fallingPiecePos。这意味着,当片段n第一次下降时,它会在行board[19]处停止,但是当再次选择它时,它会以board[20]结束,而该不存在。

您可以通过在运行游戏时检查shapes数组的内容来检查此问题-请注意位置会发生变化。要解决此问题,您需要避免为每块修改形状数组或每次选择一块时重置数组值。

例:

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;
    }
}

09-11 18:48