If you’ve ever played the classic Brick Breaker game, where the goal was to eliminate all the bricks in each level by bouncing your ball off them, then you’ll love building this game! In this article, I’ll show you how to program a Brick Breaker Game in Java with Swing. We’ll use an array to keep track of how many times each brick has been hit, as well as to determine when there are no more bricks left on the board.
Project overview: Brick Breaker Game in Java
Project Name: | Brick Breaker Game in Java |
Abstract: | It’s a GUI-based project used with the swing library to organize all the elements that work under the Brick Breaker game. |
Language Used: | Java |
IDE: | VS Code |
Java version (Recommended): | Java SE 18.0. 2.1 |
Database: | None |
Type: | Desktop Application |
Recommended for: | Beginners of Java |
Time to build: | 1-2 hours |
What you will learn?
- Data structures like 2D arrays
- Handling Classes and Object creations
- Java Swing and Java AWT for creating a user-friendly GUI
Features
- Use the left, and right keys to move the paddle left and right
- The current score is updated every time the ball hits the brick and displayed
- Game over if the ball does not hit the paddle and goes out of the border
- The player wins when all bricks are broken
Complete Code for Brick Breaker game in Java:
To detect collisions between objects, we need to use nested if statements to compare each object’s coordinates. Now, Create a project folder and a file named Main.java and add the below lines of code to it. Comments are provided for explanation.
import javax.swing.*; import java.awt.*; import java.awt.event.*; class MapGenerator { public int map [][]; public int brickWidth; public int brickHeight; // this creates the brick of size 3x7 public MapGenerator(int row, int col) { map = new int [row][col]; for (int i = 0; i < map.length; i++) { for (int j=0; j< map[0].length;j++) { map[i][j] = 1; } } brickWidth = 540/col; brickHeight = 150/row; } // this draws the bricks public void draw(Graphics2D g) { for (int i = 0; i < map.length; i++) { for (int j=0; j< map[0].length;j++) { if(map[i][j] > 0) { g.setColor(new Color(0XFF8787)); // brick color g.fillRect(j*brickWidth + 80, i*brickHeight + 50, brickWidth, brickHeight); g.setStroke(new BasicStroke(4)); g.setColor(Color.BLACK); g.drawRect(j*brickWidth + 80, i*brickHeight + 50, brickWidth, brickHeight); } } } } // this sets the value of brick to 0 if it is hit by the ball public void setBrickValue(int value, int row, int col) { map[row][col] = value; } } class GamePlay extends JPanel implements KeyListener, ActionListener { private boolean play = true; private int score = 0; private int totalBricks = 21; private Timer timer; private int delay = 8; private int playerX = 310; private int ballposX = 120; private int ballposY = 350; private int ballXdir = -1; private int ballYdir = -2; private MapGenerator map; public GamePlay() { map = new MapGenerator(3, 7); addKeyListener(this); setFocusable(true); setFocusTraversalKeysEnabled(false); timer = new Timer(delay, this); timer.start(); } public void paint(Graphics g) { //background color g.setColor(Color.YELLOW); g.fillRect(1, 1, 692, 592); map.draw((Graphics2D)g); g.fillRect(0, 0, 3, 592); g.fillRect(0, 0, 692, 3); g.fillRect(691, 0, 3, 592); g.setColor(Color.blue); g.fillRect(playerX, 550, 100, 12); g.setColor(Color.RED); // ball color g.fillOval(ballposX, ballposY, 20, 20); g.setColor(Color.black); g.setFont(new Font("MV Boli", Font.BOLD, 25)); g.drawString("Score: " + score, 520, 30); if (totalBricks <= 0) { // if all bricks are destroyed then you win play = false; ballXdir = 0; ballYdir = 0; g.setColor(new Color(0XFF6464)); g.setFont(new Font("MV Boli", Font.BOLD, 30)); g.drawString("You Won, Score: " + score, 190, 300); g.setFont(new Font("MV Boli", Font.BOLD, 20)); g.drawString("Press Enter to Restart.", 230, 350); } if(ballposY > 570) { // if ball goes below the paddle then you lose play = false; ballXdir = 0; ballYdir = 0; g.setColor(Color.BLACK); g.setFont(new Font("MV Boli", Font.BOLD, 30)); g.drawString("Game Over, Score: " + score, 190, 300); g.setFont(new Font("MV Boli", Font.BOLD, 20)); g.drawString("Press Enter to Restart", 230, 350); } g.dispose(); } @Override public void actionPerformed(ActionEvent arg0) { timer.start(); if(play) { // Ball - Pedal interaction if(new Rectangle(ballposX, ballposY, 20, 20).intersects(new Rectangle(playerX, 550, 100, 8))) { ballYdir = - ballYdir; } for( int i = 0; i<map.map.length; i++) { // Ball - Brick interaction for(int j = 0; j<map.map[0].length; j++) { // map.map[0].length is the number of columns if(map.map[i][j] > 0) { int brickX = j*map.brickWidth + 80; int brickY = i*map.brickHeight + 50; int brickWidth= map.brickWidth; int brickHeight = map.brickHeight; Rectangle rect = new Rectangle(brickX, brickY, brickWidth, brickHeight); Rectangle ballRect = new Rectangle(ballposX, ballposY, 20,20); Rectangle brickRect = rect; if(ballRect.intersects(brickRect) ) { map.setBrickValue(0, i, j); totalBricks--; score+=5; if(ballposX + 19 <= brickRect.x || ballposX +1 >= brickRect.x + brickRect.width) ballXdir = -ballXdir; else { ballYdir = -ballYdir; } } } } } ballposX += ballXdir; ballposY += ballYdir; if(ballposX < 0) { // if ball hits the left wall then it bounces back ballXdir = -ballXdir; } if(ballposY < 0) { // if ball hits the top wall then it bounces back ballYdir = -ballYdir; } if(ballposX > 670) { // if ball hits the right wall then it bounces back ballXdir = -ballXdir; } } repaint(); } @Override public void keyTyped(KeyEvent arg0) { } @Override public void keyPressed(KeyEvent arg0) { if(arg0.getKeyCode() == KeyEvent.VK_RIGHT) { // if right arrow key is pressed then paddle moves right if(playerX >= 600) { playerX = 600; } else { moveRight(); } } if(arg0.getKeyCode() == KeyEvent.VK_LEFT) { // if left arrow key is pressed then paddle moves left if(playerX < 10) { playerX = 10; } else { moveLeft(); } } if(arg0.getKeyCode() == KeyEvent.VK_ENTER) { // if enter key is pressed then game restarts if(!play) { play = true; ballposX = 120; ballposY = 350; ballXdir = -1; ballYdir = -2; score = 0; totalBricks = 21; map = new MapGenerator(3,7); repaint(); } } } public void moveRight() { // paddle moves right by 50 pixels play = true; playerX += 50; } public void moveLeft() { // paddle moves left by 50 pixels play = true; playerX -= 50; } @Override public void keyReleased(KeyEvent arg0) { } } class Main { public static void main(String[] args) { JFrame obj = new JFrame(); GamePlay gamePlay = new GamePlay(); obj.setBounds(10, 10, 700, 600); obj.setTitle("Brick Breaker"); obj.setResizable(false); obj.setVisible(true); obj.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); obj.add(gamePlay); } }
Output:
Also Read:
- Dino Game in Java
- Java Games Code | Copy And Paste
- Supply Chain Management System in Java
- Survey Management System In Java
- Phone Book in Java
- Email Application in Java
- Inventory Management System Project in Java
- Blood Bank Management System Project in Java
- Electricity Bill Management System Project in Java
- CGPA Calculator App In Java
- Chat Application in Java
- 100+ Java Projects for Beginners 2023
- Airline Reservation System Project in Java
- Password and Notes Manager in Java
- GUI Number Guessing Game in Java
- How to create Notepad in Java?
- Memory Game in Java
- Simple Car Race Game in Java
- ATM program in Java
- Drawing Application In Java
- Tetris Game in Java
- Pong Game in Java
- Hospital Management System Project in Java
- Ludo Game in Java
- Restaurant Management System Project in Java
- Flappy Bird Game in Java
- ATM Simulator In Java
- Brick Breaker Game in Java
- Best Java Roadmap for Beginners 2023
- Snake Game in Java