CS106A assignment4 --gameBreakout

    /*
     * File: Breakout.java
     * -------------------
     * Name:ZhendongYi
     * Email:myyizhendong@gmail.com
     * Time:2016/07/02
     * 
     * 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;
        
        /** Color of bricks */
        private static final Color[] colors={Color.red,Color.red,Color.orange,Color.orange,
                Color.yellow,Color.yellow,Color.green,Color.green,Color.blue,Color.blue};
    
        public void run() {
            createPaddle();
            createBricks();
            createBallAndBounce();
            
    
        }
    
        private GRect paddle;
        
        /** coordinates of the paddle */
        private static int paddleX = (WIDTH - PADDLE_WIDTH)/2;
        private static int paddleY = (HEIGHT - PADDLE_HEIGHT-PADDLE_Y_OFFSET);
        
        /** create a paddle */
        private void createPaddle() {
            
            paddle = new GRect(paddleX,paddleY,PADDLE_WIDTH,PADDLE_HEIGHT);
            paddle.setFilled(true);
            add(paddle);
            
            addMouseListeners();
        }
        
        /** when mouse moves the paddle moves horizontally , too*/
        public void mouseMoved(MouseEvent e){
            paddleX = e.getX();
            if(paddleX > WIDTH - PADDLE_WIDTH) paddleX = WIDTH - PADDLE_WIDTH;
            paddle.setLocation(paddleX,paddleY);
        }
        
        /** create several rows bricks */
        public void createBricks(){
            for(int i = 0;i<NBRICK_ROWS;i++){
                createRowBricks(colors[i],i);
            }
        }
        
        private GRect brick ;
        
        /** create a row of bricks */
        private void createRowBricks(Color color,int row) {
            for(int i = 0;i<NBRICKS_PER_ROW;i++){
                
                //coordinates of the bricks
                int x = BRICK_SEP*(i+1) +i * BRICK_WIDTH;
                int y = BRICK_Y_OFFSET + row*BRICK_HEIGHT + BRICK_SEP*row;
                brick = new GRect(x,y,BRICK_WIDTH,BRICK_HEIGHT);
                brick.setColor(getBackground());;
                brick.setFilled(true);
                brick.setFillColor(color);
                add(brick);
            }
        }
    
        /** create a ball in the central window and bounce the ball */
        private void createBallAndBounce(){
            GOval ball = createBall();
            add(ball);
            bounceBall(ball);
        }
    
        /** coordinates of the ball */
        private static int ballX = (WIDTH - BALL_RADIUS*2)/2;
        private static int ballY = (WIDTH - BALL_RADIUS*2)/2;
        
        private GOval createBall() {
            GOval ball = new GOval(ballX,ballY,BALL_RADIUS*2,BALL_RADIUS*2);
            ball.setFilled(true);
            return ball;
        }
        
        /** the pause time */
        private static final double PAUSE_TIME = 500.0 / 48;
    
        /** the velocity of the ball*/
        private double vx,vy;
        
        /**number of removed bricks,when it becomes number of bricks,the game is over */
        private static int numOfRemovedBricks=0;
                
        /** number of floorCollision,when it becomes 3,the game is over,too.*/
        private static int floorCollision=0; 
        
        private void bounceBall(GOval ball){
            
            //choose the vx component randomly
            RandomGenerator rgen = RandomGenerator.getInstance();
            vx = rgen.nextDouble(1.0,3.0);
            if(rgen.nextBoolean(0.5)) vx = -vx;
            vy = 3.0;
            
            while(true){
                
                ball.move(vx, vy);
                turn(ball);
                
                //get the collider
                GObject collider = getCollidingObject(ball);
                if(collider == paddle){
                    vy = -vy;
                }else if(collider == null){
                    
                }else{
                    remove(collider);
                    numOfRemovedBricks++;
                    vy = -vy;
                }
                pause(PAUSE_TIME);
                
                if(gameIsOver(floorCollision,numOfRemovedBricks)){
                    break;
                }
            }
        }
    
        private boolean gameIsOver(int floorCollision, int numOfRemovedBricks) {
            if(floorCollision==3 || numOfRemovedBricks == NBRICKS_PER_ROW*NBRICK_ROWS) return true; 
            else return false;
        }
    
        /** when the ball collides the wall ,the ball turns */
        private void turn(GOval ball) {
            if(ballBelowFloor(ball)){
                vy = -vy;
                floorCollision++;
            }
            if(ballAboveCeiling(ball)){
                vy = -vy;
            }
            if(ballLeftWall(ball)){
                vx = -vx;
            }
            if(ballRightWall(ball)){
                vx = -vx;
            }
        }
    
        /** get the collider ,maybe null or brick or paddle */
        private GObject getCollidingObject(GOval ball) {
            // TODO Auto-generated method stub
            GObject collider = getElementAt(ball.getX(),ball.getY());
            if(collider!=null) return collider;
            else {
                collider = getElementAt(ball.getX() + BALL_RADIUS*2,ball.getY());
                if(collider!=null) return collider;
                else{
                    collider = getElementAt(ball.getX() + BALL_RADIUS*2,ball.getY()+ BALL_RADIUS*2);
                    if(collider!=null) return collider;
                    else{
                        collider = getElementAt(ball.getX(),ball.getY()+ BALL_RADIUS*2);
                        if(collider!=null) return collider;
                    }
                }
            }
            return null;
        }
    
        private boolean ballBelowFloor(GOval ball) {
            return (ball.getY()+BALL_RADIUS*2)>=HEIGHT;
        }
    
        private boolean ballAboveCeiling(GOval ball) {
            return ball.getY()<=0;
        }
    
        private boolean ballLeftWall(GOval ball) {
            return ball.getX()<=0;
        }
    
        private boolean ballRightWall(GOval ball) {
            return ball.getX()+BALL_RADIUS*2>=WIDTH;
        }
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,738评论 5 472
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,377评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,774评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,032评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,015评论 5 361
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,239评论 1 278
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,724评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,374评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,508评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,410评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,457评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,132评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,733评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,804评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,022评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,515评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,116评论 2 341

推荐阅读更多精彩内容