21xrx.com
2024-09-19 08:51:33 Thursday
登录
文章检索 我的文章 写文章
Java实践:打砖块小游戏
2023-06-15 14:39:43 深夜i     --     --
Java 游戏开发 打砖块

Java一直被人们认为是一门适用于企业级开发的语言,但事实上,Java也可以用来开发游戏。本篇文章将为大家介绍如何用Java实现一个简单的打砖块小游戏。

代码实现

我们首先需要用Java编写游戏的界面和逻辑。下面是游戏的主类代码:


public class BrickBreaker extends JFrame implements KeyListener {

  private final int WIDTH = 660, HEIGHT = 500;

  private BrickPanel panel;

  public BrickBreaker() {

    setTitle("Brick Breaker");

    setSize(WIDTH, HEIGHT);

    setResizable(false);

    setDefaultCloseOperation(EXIT_ON_CLOSE);

    panel = new BrickPanel();

    add(panel);

    addKeyListener(this);

    setVisible(true);

  }

  public static void main(String[] args) {

    new BrickBreaker();

  }

  @Override

  public void keyPressed(KeyEvent e) {

    panel.keyPressed(e.getKeyCode());

  }

  @Override

  public void keyReleased(KeyEvent e) {

    panel.keyReleased(e.getKeyCode());

  }

  @Override

  public void keyTyped(KeyEvent e) { }

}

这个类继承了JFrame类,并实现了KeyListener接口。它包含一个BrickPanel实例,BrickPanel是游戏的画布,我们稍后会讲到它的实现。

接下来是BrickPanel类的代码:


public class BrickPanel extends JPanel implements ActionListener {

  private final int TIMER_DELAY = 10;

  private Timer timer;

  private Paddle paddle;

  private Ball ball;

  private ArrayList bricks;

  private int score, lives;

  public BrickPanel() {

    setBackground(Color.BLACK);

    paddle = new Paddle();

    ball = new Ball(paddle);

    bricks = new ArrayList<>();

    for (int row = 0; row < 5; row++) {

      for (int col = 0; col < 14; col++) {

        bricks.add(new Brick(col * 45 + 30, row * 25 + 50));

      }

    }

    timer = new Timer(TIMER_DELAY, this);

    timer.start();

  }

  public void keyPressed(int keyCode) {

    paddle.keyPressed(keyCode);

  }

  public void keyReleased(int keyCode) {

    paddle.keyReleased(keyCode);

  }

  @Override

  public void actionPerformed(ActionEvent e) {

    ball.move();

    paddle.move();

    checkCollisions();

    repaint();

  }

  @Override

  public void paintComponent(Graphics g) {

    super.paintComponent(g);

    Graphics2D g2 = (Graphics2D)g;

    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

    paddle.draw(g2);

    ball.draw(g2);

    for (Brick brick : bricks) {

      brick.draw(g2);

    }

    g2.setColor(Color.WHITE);

    g2.setFont(new Font("Arial", Font.BOLD, 20));

    g2.drawString("Score: " + score, 20, 30);

    g2.drawString("Lives:" + lives, getWidth() - 100, 30);

  }

  private void checkCollisions() {

    if (ball.getBounds().intersects(paddle.getBounds())) {

      ball.bounceOffPaddle();

    }

    ArrayList bricksToRemove = new ArrayList<>();

    for (Brick brick : bricks) {

      if (ball.getBounds().intersects(brick.getBounds())) {

        score += 10;

        brick.hit();

        if (brick.isDestroyed()) {

          bricksToRemove.add(brick);

        } else {

          ball.bounceOffBrick();

        }

      }

    }

    bricks.removeAll(bricksToRemove);

    if (ball.getBottom() > getHeight()) {

      lives--;

      if (lives == 0) {

        JOptionPane.showMessageDialog(this, "Game Over", "Game Over", JOptionPane.YES_NO_OPTION);

        System.exit(ABORT);

      } else {

        ball.reset();

      }

    }

    if (bricks.isEmpty()) {

      JOptionPane.showMessageDialog(this, "You Win!", "You Win!", JOptionPane.YES_NO_OPTION);

      System.exit(ABORT);

    }

  }

  private class Paddle {

    private final int WIDTH = 80, HEIGHT = 10, SPEED = 5;

    private int x, y;

    private boolean left, right;

    public Paddle() {

      x = (BrickPanel.this.getWidth() - WIDTH) / 2;

      y = BrickPanel.this.getHeight() - HEIGHT - 20;

    }

    public void draw(Graphics2D g) {

      g.setColor(Color.WHITE);

      g.fillRect(x, y, WIDTH, HEIGHT);

    }

    public void keyPressed(int keyCode) {

      if (keyCode == KeyEvent.VK_LEFT)

        left = true;

       else if (keyCode == KeyEvent.VK_RIGHT)

        right = true;

      

    }

    public void keyReleased(int keyCode) {

      if (keyCode == KeyEvent.VK_LEFT)

        left = false;

       else if (keyCode == KeyEvent.VK_RIGHT)

        right = false;

      

    }

    public void move() {

      if (left && x > 0)

        x -= SPEED;

      

      if (right && x < BrickPanel.this.getWidth() - WIDTH) {

        x += SPEED;

      }

    }

    public Rectangle getBounds() {

      return new Rectangle(x, y, WIDTH, HEIGHT);

    }

  }

  private class Ball {

    private final int DIAMETER = 20, SPEED = 5;

    private int x, y;

    private int dx = SPEED, dy = -SPEED;

    private Paddle paddle;

    public Ball(Paddle paddle) {

      this.paddle = paddle;

      x = paddle.getBounds().x + paddle.getBounds().width / 2;

      y = paddle.getBounds().y - DIAMETER;

    }

    public void move() {

      x += dx;

      y += dy;

      if (x < 0 || x + DIAMETER > BrickPanel.this.getWidth())

        dx = -dx;

      

      if (y < 0)

        dy = -dy;

      

    }

    public void bounceOffPaddle() {

      dy = -dy;

      if (x < paddle.getBounds().x + paddle.getBounds().width / 2)

        dx = -SPEED;

       else

        dx = SPEED;

      

    }

    public void bounceOffBrick()

      dy = -dy;

    

    public Rectangle getBounds() {

      return new Rectangle(x, y, DIAMETER, DIAMETER);

    }

    public int getBottom() {

      return y + DIAMETER;

    }

    public void reset() {

      x = paddle.getBounds().x + paddle.getBounds().width / 2;

      y = paddle.getBounds().y - DIAMETER;

      dx = SPEED;

      dy = -SPEED;

    }

    public void draw(Graphics2D g) {

      g.setColor(Color.WHITE);

      g.fillOval(x, y, DIAMETER, DIAMETER);

    }

  }

  private class Brick {

    private final int WIDTH = 40, HEIGHT = 20;

    private int x, y;

    private int hits;

    public Brick(int x, int y)

      this.x = x;

      this.y = y;

      hits = 3;

    

    public void hit()

      hits--;

    

    public boolean isDestroyed()

      return hits <= 0;

    

    public Rectangle getBounds() {

      return new Rectangle(x, y, WIDTH, HEIGHT);

    }

    public void draw(Graphics2D g) {

      if (hits == 3) {

        g.setColor(Color.GREEN);

      } else if (hits == 2) {

        g.setColor(Color.YELLOW);

      } else if (hits == 1) {

        g.setColor(Color.RED);

      }

      g.fillRect(x, y, WIDTH, HEIGHT);

    }

  }

}

这个类继承了JPanel类,并实现了ActionListener接口。它包含了游戏的各种元素,如球,挡板和砖块,并实现了它们的移动和碰撞检测等逻辑。

接下来是游戏运行的效果:

![](https://img-blog.csdn.net/20180501153742474)

结语

代码案例实现了一个简单的打砖块小游戏。Java虽然在游戏开发方面比不上C++和Unity等专门的游戏引擎,但对于一些简单的小游戏而言,完全是足够的。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复