Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/130.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
用于俄罗斯方块游戏的Java枚举:奇怪的行为_Java_Arraylist_Netbeans_Collections_Enums - Fatal编程技术网

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

用于俄罗斯方块游戏的Java枚举:奇怪的行为,java,arraylist,netbeans,collections,enums,Java,Arraylist,Netbeans,Collections,Enums,我一直在使用NetBeans IDE 8.2构建一个基本的Java俄罗斯方块游戏,其中包含一个表示俄罗斯方块形状的枚举。游戏有一个带有活动棋子的主板/网格。它还包含一个预览网格,用于显示将出现的下一个工件。我使用ArrayList和Collections.shuffle对形状进行排列,这样玩家就一定能在七个形状的“袋子”中得到所需的形状 一旦活动片段落地,就会进行方法调用以选择新片段(请参见代码段) 我能顺利读完前七篇。一旦一件物品落地,下一件物品就会出现在正确的位置。但是,一旦我完成了第一个包

我一直在使用NetBeans IDE 8.2构建一个基本的Java俄罗斯方块游戏,其中包含一个表示俄罗斯方块形状的枚举。游戏有一个带有活动棋子的主板/网格。它还包含一个预览网格,用于显示将出现的下一个工件。我使用ArrayList和Collections.shuffle对形状进行排列,这样玩家就一定能在七个形状的“袋子”中得到所需的形状

一旦活动片段落地,就会进行方法调用以选择新片段(请参见代码段)

我能顺利读完前七篇。一旦一件物品落地,下一件物品就会出现在正确的位置。但是,一旦我完成了第一个包,生成了第二组片段,“活动”片段不再出现,预览片段开始在屏幕上垂直上下跳跃。这就好像参考无法再确定哪个是活动工件,哪个是下一个(预览)工件。我认为问题只在第二次出现时才会出现,这不是巧合

下面是枚举的一些代码片段和选择下一部分的方法。枚举中的“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)++;
        }
    }
}
enum Tetrominoes{
SBlock(新点[]{新点(-1,0),新点(0,0),新点(-2,1),
新点(-1,1)}),
ZBlock(新点[]{新点(-2,0),新点(-1,0),新点(-1,1),
新点(0,1)}),
JBlock(新点[]{新点(-2,0),新点(-2,1),新点(-1,1),
新点(0,1)}),
LBlock(新点[]{新点(0,0),新点(-2,1),新点(-1,1),
新点(0,1)}),
对象块(新点[]{新点(-1,0),新点(0,0),新点(-1,1),
新点(0,1)}),
TBlock(新点[]{新点(-1,0),新点(-2,1),新点(-1,1),
新点(0,1)}),
IBlock(新点[]{新点(-2,0),新点(-1,0),新点(0,0),
新点(1,0)};
终点[]相对性STARTPOS;
第[]点:RRPOS;
专用Tetrominoes(点[]相对estartpos){
this.relativeStartPos=relativeStartPos;
RelativeCurpos=新点[4];
resetPos();
}
void resetPos(){
RelativeCurpos=relativeStartPos.clone();
}
作废{
对于(int i=0;i<4;i++){
(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();
}
//ArrayList声明出现在代码的前面
private ArrayList randBag=new ArrayList();
void selectBlock(){
Tetrominoes[]tetro=Tetrominoes.values();
if(randBag.isEmpty()){
集合。addAll(randBag,0,1,2,3,4,5,6);
收藏。洗牌(randBag);
}
currentBlock=tetro[nextBlock.ordinal()];
currentBlock.resetPos();
randBag.remove(0);
if(randBag.isEmpty()){
集合。addAll(randBag,0,1,2,3,4,5,6);
收藏。洗牌(randBag);
}              
nextBlock=tetro[randBag.get(0)];
nextBlock.resetPos();
}

请参见:您应该使用类,而不是枚举。Enum应该是常量,但您的Enum位置发生了变化我支持@jhamon,因为这似乎破坏了Enum应该是什么。您有7个Enum值。只有7个。俄罗斯方块游戏的棋盘上有7个以上的棋子,所以你不能用7个枚举值来代表棋盘上的所有棋子。枚举值可以表示工件的形状,但旋转和位置必须保留在其他位置。如前所述,枚举应该是不可变的。枚举包含固定的值集,因此使用枚举作为棋子意味着您的游戏应该只使用七个棋子,而您可能的意思是使用枚举作为棋子类型的表示。所以它应该更像
enum PieceType{..types here..}
类Piece{EnumType-type,int-xPosition,int-yPosition,int-rotation,…构造函数/getter/other}