当前位置: 首页 > news >正文

如何使用Java实现简易贪吃蛇游戏

用Java实现一个简单的蛇游戏,关键是掌握图形界面绘制、键盘控制、蛇的移动逻辑和碰撞检测。以下是基于Swing的简单实现思路和代码结构,适合初学者理解核心机制。

1. 游戏基本结构设计

使用javax.通过继承JPanel定义绘制蛇和食物,swing创建窗口和绘图,利用timer控制游戏循环。

主要类包括:

  • SnakeGame:主窗类继承JFrame
  • GamePanel:负责绘制和逻辑更新的游戏面板

2. 蛇的表达和移动

蛇可以用坐标列表来表示,每个节点都是身体的一部分。头部的移动方向决定了整体方向。

方向用枚举或常量表示:

UP, DOWN, LEFT, RIGHT

每次移动时,在头部添加新的坐标,在尾部移除一节(吃食物时不要删除尾巴)。

3. 定时刷新键盘控制和键盘控制

将KeyListener监控方向键添加到GamePanel中,以改变移动方向。使用javax.swing.timer定期调用repaint(),触发游戏更新:

  • 每隔200毫秒更新一次位置
  • paintcomponent重写paintcom(Graphics g)画蛇身和食物的方法

4. 食品生成与碰撞检测

网格中随机出现食物(避开蛇身)。可以存储一个Point对象的位置。

每帧检测:

  • 头是否接触到食物 → 蛇变长,重生食物
  • 头是否出界或撞击自己? → 游戏结束

以下是简化的核心代码片段:

public class GamePanel extends JPanel implements ActionListener, KeyListener { private final int WIDTH = 400, HEIGHT = 400; private final int UNIT_SIZE = 20; private final int GAME_UNITS = (WIDTH * HEIGHT) / (UNIT_SIZE * UNIT_SIZE); <pre class='brush:java;toolbar:false;'>private List<Point> snake = new ArrayList<>(); private Point food; private String direction = "RIGHT"; private boolean running = true; private Timer timer; public GamePanel() { this.setPreferredSize(new Dimension(WIDTH, HEIGHT)); this.setBackground(Color.BLACK); this.setFocusable(true); this.addKeyListener(this); // 初始化蛇 snake.add(new Point(0, 0)); snake.add(new Point(-UNIT_SIZE, 0)); snake.add(new Point(-2 * UNIT_SIZE, 0)); generateFood(); timer = new Timer(200, this); timer.start(); } public void move() { Point head = new Point(snake.get(0)); switch (direction) { case "UP": head.y -= UNIT_SIZE; break; case "DOWN": head.y += UNIT_SIZE; break; case "LEFT": head.x -= UNIT_SIZE; break; case "RIGHT": head.x += UNIT_SIZE; break; } snake.add(0, head); if (head.equals(food)) { generateFood(); } else { snake.remove(snake.size() - 1); } } public void checkCollision() { Point head = snake.get(0); // 撞墙 if (head.x < 0 || head.x >= WIDTH || head.y < 0 || head.y >= HEIGHT) running = false; // 撞自己 for (int i = 1; i < snake.size(); i++) { if (head.equals(snake.get(i))) running = false; } } public void generateFood() { Random rand = new Random(); int x = rand.nextInt(WIDTH / UNIT_SIZE) * UNIT_SIZE; int y = rand.nextInt(HEIGHT / UNIT_SIZE) * UNIT_SIZE; food = new Point(x, y); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); if (running) { // 画食物 g.setColor(Color.RED); g.fillOval(food.x, food.y, UNIT_SIZE, UNIT_SIZE); // 画蛇 g.setColor(Color.GREEN); for (Point p : snake) { g.fillRect(p.x, p.y, UNIT_SIZE, UNIT_SIZE); } } else { // 游戏结束提示 g.setColor(Color.WHITE); g.drawString("Game Over", WIDTH/2 - 30, HEIGHT/2); } } @Override public void actionPerformed(ActionEvent e) { if (running) { move(); checkCollision(); } repaint(); } @Override public void keyPressed(KeyEvent e) { switch(e.getKeyCode()) { case KeyEvent.VK_LEFT: if (!direction.equals("RIGHT")) direction = "LEFT"; break; case KeyEvent.VK_RIGHT: if (!direction.equals("RIGHT")) direction = "LEFT"; break; case KeyEvent.VK_RIGHT: if (!direction.equals("LEFT")) direction = "RIGHT"; break; case KeyEvent.VK_UP: if (!direction.equals("DOWN")) direction = "UP"; break; case KeyEvent.VK_DOWN: if (!direction.equals("UP")) direction = "DOWN"; break; } }

}基本上就是这样。运行后,你会看到一条绿蛇向右移动,按方向键控制,吃红色食物生长。虽然游戏很简单,但它涵盖了事件处理、绘图、定时器和基本数据结构的应用。在此基础上,可以增加分数、难度或音效。

http://www.jsqmd.com/news/528788/

相关文章:

  • 别再只用K-Means了!用Python手把手教你实现分裂层次聚类(附完整代码与可视化)
  • 总线伺服机械臂开发核心:正运动学建模与代码实现,从公式到全闭环控制落地
  • Escape From Tarkov训练器:40+功能模块打造终极离线游戏体验
  • VSCode - Change terminal from WSL shell to Windows Powershell
  • 如何获取和使用免费OpenAI API密钥进行开发
  • 洛雪音乐音源终极指南:5分钟解锁全网高品质音乐资源
  • Laravel 2.x:早期框架特性全解析
  • 打开PFC2D的操作界面,先别急着敲代码。咱们今天要搞的这个二维岩石单轴压缩模型,核心在于怎么让颗粒乖乖排好队再被压碎。直接上硬菜,看看这个模型的骨架结构
  • Java线程安全的单例模式如何实现 双重检查锁定原理
  • 2026重庆口碑好的助听器厂家盘点,合规靠谱+服务优质,速看优选名单 - 深度智识库
  • 效果实测:IndexTTS2 V23版高采样率输出,人声更具“空气感”
  • 手把手做 200W LLC 电源:基于 LP9960 全流程设计避坑实战(原理图 + PCB+BOM)
  • 思源宋体TTF:企业级开源中文字体的价值与应用指南
  • [ 前端基础知识学习 ] Day 5
  • 2026年重庆新能源汽车公司推荐:重庆珂星汽车销售服务有限公司6-8方车/3.7-4.2米轻卡全系供应 - 品牌推荐官
  • 2026云南镀锌管厂家实用参考 适配大棚建筑桥梁工程 耐腐适配西南气候 - 深度智识库
  • 西门子S7 - 200 PLC与组态王构建旋转式滤水器控制系统
  • 终极指南:如何用MelonLoader打造你的Unity游戏模组世界 [特殊字符]
  • 20251918 2025-2026-2《网络攻防实践》第二周作业
  • 5大核心优势!Thermo:化工工程师的开源热力学计算引擎
  • Phi-3-mini-128k-instruct快速部署:使用Docker Compose一键启动
  • 【全栈实战】Spring AI + MCP:手把手教你实现“指数基金实时估值”与 AI 全链路观测系统
  • 小红书笔记采集总报错?别再用懒加载指令了,试试这个虚拟列表的破解方案
  • 解放游戏进度:Apollo Save Tool让PS4存档管理不再复杂
  • FUTURE POLICE实战:在线教育视频字幕自动对齐方案
  • 2026年国内最值得推荐的AI Agent(智能体)工具有哪些?深度解析企业级智能自动化选型指南
  • 3步揭秘存储设备真实容量:实战避坑指南
  • STM32 进阶封神之路(二十五):ESP8266 深度解析 —— 从 WiFi 通信原理到 AT 指令开发(底层逻辑 + 实战基础)
  • 20260319-编程踩坑总结
  • 跨平台实战:Windows/macOS同步部署OpenClaw与Qwen3.5-4B-Claude