2009-08-21 12 views
6

से बाहर निकल रहा है मैं ऑनलाइन प्रोग्रामिंग के लिए एक परिचय ले रहा हूं। हालांकि, मैं एक असाइनमेंट पर फंस गया हूँ।जावा ब्रेकआउट गेम बहुत जल्दी

असाइनमेंट ब्रेकआउट गेम लिखना है। मैंने सफलतापूर्वक 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); 
     } 
    } 
} 

rephrased मैं गेंद हालांकि पाश से पहले सभी ईंटों को हटा दिया गया है और गेंद उछल बंद हो जाता है निकल जाता है चारों ओर बाउंस करने के लिए मिल सकता है। जब लूप उस बिंदु तक पहुंच जाता है जिस पर सभी ईंटें चली जाएंगी तो लूप बचने के लिए तैयार है। हालांकि यह उस बिंदु तक बहुत जल्दी पहुंच रहा है।

/**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

+1

दरअसल मैं यह कहना चाहूंगा कि मुझे लगता है कि आपने जो किया वह सही था। ऐप कोड के माध्यम से स्क्रॉल करना वास्तव में मुश्किल नहीं है, और लोगों ने आपके प्रश्न का उत्तर देने के लिए इसका उपयोग किया है। आपने इसे होमवर्क के रूप में पहचाना (या कम से कम मुझे उम्मीद है कि आपने किया था) और आपने लोगों से पर्याप्त जानकारी या खराब गठित प्रश्न के बिना सामान करने के लिए नहीं कहा था। शायद मुझे इतिहास याद आया - मुझे नहीं पता कि लोगों ने इसे बंद करने के लिए क्यों वोट दिया - यह एक वैध प्रश्न है और अच्छी तरह से किया गया है। स्वागत हे। –

उत्तर

12

क्या आप इस गेम को लिखने के लिए नेटबीन्स या एक्लिप्स जैसे आईडीई का उपयोग कर रहे हैं? यदि ऐसा है, तो आप अपने कोड में कुछ ब्रेकपॉइंट्स सेट कर सकते हैं और यह हो रहा है कि यह क्या हो रहा है, यह जानने के लिए डीबग मोड में चलाएं।

मुझे लगता है कि एक तरीका है जो जांचता है कि स्कोर शून्य है और प्रोग्राम को रोकता है? उस विधि में ब्रेकपॉइंट रखें और एप्लिकेशन चलाएं - एक बार ब्रेकपॉइंट पहुंचने के बाद आप घड़ियों का उपयोग कर सकते हैं जब यह निकलता है तो आपके प्रोग्राम की स्थिति का निरीक्षण करें।

क्या आपने जांच की है कि कार्यक्रम साफ से बाहर निकल रहा है? क्या यह निश्चित रूप से एक शून्य स्कोर है जो इसे बंद कर देता है? एक अपवाद फेंक दिया जा सकता है जो आपके ऐप को निरस्त कर रहा है।

इसके अलावा, यदि आप प्रोग्रामिंग के लिए नए हैं तो डिबगिंग सीखना बहुत अच्छा कौशल है!

+1

+1 प्रोग्रामर को मछली के लिए कैसे पढ़ा जाए ;-) –

17

आपकी setUpBricks विधि में, ऐसा लगता है कि आप NBRICK_ROWS * (NBRICKS_PER_ROW + 1) ईंटें बना रहे हैं। लेकिन आपके move विधि में, आप केवल NBRICKS_PER_ROW * NBRICK_ROWS ईंटों की जांच करें।

+0

+1 कोड के बड़े हिस्से के माध्यम से wading के लिए +1। –

संबंधित मुद्दे