21xrx.com
2024-09-17 04:19:53 Tuesday
登录
文章检索 我的文章 写文章
Java小游戏代码:打砖块
2023-06-15 07:06:32 深夜i     --     --
Java编程 小游戏 打砖块

在学习Java编程语言时,我们经常需要做一些小实验或者小项目来巩固所学的知识和技能。今天,我们将分享一个简单的Java小游戏代码:打砖块。

这个小游戏实现的功能是:玩家点击开始按钮后,屏幕上会出现一些砖块。玩家需要控制一个板子,使得球在板子反弹的同时打掉所有的砖块,然后就可以获得胜利。如果玩家没能在规定时间内打掉所有砖块,那么就输了。

现在,我们来看一下该游戏的具体实现。

1. 准备工作

在开始代码编写之前,我们需要确保我们已经安装了Java开发环境(JDK)和一个编程软件,例如Eclipse、IntelliJ IDEA或者Netbeans。

2. 创建项目和窗口

首先,我们需要创建一个Java项目,并且在该项目中创建一个窗口(JFrame)。这个窗口就是我们的游戏界面。


import javax.swing.JFrame;

public class Main extends JFrame {

  private static final long serialVersionUID = 1L;

  

  public Main() {

    setSize(800, 600);

    setLocationRelativeTo(null);

    setTitle("打砖块");

    setDefaultCloseOperation(EXIT_ON_CLOSE);

  }

  

  public static void main(String[] args) {

    Main game = new Main();

    game.setVisible(true);

  }

}

3. 添加开始按钮和键盘监听器

在游戏界面上添加一个开始按钮,并且监听键盘事件。玩家可以通过键盘上的方向键来控制板子的移动。


import java.awt.event.KeyEvent;

import java.awt.event.KeyListener;

import javax.swing.JButton;

import javax.swing.JFrame;

public class Main extends JFrame {

  private static final long serialVersionUID = 1L;

  

  private JButton startButton;

  private Board board;

  

  public Main() {

    setSize(800, 600);

    setLocationRelativeTo(null);

    setTitle("打砖块");

    setDefaultCloseOperation(EXIT_ON_CLOSE);

    

    startButton = new JButton("开始游戏");

    startButton.addActionListener(e -> {

      getContentPane().remove(startButton);

      board = new Board();

      getContentPane().add(board);

      pack();

      board.start();

    });

    getContentPane().add(startButton);

    pack();

    

    addKeyListener(new KeyListener() {

      @Override

      public void keyPressed(KeyEvent e) {

        if (board != null) {

          board.move(e.getKeyCode());

        }

      }

      

      @Override

      public void keyReleased(KeyEvent e)

      

      

      @Override

      public void keyTyped(KeyEvent e)

      

    });

  }

  

  public static void main(String[] args) {

    Main game = new Main();

    game.setVisible(true);

  }

}

4. 实现游戏逻辑

在游戏界面上添加一个面板(JPanel),用于显示球、板子和砖块。在这个面板的构造函数中,我们需要初始化一些游戏状态,例如球的位置、板子的位置和砖块的坐标。然后,在一些特定的时刻,例如球撞击墙壁或者砖块,我们需要更新游戏状态,并且重新绘制面板。


import java.awt.Color;

import java.awt.Graphics;

import java.awt.Rectangle;

import java.util.ArrayList;

import java.util.List;

import javax.swing.JPanel;

public class Board extends JPanel implements Runnable {

  private static final long serialVersionUID = 1L;

  

  private Ball ball;

  private Board board;

  private final int delay = 10;

  private Thread animator;

  private List bricks;

  private boolean ingame = false;

  

  public Board() {

    setBackground(Color.WHITE);

    setDoubleBuffered(true);

    

    ball = new Ball();

    board = this;

    

    bricks = new ArrayList<>();

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

      for (int j = 0; j < 10; j++) {

        bricks.add(new Brick(j * 70 + 20, i * 30 + 50));

      }

    }

    

    setFocusable(true);

  }

  

  public void start() {

    ingame = true;

    animator = new Thread(this);

    animator.start();

  }

  

  private void drawBall(Graphics g) {

    g.setColor(Color.RED);

    g.fillOval(ball.getX(), ball.getY(), Ball.getDiameter(), Ball.getDiameter());

  }

  

  private void drawBoard(Graphics g) {

    g.setColor(Color.BLUE);

    g.fillRect(board.getX(), board.getY(), Board.getWidth(), Board.getHeight());

  }

  

  private void drawBricks(Graphics g) {

    for (Brick brick : bricks) {

      g.setColor(Color.BLACK);

      g.fillRect(brick.getX(), brick.getY(), Brick.getWidth(), Brick.getHeight());

    }

  }

  

  @Override

  public void paintComponent(Graphics g) {

    super.paintComponent(g);

    

    drawBall(g);

    drawBoard(g);

    drawBricks(g);

  }

  

  private void update() {

    ball.move();

    checkCollision();

    repaint();

  }

  

  private void checkCollision() {

    Rectangle ballRect = ball.getBounds();

    Rectangle boardRect = board.getBounds();

    

    if (ballRect.intersects(boardRect)) {

      ball.setDY(-ball.getDY());

    }

    

    for (Brick brick : bricks) {

      Rectangle brickRect = brick.getBounds();

      

      if (ballRect.intersects(brickRect)) {

        bricks.remove(brick);

        ball.setDY(-ball.getDY());

        break;

      }

    }

    

    if (ball.getY() > Board.getHeight())

      ingame = false;

    

  }

  

  public void move(int keyCode) {

    if (keyCode == KeyEvent.VK_LEFT) {

      board.setX(board.getX() - 20);

    } else if (keyCode == KeyEvent.VK_RIGHT) {

      board.setX(board.getX() + 20);

    }

  }

  

  @Override

  public void run() {

    long beforeTime, timeDiff, sleep;

    beforeTime = System.currentTimeMillis();

    

    while (ingame) {

      update();

      

      timeDiff = System.currentTimeMillis() - beforeTime;

      sleep = delay - timeDiff;

      

      if (sleep < 0)

        sleep = 2;

      

      

      try {

        Thread.sleep(sleep);

      } catch (InterruptedException e) {

        System.out.println("Interrupted: " + e.getMessage());

      }

      

      beforeTime = System.currentTimeMillis();

    }

  }

}

5. 小结

通过以上的代码示例,我们可以学习到一些Java编程的基本知识,例如面向对象编程、事件监听器和多线程编程等。希望读者可以掌握这些知识,并且通过自己的实践来提高自己的编程能力。

  
  

评论区

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