package ethereal.palace.game;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
/**
* SnakeGame 主窗口类
* 本类用于创建游戏窗口,并将游戏面板添加到窗口中,
* 游戏面板中实现了贪吃蛇的所有逻辑、绘制以及用户交互。
* @author kong
*/
public class SnakeGame extends JFrame {
/**
* 构造函数,初始化用户界面
*/
public SnakeGame() {
initUI();
}
/**
* 初始化用户界面
* 本方法创建游戏面板对象,将其添加到窗口中,
* 设置窗口标题、大小、关闭操作及居中显示。
*/
private void initUI() {
GamePanel panel = new GamePanel();
add(panel);
setResizable(false);
pack();
setTitle("贪吃蛇游戏");
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
/**
* 主方法,程序入口
* 使用 EventQueue.invokeLater 确保线程安全地创建和显示游戏窗口。
*
* @param args 命令行参数(未使用)
*/
public static void main(String[] args) {
EventQueue.invokeLater(() -> {
SnakeGame game = new SnakeGame();
game.setVisible(true);
});
}
}
/**
* 游戏面板类
* 本类继承自 JPanel,实现了贪吃蛇游戏的所有逻辑、绘制和用户交互。
* 使用 Swing 的 Timer 定时更新游戏状态,并通过 Key Bindings 实现用户控制,
* 实现了蛇的移动、碰撞检测、食物生成、蛇的增长以及游戏结束等功能。
*/
class GamePanel extends JPanel implements ActionListener {
/**
* 定义游戏面板的宽度(像素)
*/
private final int PANEL_WIDTH = 300;
/**
* 定义游戏面板的高度(像素)
*/
private final int PANEL_HEIGHT = 300;
/**
* 定义蛇与食物的单位大小(像素)
*/
private final int DOT_SIZE = 10;
/**
* 定义游戏区域内的最大单位数(即最大蛇长)
*/
private final int ALL_DOTS = (PANEL_WIDTH * PANEL_HEIGHT) / (DOT_SIZE * DOT_SIZE);
/**
* 定义随机生成食物位置时的取值范围(面板单位数)
*/
private final int RAND_POS = PANEL_WIDTH / DOT_SIZE;
/**
* 定义定时器更新延迟(毫秒)
*/
private final int DELAY = 140;
/**
* 数组存储蛇的每个部分的 x 坐标
*/
private final
Java 小游戏之贪吃蛇 Swing 实现
于 2025-02-04 19:45:46 首次发布