import javax.swing.*; import java.awt.*; import java.awt.event.*; class BrickBreaker extends JPanel implements KeyListener, ActionListener { private boolean play = false; private int score = 0; private int totalBricks = 21; private Timer timer; private int delay = 8; private int paddleX = 310; private int ballX = 120, ballY = 350, ballXDir = -1, ballYDir = -2; private BrickGenerator map; public BrickBreaker() { map = new BrickGenerator(3, 7); addKeyListener(this); setFocusable(true); setFocusTraversalKeysEnabled(false); timer = new Timer(delay, this); timer.start(); } @Override public void paint(Graphics g) { // Background g.setColor(Color.BLACK); g.fillRect(1, 1, 692, 592); // Draw bricks map.draw((Graphics2D) g); // Borders g.setColor(Color.YELLOW); g.fillRect(0, 0, 3, 592); g.fillRect(0, 0, 692, 3); g.fillRect(691, 0, 3, 592); // Score g.setColor(Color.WHITE); g.setFont(new Font("Serif", Font.BOLD, 25)); g.drawString("Score: " + score, 550, 30); // Paddle g.setColor(Color.GREEN); g.fillRect(paddleX, 550, 100, 8); // Ball g.setColor(Color.RED); g.fillOval(ballX, ballY, 20, 20); if (totalBricks <= 0) { play = false; ballXDir = ballYDir = 0; g.setColor(Color.GREEN); g.setFont(new Font("Serif", Font.BOLD, 30)); g.drawString("You Win!", 290, 300); } if (ballY > 570) { play = false; ballXDir = ballYDir = 0; g.setColor(Color.RED); g.setFont(new Font("Serif", Font.BOLD, 30)); g.drawString("Game Over!", 270, 300); } g.dispose(); } @Override public void actionPerformed(ActionEvent e) { if (play) { if (new Rectangle(ballX, ballY, 20, 20).intersects(new Rectangle(paddleX, 550, 100, 8))) { ballYDir = -ballYDir; } for (int i = 0; i < map.map.length; i++) { for (int j = 0; j < map.map[0].length; j++) { 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 brickRect = new Rectangle(brickX, brickY, brickWidth, brickHeight); Rectangle ballRect = new Rectangle(ballX, ballY, 20, 20); if (ballRect.intersects(brickRect)) { map.setBrickValue(0, i, j); totalBricks--; score += 5; if (ballX + 19 <= brickRect.x || ballX + 1 >= brickRect.x + brickWidth) { ballXDir = -ballXDir; } else { ballYDir = -ballYDir; } break; } } } } ballX += ballXDir; ballY += ballYDir; if (ballX < 0 || ballX > 670) ballXDir = -ballXDir; if (ballY < 0) ballYDir = -ballYDir; } repaint(); } @Override public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_RIGHT) { if (paddleX < 600) { paddleX += 20; } } if (e.getKeyCode() == KeyEvent.VK_LEFT) { if (paddleX > 10) { paddleX -= 20; } } if (!play) { if (e.getKeyCode() == KeyEvent.VK_ENTER) { play = true; ballX = 120; ballY = 350; ballXDir = -1; ballYDir = -2; paddleX = 310; score = 0; totalBricks = 21; map = new BrickGenerator(3, 7); repaint(); } } } @Override public void keyReleased(KeyEvent e) {} @Override public void keyTyped(KeyEvent e) {} public static void main(String[] args) { JFrame frame = new JFrame(); BrickBreaker game = new BrickBreaker(); frame.setBounds(10, 10, 700, 600); frame.setTitle("Brick Breaker"); frame.setResizable(false); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(game); frame.setVisible(true); } } class BrickGenerator { public int[][] map; public int brickWidth; public int brickHeight; public BrickGenerator(int row, int col) { map = new int[row][col]; for (int[] rowArray : map) { java.util.Arrays.fill(rowArray, 1); } brickWidth = 540 / col; brickHeight = 150 / row; } 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(Color.BLUE); g.fillRect(j * brickWidth + 80, i * brickHeight + 50, brickWidth, brickHeight); g.setStroke(new BasicStroke(3)); g.setColor(Color.BLACK); g.drawRect(j * brickWidth + 80, i * brickHeight + 50, brickWidth, brickHeight); } } } } public void setBrickValue(int value, int row, int col) { map[row][col] = value; } }