21xrx.com
2025-03-23 20:36:34 Sunday
文章检索 我的文章 写文章
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编程的基本知识,例如面向对象编程、事件监听器和多线程编程等。希望读者可以掌握这些知识,并且通过自己的实践来提高自己的编程能力。

  
  

评论区