如何在java中停止俄罗斯方块?

如何在java中停止俄罗斯方块?,java,swing,tetris,Java,Swing,Tetris,我正在为俄罗斯方块游戏编写一个代码,但我对棋子的移动有问题。我让他们左右下移动,我让他们旋转,但当他们到达底线时,我无法让他们停下来,在顶端画一个新的。以下是我的课程: 每个形状的形状类扩展了一个抽象的形状类,我在这里也做了旋转部分 public class TShape extends Shape{ public TShape(int x, int y, int w, int h) { super(x, y, w, h); } public void draw(Grap

我正在为俄罗斯方块游戏编写一个代码,但我对棋子的移动有问题。我让他们左右下移动,我让他们旋转,但当他们到达底线时,我无法让他们停下来,在顶端画一个新的。以下是我的课程:

每个形状的形状类扩展了一个抽象的形状类,我在这里也做了旋转部分

  public class TShape extends Shape{

   public TShape(int x, int y, int w, int h) {
    super(x, y, w, h);

}

public void draw(Graphics g){

    if (TetrisFrame.turn ==0){
        g.setColor(Color.LIGHT_GRAY);
        g.fillRect(x, y, w, h);

        g.setColor(Color.BLACK);
        g.drawRect(x, y, w, h);


        g.setColor(Color.LIGHT_GRAY);
        g.fillRect(x+w, y, w, h);

        g.setColor(Color.BLACK);
        g.drawRect(x+w, y, w, h);


        g.setColor(Color.LIGHT_GRAY);
        g.fillRect(x+2*w, y, w, h);

        g.setColor(Color.BLACK);
        g.drawRect(x+2*w, y, w, h);


        g.setColor(Color.LIGHT_GRAY);
        g.fillRect(x+w, y+h, w, h);

        g.setColor(Color.BLACK);
        g.drawRect(x+w, y+h, w, h);

    }

 if(TetrisFrame.turn ==1){
    g.setColor(Color.LIGHT_GRAY);
    g.fillRect(x-w, y, w, h);

    g.setColor(Color.BLACK);
    g.drawRect(x-w, y, w, h);


    g.setColor(Color.LIGHT_GRAY);
    g.fillRect(x-w, y+h, w, h);

    g.setColor(Color.BLACK);
    g.drawRect(x-w, y+h, w, h);


    g.setColor(Color.LIGHT_GRAY);
    g.fillRect(x-2*w, y+h, w, h);

    g.setColor(Color.BLACK);
    g.drawRect(x-2*w, y+h, w, h);


    g.setColor(Color.LIGHT_GRAY);
    g.fillRect(x-w, y+2*h, w, h);

    g.setColor(Color.BLACK);
    g.drawRect(x-w, y+2*h, w, h);

}


 if (TetrisFrame.turn ==2){

     g.setColor(Color.LIGHT_GRAY);
        g.fillRect(x-2*w, y-h, w, h);

        g.setColor(Color.BLACK);
        g.drawRect(x-2*w, y-h, w, h);

        g.setColor(Color.LIGHT_GRAY);
        g.fillRect(x-3*w, y, w, h);

        g.setColor(Color.BLACK);
        g.drawRect(x-3*w, y, w, h);

        g.setColor(Color.LIGHT_GRAY);
        g.fillRect(x-2*w, y, w, h);

        g.setColor(Color.BLACK);
        g.drawRect(x-2*w, y, w, h);

        g.setColor(Color.LIGHT_GRAY);
        g.fillRect(x-w, y, w, h);

        g.setColor(Color.BLACK);
        g.drawRect(x-w, y, w, h);

 }

 if (TetrisFrame.turn ==3){

     g.setColor(Color.LIGHT_GRAY);
        g.fillRect(x-w, y-3*h, w, h);

        g.setColor(Color.BLACK);
        g.drawRect(x-w, y-3*h, w, h);

        g.setColor(Color.LIGHT_GRAY);
        g.fillRect(x-w, y-2*h, w, h);

        g.setColor(Color.BLACK);
        g.drawRect(x-w, y-2*h, w, h);

        g.setColor(Color.LIGHT_GRAY);
        g.fillRect(x-w, y-h, w, h);

        g.setColor(Color.BLACK);
        g.drawRect(x-w, y-h, w, h);

        g.setColor(Color.LIGHT_GRAY);
        g.fillRect(x, y-2*h, w, h);

        g.setColor(Color.BLACK);
        g.drawRect(x, y-2*h, w, h);

     }

   }
 }   
“绘制”面板以绘制形状:

public class DrawPanel extends JPanel{
int x = 150;
int y =0;
int h=30;
int w=30;

Shape s;

public DrawPanel(){

    s = new TShape(x,y,w,h);
}

public void paintComponent(Graphics g){

     super.paintComponent(g);
    s.draw(g);

    }
我的俄罗斯方块框架和处理程序:

public class TetrisFrame extends JFrame{

 DrawPanel dp;

 static int turn;

public TetrisFrame(){

    dp= new DrawPanel();
    dp.setBorder(new LineBorder(new Color(0, 0, 0), 3));

    MyHandler mhd = new MyHandler();

    this.addKeyListener(mhd);

    getContentPane().add(dp);


}

class MyHandler implements KeyListener{

    @Override
    public void keyPressed(KeyEvent e) {

        //left:37,  right:39,  up:38  down:40

        int code = e.getKeyCode();

        if(code == 37){

            dp.s.x -=30;

        }
       if(code == 38){

           turn++;

           if (turn ==4)
               turn =0;
        }

        if(code == 39){

           dp.s.x +=30;

         }

       if(code == 40){

          dp.s.y +=30;
           if(dp.s.y == 17*30){

              JOptionPane.showMessageDialog(null, "fvgbhn");

          }
     }




    }

    @Override
    public void keyReleased(KeyEvent arg0) {
        // TODO Auto-generated method stub
         dp.repaint();

    }

    @Override
    public void keyTyped(KeyEvent arg0) {
        // TODO Auto-generated method stub

    }



  }
}

我该怎么做才能让它工作

更新:我尝试了发布的代码,但是有很多错误。你确定你已经发布了完整的代码吗?如果您希望维护代码的隐私,那没关系,您可以尝试以下方法。

我明白了。您还没有设置工件是否到达底部的条件

首先,不应该为块的高度和宽度设置变量。您应该给它一个预定义的值,如
10
(以像素为单位)

假设您要将边框设置为矩形
0、0、300、500
,这将是您的代码:

if (TetrisFrame.turn ==0){

if(y+h >= 500)
{
    g.setColor(Color.LIGHT_GRAY);
    g.fillRect(x, (500 - h), w, h);

    g.setColor(Color.BLACK);
    g.drawRect(x, (500 - h), w, h);

    g.setColor(Color.LIGHT_GRAY);
    g.fillRect(x+w, (500 - h), w, h);

    g.setColor(Color.BLACK);
    g.drawRect(x+w, (500 - h), w, h);


    g.setColor(Color.LIGHT_GRAY);
    g.fillRect(x+2*w, (500 - h), w, h);

    g.setColor(Color.BLACK);
    g.drawRect(x+2*w, (500 - h), w, h);


    g.setColor(Color.LIGHT_GRAY);
    g.fillRect(x+w, 500, w, h);

    g.setColor(Color.BLACK);
    g.drawRect(x+w, 500, w, h);
}
else
{
    g.setColor(Color.LIGHT_GRAY);
    g.fillRect(x, y, w, h);

    g.setColor(Color.BLACK);
    g.drawRect(x, y, w, h);


    g.setColor(Color.LIGHT_GRAY);
    g.fillRect(x+w, y, w, h);

    g.setColor(Color.BLACK);
    g.drawRect(x+w, y, w, h);


    g.setColor(Color.LIGHT_GRAY);
    g.fillRect(x+2*w, y, w, h);

    g.setColor(Color.BLACK);
    g.drawRect(x+2*w, y, w, h);


    g.setColor(Color.LIGHT_GRAY);
    g.fillRect(x+w, y+h, w, h);

    g.setColor(Color.BLACK);
    g.drawRect(x+w, y+h, w, h);
}
}

我也添加了我的Tshape类,它可以到达底部,但我不能让它在框架顶部绘制一个新的形状。使您的区块下降的逻辑在哪里?你需要一个引擎类来让你的tetrominos下降,它调用另一个类来检查碰撞,一旦它与另一个块碰撞,停止并生成另一个。您将拥有某种类型的tetromino列表,drawing类将使用它来绘制每个tetromino。我不会使用这个架构,当块在屏幕中间消失时会很困难。但只要你玩得开心:)