117.info
人生若只如初见

Java实现贪吃蛇游戏

下面是一个简单的Java实现贪吃蛇游戏的示例代码:

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class SnakeGame extends JFrame implements KeyListener {
private static final int WIDTH = 400;
private static final int HEIGHT = 400;
private static final int UNIT_SIZE = 20;
private static final int GAME_UNITS = (WIDTH * HEIGHT) / (UNIT_SIZE * UNIT_SIZE);
private static final int DELAY = 75;
private final List snakeX = new ArrayList<>();
private final List snakeY = new ArrayList<>();
private int appleX;
private int appleY;
private char direction = 'R';
private boolean running = false;
private Timer timer;
private final Random random;
public SnakeGame() {
random = new Random();
setTitle("Snake Game");
setSize(WIDTH, HEIGHT);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
setLocationRelativeTo(null);
setVisible(true);
addKeyListener(this);
startGame();
}
private void startGame() {
newApple();
running = true;
timer = new Timer(DELAY, e -> gameLoop());
timer.start();
snakeX.add(WIDTH / 2);
snakeY.add(HEIGHT / 2);
}
private void gameLoop() {
move();
checkCollision();
repaint();
}
private void move() {
for (int i = snakeX.size() - 1; i > 0; i--) {
snakeX.set(i, snakeX.get(i - 1));
snakeY.set(i, snakeY.get(i - 1));
}
switch (direction) {
case 'U':
snakeY.set(0, snakeY.get(0) - UNIT_SIZE);
break;
case 'D':
snakeY.set(0, snakeY.get(0) + UNIT_SIZE);
break;
case 'L':
snakeX.set(0, snakeX.get(0) - UNIT_SIZE);
break;
case 'R':
snakeX.set(0, snakeX.get(0) + UNIT_SIZE);
break;
}
}
private void checkCollision() {
// 检查是否撞到自己
for (int i = snakeX.size() - 1; i > 0; i--) {
if (snakeX.get(0).equals(snakeX.get(i)) && snakeY.get(0).equals(snakeY.get(i))) {
gameOver();
}
}
// 检查是否撞到边界
if (snakeX.get(0) < 0 || snakeX.get(0) >= WIDTH || snakeY.get(0) < 0 || snakeY.get(0) >= HEIGHT) {
gameOver();
}
// 检查是否吃到苹果
if (snakeX.get(0).equals(appleX) && snakeY.get(0).equals(appleY)) {
snakeX.add(snakeX.get(snakeX.size() - 1));
snakeY.add(snakeY.get(snakeY.size() - 1));
newApple();
}
}
private void gameOver() {
running = false;
timer.stop();
}
private void newApple() {
appleX = random.nextInt((WIDTH / UNIT_SIZE)) * UNIT_SIZE;
appleY = random.nextInt((HEIGHT / UNIT_SIZE)) * UNIT_SIZE;
}
@Override
public void paint(Graphics g) {
g.clearRect(0, 0, WIDTH, HEIGHT);
// 画网格
for (int i = 0; i < WIDTH / UNIT_SIZE; i++) {
g.drawLine(i * UNIT_SIZE, 0, i * UNIT_SIZE, HEIGHT);
}
for (int i = 0; i < HEIGHT / UNIT_SIZE; i++) {
g.drawLine(0, i * UNIT_SIZE, WIDTH, i * UNIT_SIZE);
}
// 画蛇
for (int i = 0; i < snakeX.size(); i++) {
g.setColor(Color.GREEN);
g.fillRect(snakeX.get(i), snakeY.get(i), UNIT_SIZE, UNIT_SIZE);
}
// 画苹果
g.setColor(Color.RED);
g.fillOval(appleX, appleY, UNIT_SIZE, UNIT_SIZE);
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_UP:
if (direction

未经允许不得转载 » 本文链接:https://www.117.info/ask/fe2ceAzsLBg5UBFI.html

推荐文章

  • java构造方法有哪些特点

    以下是Java构造方法的特点: 构造方法的名称必须与类的名称完全相同。 构造方法没有返回类型,包括void类型。 构造方法在类被实例化时自动调用,用于初始化对象的...

  • java方法重写和重载的区别是什么

    Java方法重写(Override)和重载(Overload)是面向对象编程中的两个重要概念,它们的区别如下: 定义:重写是指在子类中重新实现父类中已存在的方法,方法名、参...

  • java怎么让编译不报错

    要让Java编译不报错,你需要确保以下几点: 语法错误:检查代码中的拼写错误、缺少分号、括号不匹配等语法问题,并进行修正。 类型错误:确保变量的类型匹配,比...

  • java中Pattern.compile()报错问题怎么解决

    要解决Java中Pattern.compile()方法报错的问题,可以遵循以下步骤: 检查正则表达式是否正确:首先,确保你提供的正则表达式语法是正确的。你可以使用在线正则表...

  • C#中的GDI+图像编程详解

    GDI+是C#中用于图像处理和绘图的一种图形设备接口(Graphics Device Interface)。使用GDI+可以实现图像的加载、保存、绘制、变换、裁剪等各种操作。
    下面是...

  • Python海龟绘图详解

    海龟绘图是Python中一个常用的库,用于绘制各种图形。它通过控制一个虚拟的海龟在屏幕上移动来实现绘图功能。下面是Python海龟绘图的详细解释。 导入库 首先需要...

  • 正则表达式匹配不包含某些字符串的技巧

    正则表达式提供了一些技巧来匹配不包含某些字符串的情况。下面是一些常用的技巧: 使用否定预查:否定预查通过在匹配的字符串前面加上(?!)来实现。例如,正则表达...

  • 基于Qt实现视频播放器功能

    基于Qt实现视频播放器功能,可以按照以下步骤进行: 导入QtMultimedia模块和QtWidgets模块: #include #include 创建一个QWidget对象作为主窗口: QWidget *main...