随机时间变得不确定

时间:2013-11-13 20:22:17

标签: javascript arrays object canvas tetris

我将尝试仅添加相关代码,但以防万一需要整页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;
}

fallingPiececanvas用于将作品呈现为正确颜色的随机分配的数字(1-7)。

希望这一点足够清楚,现在的问题是每当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已更新,因此如何制作包含 new 数组的变量({ {1}})保留foo的值,可以在不更新myArray[0]的情况下进行更新。

3 个答案:

答案 0 :(得分:3)

board [fallingPiecePos [i] .y]未定义”,表示fallingPiecePos[i].y在该时间点的任何值,超出范围< / {> board数组。

我快速看了一下,它似乎总是在第四个tetromino片上抛出错误,因为它试图在board上的(x,20)位置绘制它(fallingPiecePos[i].y此时为20 ),当board只能绘制到第19行时,请记住索引从0开始而不是1。

我建议你修复你的nothingIsBelow功能,检查tetromino是否已经“安顿”在另一个tetromino或游戏屏幕的下边缘。在将当前的tetromino放到位之前。

答案 1 :(得分:3)

您正在修改shapes数组。当一个特定的部分落下并且你更新它的位置时,你实际上更新了该数组而不仅仅是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; 
    } 
}

答案 2 :(得分:0)

将您的写作函数修改为如下所示:

查看小提琴:http://jsfiddle.net/RJe86/11/ - 没有错误

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

那应该解决它。