BreakOut somewhat finish

This is a ridiculous game that I was able to build just by following Stanford’s CS106a. This is almost a complete game. The main part is done .It just needs a little polishing. I am moving on to the next assignment for now.


/*
 * File: Breakout.java
 * -------------------
 * Name:
 * Section Leader:
 * 
 * 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;
	
/** copied from BouncingBall.java **/
	private static final double INITIAL_SPEED = 3.0;
	
	/** pause time */
	private static final double PAUSE_TIME = 1000 /24;
	
	/** middle space  height*/
	private static final double MID_SPACE = (HEIGHT +BRICK_Y_OFFSET + (NBRICK_ROWS*BRICK_HEIGHT))/2;
	//private static final int NBRICKS_ROWS = 0;

/* Method: run() */
/** Runs the Breakout program. */
	public void run() {
		
		brick_count = NBRICKS_PER_ROW*NBRICK_ROWS; // number of bricks
		setup(); //setup the game method call
	
		int turns =NTURNS; // how many lives we have
		while(turns>0){
			moveBall();
			//gameover();
			if(ballHitsBottom(ball) || brick_count ==0){
				gameover();
				break;
			}
			if(turns != NTURNS){
				setup();
			}
			turns--;	
		}
		gameover();
	}
	
	// setup methods
	private void setup(){
		setup_bricks(); // setup the bricks
		setup_paddle(); // paddle setup
		setup_ball(); // ball setup
	}

	// gameover if the ball hits bottom or there is no more bricks
	private void gameover(){
		//return (ballHitsBottom() || noMoreBricks());
		GLabel gameover = new GLabel("GAME OVER");
		gameover.setColor(Color.RED);
		add(gameover,(WIDTH-gameover.getWidth())/2,(MID_SPACE - gameover.getAscent())/2);
		//return gameover;
	}
	
	private boolean ballHitsBottom(GOval ball){
		return ball.getY() >= HEIGHT - ball.getHeight() ;
	}
	
	// create a brick
	private void createbrick(Color color,double x, double y){
		brick = new GRect(BRICK_WIDTH,BRICK_HEIGHT); // brick is a new GRect object
		brick.setFilled(true); // it is filled
		brick.setColor(Color.WHITE); // the color is white
		brick.setFillColor(color); // set the fill color with color parameter
		add(brick,x,y); // add the brick to the x , y parameter location
	}
	// setup the bricks
	
	private void setup_bricks(){
		int init_x = 0; // initial x , the left margin of the window
		
		for (int i = 1; i <= NBRICKS_PER_ROW;i++) {  // loop through the bricks per row
			for (int j = 0;j < NBRICK_ROWS;j++){      // loop through the no. of rows
				// compute the x position which starts at 0 then add a brick then a brick separator
				int x = init_x+(j * BRICK_WIDTH)+ (j*BRICK_SEP); 
				
				//compute the y by adding offset and a brick plus separator
				int y = BRICK_Y_OFFSET+(i * BRICK_HEIGHT)+(i*BRICK_SEP);
				
				// colorize base on the row index i
				if (i==1 || i==2){
					createbrick(Color.RED,x,y);
				} else if (i==3 || i==4){
					createbrick(Color.ORANGE,x,y);
				} else if (i==5 || i==6){
					createbrick(Color.YELLOW,x,y);
				} else if (i==7 || i==8){
					createbrick(Color.GREEN,x,y);
				} else if (i==9 || i==10){
					createbrick(Color.CYAN,x,y);
				}
			}
		}
	}
		
	// setup the paddle
	private void setup_paddle(){
		// put paddle in the middle
		paddle = new GRect(getWidth()/2-PADDLE_WIDTH/2,getHeight()-PADDLE_Y_OFFSET,PADDLE_WIDTH,PADDLE_HEIGHT); 
		paddle.setFilled(true);
		paddle.setFillColor(Color.BLUE);
		paddle.setColor(Color.BLUE);
		add(paddle);
		addMouseListeners(); //adds mouse listeners
	}
	
	//track the paddle
	public void mouseMoved(MouseEvent e){
		paddle.setLocation(e.getX(), getHeight()-PADDLE_Y_OFFSET);
		if ((e.getX()+PADDLE_WIDTH)>getWidth()){
			paddle.setLocation(getWidth()-PADDLE_WIDTH, getHeight()-PADDLE_Y_OFFSET);

		}
	}
	
	// setup the ball in the middle of the screen
	private void setup_ball(){
		double startX = (WIDTH - BALL_RADIUS)/2;
		double startY = (HEIGHT +BRICK_Y_OFFSET +(BRICK_HEIGHT*NBRICK_ROWS))/2;
		ball = new GOval(BALL_RADIUS, BALL_RADIUS);
		ball.setFilled(true);
		ball.setFillColor(Color.BLACK);
		add(ball,startX,startY);
	}
	
	/*
	 * move the ball
	 */
	private void moveBall(){
		double low_vel = 1.0; // low velocity of the ball
		double high_vel = 3.0; // high velocity of the ball
		double chance = 0.5; // randomize the chance by half
		vx = rgen.nextDouble(low_vel, high_vel); // random x velocity
		if (rgen.nextBoolean(chance)){  // half the chance of ball going left or right
			vx = -vx;  // change to the opposite direction
		}
		vy = INITIAL_SPEED;  //set the initial speed
		
		waitForClick();  //wait for a click to start the game
		//while(isBallOnScreen(ball)){ //keep moving till ball disappears
		while(!ballHitsBottom(ball) || brick_count!=0){
			ball.move(vx, vy); // move by setting vx,vy 
			checkForCollisions(); //check if ball hits something
			pause(PAUSE_TIME);   //pause animation
		}
	}
	
	/**
	 * isBallOnScreen 
	 *  check for the ball location
	 * @param ball
	 * @return
	 */
	private boolean isBallOnScreen(GOval ball){
		return ball.getX() <= WIDTH-(BALL_RADIUS*2) || ball.getX() >= 0 || ball.getY() <=HEIGHT || ball.getY() >=0;
	}
	
	private void checkForCollisions(){
		collider = getCollidingObject(); //get the colliding object
		if(collider != null){
	        bounceClip.play();
			if (collider == paddle){ // if its a paddle go the opposite direction
				/*if(collider.){
					vy = -vy;
					vx = -vx;
				} else {*/
					vy = -vy;
				//}
			
			} else { // if its a brick go the opposite ,remove the brick and subtract brick count
				vy = -vy; // bounce 
				remove(collider);
				brick_count--;
			}	
		}
		
		// top 
		if (ball.getY() <= 0){
			vy = -vy;
		}
			
		// if ball hits right side
		if (ball.getX() >= WIDTH-(BALL_RADIUS) ){
			vx = -vx;
		}
		// if ball hits top 
		
		// if ball hits left side
		if (ball.getX() <= 0 ){
			vx = -vx;
		}
	}

	/**
	 * getcollidingobject
	 *  gets the colliding object by testing all four bounding corners of the ball which is just a GRect
	 * @return
	 */
	private GObject getCollidingObject(){
 		if (getElementAt(ball.getX(), ball.getY()) != null){
 			return (getElementAt(ball.getX(), ball.getY()));
 		}
 		
		if (getElementAt(ball.getX()+2*(BALL_RADIUS), ball.getY()) != null){
			return (getElementAt(ball.getX()+2*(BALL_RADIUS), ball.getY()));
		}
		
		if (getElementAt(ball.getX(),ball.getY()+2*(BALL_RADIUS)) !=null ){
		 return (getElementAt(ball.getX(),ball.getY()+2*(BALL_RADIUS)));
		}
		
		if (getElementAt(ball.getX()+2*(BALL_RADIUS),ball.getY()+2*(BALL_RADIUS)) != null){
		return (getElementAt(ball.getX()+2*(BALL_RADIUS),ball.getY()+2*(BALL_RADIUS)));
		}
		
		return null;	
			
		
		
	}
	/* Private instance variables */
	private int brick_count; // count the number of bricks
	private GRect brick; // the brick object
	private GObject collider; // the object the ball collided
	private GRect paddle; // the paddle
	private GOval ball; // the ball
	private double vx, vy; // the velocity in x and y
	private RandomGenerator rgen = RandomGenerator.getInstance(); // random generator
	AudioClip bounceClip = MediaTools.loadAudioClip("bounce.au");

}

Leave a Reply