import javax.swing.; import java.awt.; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Random; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.Clip; import javax.sound.sampled.LineUnavailableException; import javax.sound.sampled.UnsupportedAudioFileException;

public class SnakeGame extends JFrame implements KeyListener { // 游戏界面大小 private final int WIDTH = 800; private final int HEIGHT = 840; // 网格大小 private static final int GRID_SIZE = 40; // 贪吃蛇移动速度 private static final int SNAKE_SPEED = GRID_SIZE; // 贪吃蛇 private final ArrayList snake = new ArrayList<>(); private Point direction = new Point(1, 0); // 贪吃蛇移动方向 private Point food; // 食物 // 记录玩家得分 private int score = 0; // 背景音乐 private Clip bgm;

public SnakeGame() {
    // 设置窗口大小和标题
    setSize(WIDTH, HEIGHT);
    setTitle('贪吃蛇小游戏');
    // 设置窗口居中
    setLocationRelativeTo(null);
    // 添加键盘监听器
    addKeyListener(this);
    // 初始化贪吃蛇和食物
    initSnake();
    initFood();
    // 播放背景音乐
    playBgm();
    // 显示窗口
    setVisible(true);
}

// 初始化贪吃蛇
private void initSnake() {
    // 初始长度为3
    snake.add(new Point(4, 2));
    snake.add(new Point(3, 2));
    snake.add(new Point(2, 2));
}

// 初始化食物
private void initFood() {
    Random random = new Random();
    int x = random.nextInt((WIDTH-2*GRID_SIZE) / GRID_SIZE);
    int y = random.nextInt((HEIGHT-2*GRID_SIZE) / GRID_SIZE);
    food = new Point(x+1, y+1);
}

// 绘制游戏界面
@Override
public void paint(Graphics g) {
    // 清空画布
    g.clearRect(0, 0, WIDTH, HEIGHT);
    // 绘制紫色方格边框

    // 绘制贪吃蛇
    g.setColor(Color.GREEN);
    for (Point p : snake) {
        g.fillRect(p.x * GRID_SIZE, p.y * GRID_SIZE, GRID_SIZE, GRID_SIZE);
    }
    // 绘制网格
            g.setColor(Color.blue);
            for (int i = 0; i < WIDTH / GRID_SIZE; i++) {
                g.drawLine(i * GRID_SIZE, 0, i * GRID_SIZE, HEIGHT);
            }
            for (int i = 0; i < HEIGHT / GRID_SIZE; i++) {
                g.drawLine(0, i * GRID_SIZE, WIDTH, i * GRID_SIZE);
            }
    // 绘制食物
    g.setColor(Color.RED);
    g.fillOval(food.x * GRID_SIZE, food.y * GRID_SIZE, GRID_SIZE, GRID_SIZE);
    // 显示得分
    g.setColor(Color.darkGray);
    g.setFont(new Font('微软雅黑', Font.PLAIN, 20));
    g.drawString('得分:' + score, 650, 100);
    //绘制黑色方格边框
    g.setColor(Color.black);
    for (int i = 0; i <WIDTH/GRID_SIZE ; i++) {
        g.fillRect(i*GRID_SIZE,0,40,40);
        g.fillRect(i*GRID_SIZE,800,40,40);
        g.fillRect(0,i*GRID_SIZE,40,40);
        g.fillRect(760,i*GRID_SIZE,40,40);
    }
}

// 重写 update() 方法,调用 paint() 方法
@Override
public void update(Graphics g) {
    paint(g);
}

// 贪吃蛇移动
private void moveSnake() {
    // 计算新的蛇头位置
    Point head = new Point(snake.get(0).x + direction.x, snake.get(0).y + direction.y);
    // 判断是否撞墙
    if (head.x < 1 || head.x >= (WIDTH / GRID_SIZE)-1 || head.y < 1 || head.y >= (HEIGHT / GRID_SIZE)-1) {
        JOptionPane.showMessageDialog(this, '你是真的菜,才' + score + '分');
        // 停止播放背景音乐
        bgm.stop();
        System.exit(0);
    }
    // 判断蛇头是否与蛇身相撞
    for (int i = 1; i < snake.size(); i++) {
        if (head.equals(snake.get(i))) {
            JOptionPane.showMessageDialog(this, '你是真的菜,才' + score + '分');
            // 停止播放背景音乐
            bgm.stop();
            System.exit(0);
        }
    }
    // 判断是否吃到食物
    if (head.equals(food)) {
        snake.add(0, head);
        initFood();
        // 如果吃到食物,则将 score 的值加上 10
        score += 10;
    } else {
        snake.add(0, head);
        snake.remove(snake.size() - 1);
    }
    // 刷新游戏界面
    repaint();
}

// 键盘按下事件处理
@Override
public void keyPressed(KeyEvent e) {
    switch (e.getKeyCode()) {
        case KeyEvent.VK_UP:
            if (direction.y != 1) {
                direction.x = 0;
                direction.y = -1;
            }
            break;
        case KeyEvent.VK_DOWN:
            if (direction.y != -1) {
                direction.x = 0;
                direction.y = 1;
            }
            break;
        case KeyEvent.VK_LEFT:
            if (direction.x != 1) {
                direction.x = -1;
                direction.y = 0;
            }
            break;
        case KeyEvent.VK_RIGHT:
            if (direction.x != -1) {
                direction.x = 1;
                direction.y = 0;
            }
            break;
    }
}

// 必须实现的方法
@Override
public void keyTyped(KeyEvent e) {
}

// 必须实现的方法
@Override
public void keyReleased(KeyEvent e) {
}

// 播放背景音乐
private void playBgm() {
    try {
        // 加载音频文件
        AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new File('bgm.WAV'));
        // 创建 Clip 播放音频
        bgm = AudioSystem.getClip();
        bgm.open(audioInputStream);
        bgm.loop(Clip.LOOP_CONTINUOUSLY);
    } catch (UnsupportedAudioFileException | IOException | LineUnavailableException e) {
        e.printStackTrace();
    }
}

public static void main(String[] args) {
    SnakeGame game = new SnakeGame();
    // 游戏循环
    while (true) {
        game.moveSnake();
        try {
            Thread.sleep(8000 / SNAKE_SPEED);
        } catch (InterruptedException i) {
            i.printStackTrace();
        }
    }
}
贪吃蛇小游戏 - 经典休闲游戏,挑战你的反应速度

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

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