Java贪吃蛇用Swing实现,核心模块包括图形界面(JPanel绘图)、Timer驱动循环、键盘方向控制、ArrayList<Point>管理蛇身、Random生成不重叠食物、坐标比对完成撞墙/撞己检测。

用 Swing 搭建游戏画布与主窗口
继承 JPanel 作为绘图区域,重写 paintComponent(Graphics g) 方法绘制蛇身、食物和分数;主窗口用 JFrame 封装面板,并设置大小、关闭行为和焦点获取(键盘监听必需):
- 窗口尺寸建议设为网格整数倍(如 600×600),配合单元格大小(如 20×20),方便坐标对齐
- 调用
setFocusable(true)和requestFocusInWindow()确保键盘事件能被正确捕获 - 背景用
super.paintComponent(g)清屏,避免拖影
用 Timer 驱动游戏循环
不用手动开线程,直接使用 javax.swing.Timer 实现稳定帧率:
- 定时器间隔(如 120ms)决定蛇移动快慢,数值越小速度越快
- Timer 的 ActionListener 中集中处理:更新蛇位置 → 检测碰撞 → 判断是否吃到食物 → 触发重绘
- 暂停/继续只需调用
timer.start()或timer.stop(),状态由布尔变量控制
用 List + Point 管理蛇身与移动逻辑
蛇本质是一串有序坐标点,头部新增、尾部移除即可模拟移动:
- 用 ArrayList<Point> 存储身体各节,索引 0 为蛇头
- 每次移动:根据当前方向计算新头坐标,
add(0, newHead)插入头部;若未吃食物,再remove(size-1)删除尾部 - 禁止 180° 反向:比如当前是 RIGHT,按键 LEFT 应被忽略(在 KeyListener 中提前拦截)
用随机坐标 + 碰撞排除生成食物
食物不是固定位置,而是每次被吃掉后重新生成,且不能落在蛇身上:
立即学习“Java免费学习笔记(深入)”;
- 用 Random 在网格范围内生成 x、y(如
rand.nextInt(GRID_WIDTH)) - 生成后遍历蛇身 List,检查是否与任一节重合;冲突则重试,直到找到空位
- 绘制时用实心椭圆或矩形,颜色区别于蛇身(如红色),增强视觉识别
用坐标比对完成两类碰撞检测
游戏结束只发生在两种情况,判断都基于蛇头坐标(Point):
- 撞墙:头的 x 超出 [0, GRID_WIDTH) 或 y 超出 [0, GRID_HEIGHT)
- 撞自己:遍历蛇身从索引 1 开始(跳过自身头部),任一节坐标等于头坐标即判定失败
- 检测到任一碰撞,立即停止 Timer,弹出提示框(JOptionPane),并可重置状态支持再玩



















