Java贪吃蛇游戏代码示例 - 从零实现经典游戏
使用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()方法:绘制游戏画面,包括食物和蛇。
- 继承自
如何运行代码
- 将代码保存为
SnakeGame.java文件。 - 使用Java编译器编译代码:
javac SnakeGame.java - 运行编译后的class文件:
java SnakeGame
现在你就可以玩到自己编写的贪吃蛇游戏了!
原文地址: https://www.cveoy.top/t/topic/QpK 著作权归作者所有。请勿转载和采集!