使用Java实现经典贪吃蛇游戏

想要学习如何使用Java编写游戏吗?本教程将带你从零开始创建一个经典的贪吃蛇游戏。我们将使用Java的Swing框架构建游戏界面,并实现游戏逻辑,包括蛇的移动、食物的生成、碰撞检测等。

代码示例

以下是完整的Java贪吃蛇游戏代码:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class SnakeGame extends JFrame {
    private Snake snake;
    private Timer timer;
    private int delay = 100; // 控制蛇移动的延迟时间(毫秒)
    
    public SnakeGame() {
        setTitle('贪吃蛇游戏');
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);
        setVisible(true);
        setSize(400, 400);
        setLocationRelativeTo(null);
        snake = new Snake();
        timer = new Timer(delay, new GameLoop());
        timer.start();
        add(snake);
        addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                snake.keyPressed(e);
            }
        });
    }
    
    private class GameLoop implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            snake.move();
            snake.checkCollision();
            snake.repaint();
        }
    }
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new SnakeGame();
            }
        });
    }
}

class Snake extends JPanel {
    private int tileSize = 20; // 方格大小
    private int width = 20; // 游戏面板的宽度(方格数)
    private int height = 20; // 游戏面板的高度(方格数)
    private int[] x = new int[width * height]; // 每个方格的 x 坐标
    private int[] y = new int[width * height]; // 每个方格的 y 坐标
    private int snakeSize = 3; // 蛇的初始长度
    private int direction = KeyEvent.VK_RIGHT; // 蛇的移动方向
    private int foodX; // 食物的 x 坐标
    private int foodY; // 食物的 y 坐标
    
    public Snake() {
        setBackground(Color.BLACK);
        setFocusable(true);
        generateFood();
        initializeSnake();
    }
    
    private void initializeSnake() {
        for (int i = 0; i < snakeSize; i++) {
            x[i] = width * tileSize / 2 - i * tileSize;
            y[i] = height * tileSize / 2;
        }
    }
    
    private void generateFood() {
        foodX = (int) (Math.random() * width) * tileSize;
        foodY = (int) (Math.random() * height) * tileSize;
    }
    
    public void move() {
        for (int i = snakeSize; i > 0; i--) {
            x[i] = x[i - 1];
            y[i] = y[i - 1];
        }
        switch (direction) {
            case KeyEvent.VK_UP:
                y[0] -= tileSize;
                break;
            case KeyEvent.VK_DOWN:
                y[0] += tileSize;
                break;
            case KeyEvent.VK_LEFT:
                x[0] -= tileSize;
                break;
            case KeyEvent.VK_RIGHT:
                x[0] += tileSize;
                break;
        }
    }
    
    public void checkCollision() {
        if (x[0] < 0 || x[0] >= width * tileSize || y[0] < 0 || y[0] >= height * tileSize) {
            gameOver();
        }
        for (int i = snakeSize - 1; i > 0; i--) {
            if (x[0] == x[i] && y[0] == y[i]) {
                gameOver();
            }
        }
        if (x[0] == foodX && y[0] == foodY) {
            snakeSize++;
            generateFood();
        }
    }
    
    private void gameOver() {
        JOptionPane.showMessageDialog(this, '游戏结束', '游戏结束', JOptionPane.PLAIN_MESSAGE);
        System.exit(0);
    }
    
    public void keyPressed(KeyEvent e) {
        int key = e.getKeyCode();
        if (key == KeyEvent.VK_UP && direction != KeyEvent.VK_DOWN) {
            direction = KeyEvent.VK_UP;
        } else if (key == KeyEvent.VK_DOWN && direction != KeyEvent.VK_UP) {
            direction = KeyEvent.VK_DOWN;
        } else if (key == KeyEvent.VK_LEFT && direction != KeyEvent.VK_RIGHT) {
            direction = KeyEvent.VK_LEFT;
        } else if (key == KeyEvent.VK_RIGHT && direction != KeyEvent.VK_LEFT) {
            direction = KeyEvent.VK_RIGHT;
        }
    }
    
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.RED);
        g.fillRect(foodX, foodY, tileSize, tileSize);
        g.setColor(Color.GREEN);
        for (int i = 0; i < snakeSize; i++) {
            g.fillRect(x[i], y[i], tileSize, tileSize);
        }
    }
}

代码解释

  • SnakeGame 类:
    • 继承自 JFrame,表示游戏窗口。
    • 创建 Snake 对象,作为游戏面板。
    • 创建 Timer 对象,控制游戏循环(蛇的移动、碰撞检测等)。
    • 处理键盘事件,控制蛇的移动方向。
  • Snake 类:
    • 继承自 JPanel,表示游戏面板。
    • 使用数组存储蛇的身体位置(每个元素代表一个方格)。
    • move() 方法:控制蛇的移动,根据方向更新蛇头位置,并移动身体。
    • checkCollision() 方法:检测蛇是否撞到边界或自身,以及是否吃到食物。
    • gameOver() 方法:游戏结束时弹出提示框。
    • keyPressed() 方法:处理键盘事件,改变蛇的移动方向。
    • paintComponent() 方法:绘制游戏画面,包括食物和蛇。

如何运行代码

  1. 将代码保存为 SnakeGame.java 文件。
  2. 使用Java编译器编译代码:javac SnakeGame.java
  3. 运行编译后的class文件:java SnakeGame

现在你就可以玩到自己编写的贪吃蛇游戏了!

Java贪吃蛇游戏代码示例 - 从零实现经典游戏

原文地址: https://www.cveoy.top/t/topic/QpK 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录