2009-08-21 80 views
6

我正在网上编程介绍。但是,我被困在一项任务上。Java Breakout游戏退出太早

这个任务是写一个突破游戏。我已经成功地写了97%的游戏。然而,游戏在所有砖块被移除之前停止。有时候还剩下4块砖,有时候是11块。当计分计数器达到所有砖块消失时的点数时,程序就会停止,因此它必须提前到达这一点。

我在做什么错?

编辑:内联代码。和改写的问题

/* 
* File: Breakout.java 
* ------------------- 
* Name:Alex Godin 
* 
* This file will eventually implement the game of Breakout. 
*/ 

import acm.graphics.*; 
import acm.program.*; 
import acm.util.*; 

import java.applet.*; 
import java.awt.*; 
import java.awt.event.*; 

public class Breakout extends GraphicsProgram { 

/** Width and height of application window in pixels */ 
    public static final int APPLICATION_WIDTH = 400; 
    public static final int APPLICATION_HEIGHT = 600; 

/** Dimensions of game board (usually the same) */ 
    private static final int WIDTH = APPLICATION_WIDTH; 
    private static final int HEIGHT = APPLICATION_HEIGHT; 

/** Dimensions of the paddle */ 
    private static final int PADDLE_WIDTH = 60; 
    private static final int PADDLE_HEIGHT = 10; 

/** Offset of the paddle up from the bottom */ 
    private static final int PADDLE_Y_OFFSET = 30; 

/** Number of bricks per row */ 
    private static final int NBRICKS_PER_ROW = 10; 

/** Number of rows of bricks */ 
    private static final int NBRICK_ROWS = 10; 

/** Separation between bricks */ 
    private static final int BRICK_SEP = 4; 

/** Width of a brick */ 
    private static final int BRICK_WIDTH = 
    (WIDTH - (NBRICKS_PER_ROW - 1) * BRICK_SEP)/NBRICKS_PER_ROW; 

/** Height of a brick */ 
    private static final int BRICK_HEIGHT = 8; 

/** Radius of the ball in pixels */ 
    private static final int BALL_RADIUS = 10; 

/** Offset of the top brick row from the top */ 
    private static final int BRICK_Y_OFFSET = 70; 

/** Number of turns */ 
    private static final int NTURNS = 3; 

/**pause time*/ 
    private static final int PAUSE_TIME = 3; 

/**THE VALUE OF EACH BRICK*/ 
    private static final int BRICKVAL = 10; 

/** ivar holding the ball*/ 
    private GOval ball; 

/**The current row(for setup)*/ 
    private static int rownum = 0; 

/**The paddle*/ 
    private static GRect paddle = new GRect(PADDLE_WIDTH, PADDLE_HEIGHT); 

/**The velocity*/ 
    private static double vx, vy; 

/**the random generator*/ 
    private RandomGenerator rgen = RandomGenerator.getInstance(); 

/**bricks remaining*/ 
    private static int bricks = NBRICKS_PER_ROW * NBRICK_ROWS; 

/**the score int*/ 
    private static int scoreINT = 0; 

/**livesRemaining*/ 
    private static int livesINT = NTURNS; 

/**score label*/ 
    private static GLabel score = new GLabel("Score:" + scoreINT,0,0); 

/**lives label*/ 
    GLabel lives = new GLabel("lives :" + livesINT,0,0); 

/* Method: run() */ 
/** Runs the Breakout program */ 
    public void run() { 
     scoreAndLives(); 
     setUpBricks(); 
     paddle(); 
     addMouseListeners(); 
     addKeyListeners(); 
     vx = rgen.nextDouble(1.0, 3.0); 
     ball(); 
     move(); 
    } 

/**adds a score and life counter*/ 
    private void scoreAndLives(){ 
     score(); 
     lives(); 
    } 

/**adds a score counter*/ 
    private void score(){ 
     score.setLocation(7,7 + score.getHeight()); 
     score.setColor(Color.RED); 
     score.setFont(new Font("Serif", Font.BOLD, 24)); 
     add(score); 
    } 

/**adds a life counter*/ 
    private void lives(){ 
     lives.setLocation(WIDTH - lives.getWidth()*2 + 7,7 + lives.getHeight()); 
     lives.setColor(Color.RED); 
     lives.setFont(new Font("Serif", Font.BOLD, 24)); 
     add(lives); 
    } 

/**designs the brick */ 
    private GRect brickDesign() { 
     GRect brick = new GRect(BRICK_WIDTH, BRICK_HEIGHT); 
     brick.setFilled(true); 
     switch (rownum + 1){ 
     case 1: brick.setColor(Color.RED); break; 
     case 2: brick.setColor(Color.RED); break; 
     case 3: brick.setColor(Color.ORANGE); break; 
     case 4: brick.setColor(Color.ORANGE); break; 
     case 5: brick.setColor(Color.YELLOW); break; 
     case 6: brick.setColor(Color.YELLOW); break; 
     case 7: brick.setColor(Color.GREEN); break; 
     case 8: brick.setColor(Color.GREEN); break; 
     case 9: brick.setColor(Color.CYAN); break; 
     case 10: brick.setColor(Color.CYAN); break; 
     } 
     return brick; 
    } 

/**sets up the bricks*/ 
    private void setUpBricks(){ 
     int x=0; 
     int y=0; 
     for(int i=0; i<NBRICK_ROWS; i++){ 
     x=0; 
     y=rownum * BRICK_HEIGHT + BRICK_SEP * i + BRICK_Y_OFFSET; 
     for(int j=0; j<NBRICKS_PER_ROW + 1; j++){ 
      add(brickDesign(), x, y); 
      x=(j * BRICK_WIDTH) + (BRICK_SEP * j); 
     }                                                          
     rownum+=1; 
     } 
    } 

/**initializes the paddle*/ 
    private void paddle(){ 
     int xCenter = WIDTH/2 - PADDLE_WIDTH/2; 
     paddle.setFilled(true); 
     add(paddle, xCenter, HEIGHT-PADDLE_Y_OFFSET); 
    } 

/**moves the paddle*/ 
    public void mouseMoved(MouseEvent e){ 
     int x = e.getX(); 
     if(x < WIDTH-PADDLE_WIDTH){ 
     paddle.setLocation(x, APPLICATION_HEIGHT - PADDLE_Y_OFFSET); 
     } 
    } 

/**sets up the ball*/ 
    private void ball(){ 
     ball = new GOval(WIDTH/2 - BALL_RADIUS, HEIGHT/2 - BALL_RADIUS, BALL_RADIUS * 2, BALL_RADIUS * 2); 
     ball.setFilled(true); 
     add(ball); 
     vy = 3.0; 
    } 

/**the animation*/ 
    private void move(){ 
     if (rgen.nextBoolean(0.5)) vx = -vx; 
     while(true){ 
      ball.move(vx, vy); 
      checkWallColisions(); 
      checkCollisions(); 
      pause(PAUSE_TIME); 
      if(scoreINT == bricks * BRICKVAL){ 
       break; 
      } 
     } 
    } 

/**Checks for colisions with the wall*/ 
    private void checkWallColisions(){ 
     if(xWallCollision() == true){ 
     xColide(); 
     } 
     if(yWallCollision() == true){ 

     yColide(); 
     }   

    } 

/**what to do in case of a x collision*/ 
    private void xColide(){ 
     if(vx>0){ 
     vx = -1 * rgen.nextDouble(1.0, 3.0); 
     }else{ 
     vx = rgen.nextDouble(1.0, 3.0); 
     } 
    } 

/**what to do in case of a y collision*/ 
    private void yColide(){ 
     if(vx>0){ 
     vx = rgen.nextDouble(1.0, 3.0); 
     }else{ 
     vx = -1 * rgen.nextDouble(1.0, 3.0); 
     } 
     vy=-vy;  
    } 

/**checks for an x wall colision*/ 
    private boolean xWallCollision(){ 
     if(ball.getX() + BALL_RADIUS*2 > WIDTH){ 
     double bally=ball.getY(); 
     ball.setLocation(WIDTH-BALL_RADIUS*2, bally); 
     return true; 
     }else if(ball.getX() < 0){ 
     double bally=ball.getY(); 
     ball.setLocation(0, bally); 
     return true; 
     }else{ 
     return false; 
     } 
    } 

/**checks for a y wall colision*/ 
    private boolean yWallCollision(){ 
     if(ball.getY() > HEIGHT - BALL_RADIUS*2){ 
     return true; 
     }if(ball.getY() < 0){ 
     return true; 
     }else{ 
     return false; 
     } 
    } 

/**gets coliders*/ 
    private GObject getColidingObject(){ 
     if(getElementAt(ball.getX(), ball.getY()) != null){ 
     return getElementAt(ball.getX(), ball.getY()); 
     }else if(getElementAt(ball.getX() + BALL_RADIUS *2, ball.getY()) != null){ 
     return getElementAt(ball.getX() + BALL_RADIUS *2, ball.getY()); 
     }else if(getElementAt(ball.getX(), ball.getY() + BALL_RADIUS *2) != null){ 
     return getElementAt(ball.getX(), ball.getY() + BALL_RADIUS *2); 
     }else if(getElementAt(ball.getX() + BALL_RADIUS *2, ball.getY() + BALL_RADIUS *2) != null){ 
     return getElementAt(ball.getX() + BALL_RADIUS *2, ball.getY() + BALL_RADIUS *2); 
     }else{ 
     return null; 
     } 
    } 

/**checks for brick and paddle colisions*/ 
    private void checkCollisions(){ 
     GObject colider = getColidingObject(); 
     if(colider == paddle){ 
     yColide(); 
     }else if(colider == lives || colider == score){ 

     }else if(colider != null){ 
     yColide(); 
     remove(colider); 
     scoreINT+=BRICKVAL; 
     score.setLabel("Score:" + scoreINT); 
     } 
    } 
} 

我能拿到球反弹,但是所有的砖块已经被移除,球停止反弹前的环逃逸。当分数达到所有砖块消失的点时,循环设置为逃脱。然而,它很早就达到这一点。

/**the animation*/ 
private void move(){ 
     if (rgen.nextBoolean(0.5)) vx = -vx; 
       while(true){ 
         checkCollisions(); 
         ball.move(vx, vy); 
         checkWallColisions(); 
         pause(PAUSE_TIME); 
         //where i'm having issues - the loop is set to escape when the score reaches the point at which all the bricks will be gone but the score is reaching that point too early 
         if(scoreINT == bricks * BRICKVAL){ 
           break; 
         } 
       } 
} 

/**gets coliders*/ 
private GObject getColidingObject(){ 
     if(getElementAt(ball.getX(), ball.getY()) != null){ 
       return getElementAt(ball.getX(), ball.getY()); 
     }else if(getElementAt(ball.getX() + BALL_RADIUS *2, ball.getY()) != null){ 
       return getElementAt(ball.getX() + BALL_RADIUS *2, ball.getY()); 
     }else if(getElementAt(ball.getX(), ball.getY() + BALL_RADIUS *2) != null){ 
       return getElementAt(ball.getX(), ball.getY() + BALL_RADIUS *2); 
     }else if(getElementAt(ball.getX() + BALL_RADIUS *2, ball.getY() + BALL_RADIUS *2) != null){ 
       return getElementAt(ball.getX() + BALL_RADIUS *2, ball.getY() + BALL_RADIUS *2); 
     }else{ 
       return null; 
     } 
} 

/**checks for brick and paddle colisions*/ 
private void checkCollisions(){ 
     GObject colider = getColidingObject(); 
     if(colider == paddle){ 
       yColide(); 
     }else if(colider == lives || colider == score){}else if(colider != null){ 
       remove(colider); 
       yColide(); 
     } 
} 
+10

欢迎,亚历克斯。我很高兴看到你这个年龄段的人对编程感兴趣。不幸的是,我不得不阻止你粘贴你的整个应用程序进行审查。相反,如果您怀疑计数方法存在问题,则应该再次查看它,并询问有关实施的具体问题。保持良好的工作,我希望能看到你更多! – Sampson 2009-08-21 15:56:32

+1

其实我想说,我认为你所做的是关于完美的。滚动应用程序代码真的不难,人们用它来回答你的问题。你认为它是家庭作业(或者至少我希望你做到了),而且你没有要求人们做没有足够信息或形式不好的问题。 也许我错过了历史 - 我不知道为什么人们投票结束它 - 这是一个有效的问题,做得很好。欢迎。 – 2009-08-21 18:23:53

回答

12

您是否在使用Netbeans或Eclipse等IDE来编写此游戏?如果是这样,你可以在你的代码中设置一些断点并在调试模式下运行它来试图找出发生了什么。

我认为有一种方法可以检查得分是否为零并中止程序?在该方法中放置一个断点并运行应用程序 - 一旦达到断点,您可以使用Watches在退出时观察程序的状态。

你是否检查过该程序是干净地退出?它绝对是一个零分,关闭它?抛出异常可能会导致您的应用中止。另外,如果你是编程新手,那么调试是一门很好的学习技巧!

+1

+1教程程序员如何钓鱼;-) – 2009-08-21 16:29:49

17

在你的setUpBricks方法,它看起来像你创建NBRICK_ROWS * (NBRICKS_PER_ROW + 1)砖。但在您的move方法中,您只能检查NBRICKS_PER_ROW * NBRICK_ROWS砖。

+0

用于涉水大块代码。 – 2009-08-21 16:05:24