使用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();
}