news 2026/8/12 21:15:10

Java实现贪吃蛇完整代码

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java实现贪吃蛇完整代码

我将为您提供一个完整的 Java 贪吃蛇游戏实现代码,基于 Swing 图形界面库开发。这个实现包含了游戏的所有核心功能,包括蛇的移动、食物生成、碰撞检测和分数计算等。

完整贪吃蛇游戏代码实现

1. 主程序入口类 (SnakeGame.java)

import javax.swing.*; /** * 贪吃蛇游戏主类 * 负责创建游戏窗口和启动游戏 */ public class SnakeGame { public static void main(String[] args) { // 创建游戏窗口 JFrame frame = new JFrame("贪吃蛇游戏"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setResizable(false); // 创建游戏面板 GamePanel gamePanel = new GamePanel(); frame.add(gamePanel); // 自动调整窗口大小 frame.pack(); frame.setLocationRelativeTo(null); // 窗口居中显示 frame.setVisible(true); // 启动游戏 gamePanel.startGame(); } }

2. 游戏面板类 (GamePanel.java)

import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.LinkedList; import java.util.Random; /** * 游戏主面板类 * 处理游戏逻辑和图形绘制 */ public class GamePanel extends JPanel implements ActionListener, KeyListener { // 游戏常量 private static final int WIDTH = 600; private static final int HEIGHT = 600; private static final int UNIT_SIZE = 25; private static final int GAME_UNITS = (WIDTH * HEIGHT) / (UNIT_SIZE * UNIT_SIZE); private static final int DELAY = 75; // 蛇的身体坐标 private final LinkedList<Point> snakeBody = new LinkedList<>(); private int snakeLength = 3; // 食物坐标 private Point food; // 移动方向 private char direction = 'R'; // R:右, L:左, U:上, D:下 private char lastDirection = 'R'; // 游戏状态 private boolean running = false; private boolean paused = false; private int score = 0; // 定时器 private Timer timer; private Random random; public GamePanel() { random = new Random(); this.setPreferredSize(new Dimension(WIDTH, HEIGHT)); this.setBackground(Color.BLACK); this.setFocusable(true); this.addKeyListener(this); initGame(); } /** * 初始化游戏 */ public void initGame() { // 清空蛇身 snakeBody.clear(); // 初始化蛇的位置(在屏幕中央) int startX = WIDTH / 2 / UNIT_SIZE * UNIT_SIZE; int startY = HEIGHT / 2 / UNIT_SIZE * UNIT_SIZE; // 创建初始蛇身(3个单位长度) for (int i = 0; i < snakeLength; i++) { snakeBody.add(new Point(startX - i * UNIT_SIZE, startY)); } // 生成第一个食物 generateFood(); // 重置游戏状态 direction = 'R'; lastDirection = 'R'; score = 0; running = true; paused = false; } /** * 开始游戏 */ public void startGame() { if (timer == null) { timer = new Timer(DELAY, this); } timer.start(); } /** * 生成食物 */ private void generateFood() { int x = random.nextInt(WIDTH / UNIT_SIZE) * UNIT_SIZE; int y = random.nextInt(HEIGHT / UNIT_SIZE) * UNIT_SIZE; food = new Point(x, y); // 确保食物不会生成在蛇身上 while (snakeBody.contains(food)) { x = random.nextInt(WIDTH / UNIT_SIZE) * UNIT_SIZE; y = random.nextInt(HEIGHT / UNIT_SIZE) * UNIT_SIZE; food = new Point(x, y); } } /** * 移动蛇 */ private void move() { if (!running || paused) return; // 获取蛇头位置 Point head = snakeBody.getFirst(); Point newHead = new Point(head); // 根据方向移动蛇头 switch (direction) { case 'U': // 上 newHead.y -= UNIT_SIZE; break; case 'D': // 下 newHead.y += UNIT_SIZE; break; case 'L': // 左 newHead.x -= UNIT_SIZE; break; case 'R': // 右 newHead.x += UNIT_SIZE; break; } // 检查碰撞 if (checkCollision(newHead)) { running = false; timer.stop(); return; } // 添加新的蛇头 snakeBody.addFirst(newHead); // 检查是否吃到食物 if (newHead.equals(food)) { score += 10; generateFood(); } else { // 如果没有吃到食物,移除蛇尾 snakeBody.removeLast(); } lastDirection = direction; } /** * 检查碰撞 */ private boolean checkCollision(Point head) { // 检查墙壁碰撞 if (head.x < 0 || head.x >= WIDTH || head.y < 0 || head.y >= HEIGHT) { return true; } // 检查自身碰撞(从第二个节点开始检查,避免与头部比较) for (int i = 1; i < snakeBody.size(); i++) { if (head.equals(snakeBody.get(i))) { return true; } } return false; } /** * 绘制游戏界面 */ @Override protected void paintComponent(Graphics g) { super.paintComponent(g); draw(g); } /** * 绘制游戏元素 */ private void draw(Graphics g) { if (running) { // 绘制网格(可选) drawGrid(g); // 绘制食物 g.setColor(Color.RED); g.fillOval(food.x, food.y, UNIT_SIZE, UNIT_SIZE); // 绘制蛇 for (int i = 0; i < snakeBody.size(); i++) { Point point = snakeBody.get(i); if (i == 0) { // 蛇头 g.setColor(Color.GREEN); } else { // 蛇身 g.setColor(new Color(45, 180, 0)); } g.fillRect(point.x, point.y, UNIT_SIZE, UNIT_SIZE); // 蛇身边框 g.setColor(Color.BLACK); g.drawRect(point.x, point.y, UNIT_SIZE, UNIT_SIZE); } // 绘制分数 drawScore(g); // 如果游戏暂停,显示暂停信息 if (paused) { drawPauseMessage(g); } } else { // 游戏结束画面 gameOver(g); } } /** * 绘制网格 */ private void drawGrid(Graphics g) { g.setColor(Color.DARK_GRAY); for (int i = 0; i < WIDTH / UNIT_SIZE; i++) { g.drawLine(i * UNIT_SIZE, 0, i * UNIT_SIZE, HEIGHT); g.drawLine(0, i * UNIT_SIZE, WIDTH, i * UNIT_SIZE); } } /** * 绘制分数 */ private void drawScore(Graphics g) { g.setColor(Color.WHITE); g.setFont(new Font("Arial", Font.BOLD, 20)); g.drawString("得分: " + score, 10, 25); } /** * 绘制暂停信息 */ private void drawPauseMessage(Graphics g) { g.setColor(Color.YELLOW); g.setFont(new Font("Arial", Font.BOLD, 40)); String message = "游戏暂停"; FontMetrics metrics = getFontMetrics(g.getFont()); g.drawString(message, (WIDTH - metrics.stringWidth(message)) / 2, HEIGHT / 2); g.setFont(new Font("Arial", Font.PLAIN, 20)); String subMessage = "按空格键继续"; metrics = getFontMetrics(g.getFont()); g.drawString(subMessage, (WIDTH - metrics.stringWidth(subMessage)) / 2, HEIGHT / 2 + 40); } /** * 游戏结束画面 */ private void gameOver(Graphics g) { // 游戏结束文字 g.setColor(Color.RED); g.setFont(new Font("Arial", Font.BOLD, 50)); String message = "游戏结束"; FontMetrics metrics = getFontMetrics(g.getFont()); g.drawString(message, (WIDTH - metrics.stringWidth(message)) / 2, HEIGHT / 2 - 50); // 显示最终分数 g.setColor(Color.WHITE); g.setFont(new Font("Arial", Font.BOLD, 30)); String scoreMessage = "最终得分: " + score; metrics = getFontMetrics(g.getFont()); g.drawString(scoreMessage, (WIDTH - metrics.stringWidth(scoreMessage)) / 2, HEIGHT / 2); // 重新开始提示 g.setFont(new Font("Arial", Font.PLAIN, 20)); String restartMessage = "按 R 键重新开始游戏"; metrics = getFontMetrics(g.getFont()); g.drawString(restartMessage, (WIDTH - metrics.stringWidth(restartMessage)) / 2, HEIGHT / 2 + 50); } /** * 定时器事件处理 */ @Override public void actionPerformed(ActionEvent e) { if (running) { move(); repaint(); } } /** * 键盘按下事件处理 */ @Override public void keyPressed(KeyEvent e) { switch (e.getKeyCode()) { case KeyEvent.VK_LEFT: if (lastDirection != 'R') direction = 'L'; break; case KeyEvent.VK_RIGHT: if (lastDirection != 'L') direction = 'R'; break; case KeyEvent.VK_UP: if (lastDirection != 'D') direction = 'U'; break; case KeyEvent.VK_DOWN: if (lastDirection != 'U') direction = 'D'; break; case KeyEvent.VK_SPACE: // 空格键暂停/继续游戏 if (running) { paused = !paused; repaint(); } break; case KeyEvent.VK_R: // R键重新开始游戏 if (!running) { initGame(); startGame(); } break; } } // 其他键盘事件方法(必须实现) @Override public void keyTyped(KeyEvent e) {} @Override public void keyReleased(KeyEvent e) {} }

游戏功能特性说明

核心游戏机制

功能模块实现方式技术要点
蛇移动使用 LinkedList 存储坐标,定时更新方向控制、防反向移动
食物生成随机坐标生成,避免与蛇身重叠Random 类使用、碰撞检测
碰撞检测边界检测 + 自身碰撞检测坐标比较算法
分数系统吃到食物加分简单的累加计分
游戏状态运行/暂停/结束状态管理布尔标志位控制

游戏操作说明

// 键盘控制映射表 方向键控制:↑↓←→ 控制蛇的移动方向 空格键:暂停/继续游戏 R 键:游戏结束后重新开始

技术实现亮点

  1. 图形界面:使用 Swing 的 JPanel 和 Graphics 进行图形绘制
  2. 事件处理:通过 KeyListener 实现键盘控制
  3. 定时更新:使用 Timer 实现游戏循环
  4. 数据结构:LinkedList 高效管理蛇身坐标
  5. 碰撞检测:精确的边界和自身碰撞判断

运行说明

要运行这个贪吃蛇游戏,您需要:

  1. 将上述两个类文件保存为SnakeGame.javaGamePanel.java
  2. 使用 Java 编译器编译:javac *.java
  3. 运行主程序:java SnakeGame

这个实现包含了贪吃蛇游戏的所有核心功能,代码结构清晰,注释详细,适合学习和进一步扩展 。您可以根据需要调整游戏速度、界面大小或添加更多功能如关卡系统、特殊食物等。


参考来源

  • Java实现贪吃蛇大作战小游戏(完整版)
  • Java实现贪吃蛇小游戏
  • JavaSE项目 | 纯Java实现贪吃蛇小游戏
  • Java实现贪吃蛇游戏
  • Java贪吃蛇全代码
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/12 21:15:05

Oracle 19c部署实战:从环境准备到生产级安装的完整指南

1. 从零开始的Oracle 19c部署&#xff1a;不只是点击“下一步”如果你正在准备搭建一个数据库环境&#xff0c;无论是为了学习、测试&#xff0c;还是为某个关键应用做准备&#xff0c;Oracle Database 19c&#xff08;19.3版本&#xff09;大概率是你的候选之一。作为Oracle长…

作者头像 李华
网站建设 2026/8/12 21:12:57

Flutter+OpenHarmony跨平台二维码扫描开发实战

1. 项目概述&#xff1a;FlutterOpenHarmony的跨平台二维码扫描方案 在移动应用开发领域&#xff0c;跨平台框架与新兴操作系统的结合总能碰撞出令人惊喜的火花。这次我们要探讨的是如何用Flutter为OpenHarmony系统开发一个功能完备的二维码扫描应用。不同于传统的Android/iOS双…

作者头像 李华
网站建设 2026/8/12 21:11:24

国产化之Gauss数据库性能优化方案

文章目录 一、性能优化概述 1.1 优化目标 1.2 优化原则 1.3 优化策略 二、性能分析诊断流程 2.1 性能问题识别 2.1.1 性能指标监控 2.1.2 性能瓶颈识别 2.2 性能分析工具 2.2.1 系统监控 2.2.2 数据库监控视图 三、SQL优化策略 3.1 单节点查询优化 3.1.1 分片键使用原则 3.1.2 …

作者头像 李华
网站建设 2026/8/12 21:08:24

算法——贪心

贪心算法就是一种直觉上更优的策略交换论证法本质通过把假设的最优策略的前后选择交换&#xff0c;如果可以证明&#xff1a;在任何情况下&#xff0c;最优策略可以不失去最优性而转化成贪心策略&#xff0c;说明贪心策略就是最优的一种表现形式例题理解题意可以发现&#xff0…

作者头像 李华
网站建设 2026/8/12 21:06:29

从RAG到智能体:构建自演进企业级AI助手的三大支柱

1. 项目概述&#xff1a;从单点工具到智能工作流的进化最近和几个做AI应用落地的朋友聊天&#xff0c;发现一个挺有意思的现象&#xff1a;大家前两年还在热火朝天地搞“长文档RAG”&#xff0c;今年风向一转&#xff0c;全在聊“Agent Skill”和“知识库的持续更新”了。这背后…

作者头像 李华