俄罗斯方块游戏中使用的Java枚举:奇怪的行为

时间:2018-06-18 07:19:36

标签: java arraylist netbeans collections enums

使用NetBeans IDE 8.2,我一直在构建一个基本的Java Tetris游戏,其中包含代表Tetromino形状的枚举。游戏有一个主板/网格与活动件。它还包含一个预览网格,以显示将出现的下一个部分。我使用ArrayList和Collections.shuffle来排列形状,以便玩家确定在特定的" bag"中获得所需的形状。七种形状。

一旦活动件落地,就会调用一个方法来选择一个新件(参见代码片段)。

我能够毫无问题地完成前七件作品。一旦一件落地,下一件就出现在适当的位置。然而,一旦我通过第一个袋子并且生成了第二组件,那么"活动"片段不再出现,预览片开始在屏幕上垂直上下跳跃。好像参考不再能确定哪个是活动部分,哪个是下一个(预览)部分。我认为问题只发生在一件作品第二次出现时并非巧合。

以下是枚举的一些代码片段以及选择下一部分的方法。 " resetPos()"枚举中的方法是重置其相对位置,以便从板上的正确位置生成。你能看出我出错的地方吗?非常感谢你的帮助!

enum Tetrominoes {
    SBlock(new Point[]{new Point(-1,0), new Point(0,0), new Point(-2,1),
        new Point(-1,1)}),
    ZBlock(new Point[]{new Point(-2,0), new Point(-1,0), new Point(-1,1),
        new Point(0,1)}),
    JBlock(new Point[]{new Point(-2,0), new Point(-2,1), new Point(-1,1),
        new Point(0,1)}),
    LBlock(new Point[]{new Point(0,0), new Point(-2,1), new Point(-1,1),
        new Point(0,1)}),
    OBlock(new Point[]{new Point(-1,0), new Point(0,0), new Point(-1,1),
        new Point(0,1)}),
    TBlock(new Point[]{new Point(-1,0), new Point(-2,1), new Point(-1,1),
        new Point(0,1)}),
    IBlock(new Point[]{new Point(-2,0), new Point(-1,0), new Point(0,0),
        new Point(1,0)});

    final Point[] relativeStartPos;
    Point[] relativeCurrPos;

    private Tetrominoes(Point[] relativeStartPos) {
        this.relativeStartPos = relativeStartPos;
        relativeCurrPos = new Point[4];
        resetPos();
    }

    void resetPos() {
        relativeCurrPos = relativeStartPos.clone();
    }

    void down() {
        for(int i = 0; i < 4; i++) {
            (relativeCurrPos[i].y)++;
        }
    }
}

// ******

// ArrayList declaration appearing earlier in code
private ArrayList<Integer> randBag = new ArrayList<Integer>();

void selectBlock() {
    Tetrominoes[] tetro = Tetrominoes.values();
    if(randBag.isEmpty()) {
        Collections.addAll(randBag, 0, 1, 2, 3, 4, 5, 6);
        Collections.shuffle(randBag);
    }
    currentBlock = tetro[nextBlock.ordinal()];
    currentBlock.resetPos();

    randBag.remove(0);
    if(randBag.isEmpty()) {
        Collections.addAll(randBag, 0, 1, 2, 3, 4, 5, 6);
        Collections.shuffle(randBag);
    }              
    nextBlock = tetro[randBag.get(0)];
    nextBlock.resetPos();
}

0 个答案:

没有答案