java编写一个贪吃蛇小游戏,具有存档功能和难度调整功能

时间: 2023-12-03 13:42:03 浏览: 36
这是一个简单的Java贪吃蛇小游戏示例,具有存档和难度调整功能。在游戏中,玩家通过控制蛇的移动来吃食物并获得分数,蛇的长度会随着吃下的食物增加而增加,如果蛇头碰到了墙壁或者自己的身体,则游戏结束。 ```java import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.ArrayList; import java.util.Random; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.Timer; public class SnakeGame extends JPanel implements ActionListener, KeyListener { private static final long serialVersionUID = 1L; // 游戏界面的大小 private static final int WIDTH = 600; private static final int HEIGHT = 600; // 蛇的初始长度 private static final int INITIAL_SNAKE_LENGTH = 5; // 蛇头的位置 private Point head; // 蛇的身体 private ArrayList<Point> body; // 食物的位置 private Point food; // 游戏的分数 private int score; // 游戏的速度 private int speed; // 游戏的难度 private int difficulty; // 游戏是否结束 private boolean gameOver; // 游戏是否在运行 private boolean running; // 游戏的计时器 private Timer timer; public SnakeGame() { setPreferredSize(new Dimension(WIDTH, HEIGHT)); setBackground(Color.BLACK); setFocusable(true); addKeyListener(this); // 初始化游戏 initGame(); } // 初始化游戏 private void initGame() { head = new Point(WIDTH / 2, HEIGHT / 2); body = new ArrayList<Point>(); for (int i = 0; i < INITIAL_SNAKE_LENGTH; i++) { body.add(new Point(head.x - i * 20, head.y)); } food = new Point(); generateFood(); score = 0; speed = 150; difficulty = 1; gameOver = false; running = false; timer = new Timer(speed, this); timer.stop(); } // 生成食物的位置 private void generateFood() { Random random = new Random(); int x = random.nextInt(WIDTH / 20) * 20; int y = random.nextInt(HEIGHT / 20) * 20; food.setLocation(x, y); } // 保存游戏 private void saveGame() { try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("snake.sav")))) { oos.writeObject(head); oos.writeObject(body); oos.writeObject(food); oos.writeInt(score); oos.writeInt(speed); oos.writeInt(difficulty); oos.flush(); System.out.println("Game saved."); } catch (IOException e) { e.printStackTrace(); } } // 加载游戏 private void loadGame() { try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("snake.sav")))) { head = (Point) ois.readObject(); body = (ArrayList<Point>) ois.readObject(); food = (Point) ois.readObject(); score = ois.readInt(); speed = ois.readInt(); difficulty = ois.readInt(); System.out.println("Game loaded."); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } } // 开始游戏 public void startGame() { running = true; timer.start(); } // 结束游戏 private void endGame() { running = false; gameOver = true; timer.stop(); JOptionPane.showMessageDialog(this, "Game Over! Your score is " + score + ".", "Game Over", JOptionPane.INFORMATION_MESSAGE); initGame(); } @Override public void actionPerformed(ActionEvent e) { if (!gameOver) { // 移动蛇的身体 for (int i = body.size() - 1; i > 0; i--) { body.get(i).setLocation(body.get(i - 1)); } // 移动蛇的头 if (head.x == food.x && head.y == food.y) { body.add(new Point(head)); generateFood(); score += 10 * difficulty; } if (head.x < 0 || head.x >= WIDTH || head.y < 0 || head.y >= HEIGHT) { endGame(); } else { for (int i = 1; i < body.size(); i++) { if (head.x == body.get(i).x && head.y == body.get(i).y) { endGame(); } } } if (!gameOver) { switch (difficulty) { case 1: speed = 150; break; case 2: speed = 100; break; case 3: speed = 50; break; } timer.setDelay(speed); switch (direction) { case KeyEvent.VK_LEFT: head.translate(-20, 0); break; case KeyEvent.VK_RIGHT: head.translate(20, 0); break; case KeyEvent.VK_UP: head.translate(0, -20); break; case KeyEvent.VK_DOWN: head.translate(0, 20); break; } } repaint(); } } @Override public void paintComponent(Graphics g) { super.paintComponent(g); g.setColor(Color.WHITE); g.setFont(new Font("Arial", Font.BOLD, 20)); g.drawString("Score: " + score, 10, 30); g.drawString("Difficulty: " + difficulty, 400, 30); g.setColor(Color.GREEN); g.fillRect(food.x, food.y, 20, 20); g.setColor(Color.WHITE); for (Point p : body) { g.fillRect(p.x, p.y, 20, 20); } if (gameOver) { g.setFont(new Font("Arial", Font.BOLD, 40)); g.drawString("Game Over", WIDTH / 2 - 100, HEIGHT / 2 - 20); } } private int direction; @Override public void keyPressed(KeyEvent e) { int keyCode = e.getKeyCode(); if (keyCode == KeyEvent.VK_LEFT || keyCode == KeyEvent.VK_RIGHT || keyCode == KeyEvent.VK_UP || keyCode == KeyEvent.VK_DOWN) { if (direction == 0 || direction != keyCode - 2 && direction != keyCode + 2) { direction = keyCode; } } else if (keyCode == KeyEvent.VK_SPACE) { if (running) { timer.stop(); running = false; } else { timer.start(); running = true; } } else if (keyCode == KeyEvent.VK_S) { saveGame(); } else if (keyCode == KeyEvent.VK_L) { loadGame(); } else if (keyCode == KeyEvent.VK_1) { difficulty = 1; } else if (keyCode == KeyEvent.VK_2) { difficulty = 2; } else if (keyCode == KeyEvent.VK_3) { difficulty = 3; } } @Override public void keyReleased(KeyEvent e) { } @Override public void keyTyped(KeyEvent e) { } public static void main(String[] args) { JFrame frame = new JFrame("Snake Game"); SnakeGame game = new SnakeGame(); frame.getContentPane().add(game); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); game.startGame(); } } ``` 该游戏具有以下功能: - 初始化游戏:在游戏开始前,创建蛇的初始状态、食物的位置、分数、速度、难度等状态。 - 生成食物:随机生成食物的位置。 - 保存游戏:在游戏进行中,可以按下“S”键保存游戏状态。 - 加载游戏:在游戏开始前,可以按下“L”键加载游戏状态。 - 开始游戏:在游戏开始前,可以调用startGame()方法开始游戏。 - 结束游戏:在游戏结束时,弹出对话框显示分数,并初始化游戏状态。 - 移动蛇的身体:在每一次计时器事件中,更新蛇的身体位置。 - 移动蛇的头:在每一次计时器事件中,根据方向更新蛇头位置。 - 判断游戏是否结束:在每一次计时器事件中,判断蛇是否碰到墙壁或者自己的身体。 - 保存游戏:在游戏进行中,可以按下“S”键保存游戏状态。 - 加载游戏:在游戏开始前,可以按下“L”键加载游戏状态。 - 调整难度:在游戏进行中,可以按下“1”、“2”、“3”键调整游戏难度。 在这个示例中,我们使用了Java的面向对象特性,将游戏界面封装为一个JPanel,通过添加KeyListener来监听用户的输入,使用Timer来控制游戏的运行。同时,我们还使用了Java的序列化机制来保存和加载游戏状态,实现了游戏的存档功能。

相关推荐

最新推荐

recommend-type

使用Python第三方库pygame写个贪吃蛇小游戏

今天看到几个关于pygame模块的博客和视频,感觉非常有趣,这里照猫画虎写了一个贪吃蛇小游戏,目前还有待完善,但是基本游戏功能已经实现,下面是代码: # 导入模块 import pygame import random # 初始化 pygame....
recommend-type

nodejs-x64-0.10.21.tgz

Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
recommend-type

node-v4.1.1-linux-armv6l.tar.xz

Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
recommend-type

node-v4.1.0-linux-arm64.tar.xz

Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
recommend-type

matlab S-Function 混合系统仿真

matlab绘制函数图像 MATLAB (Matrix Laboratory) 是一种用于数值计算的高级编程语言和交互式环境,由 MathWorks 公司开发。它广泛用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境。以下是一些 MATLAB 的基本特性和使用方式: 1. 基本语法 变量:MATLAB 中的变量不需要预先声明,直接赋值即可。 数组:MATLAB 使用方括号 [] 创建数组,数组索引从 1 开始。 运算符:包括加、减、乘、除、乘方等。 函数:MATLAB 有大量内置函数,也可以编写自定义函数。 2. 绘图 MATLAB 提供了丰富的绘图功能,如绘制线图、散点图、柱状图、饼图等。 matlab x = 0:0.01:2*pi; y = sin(x); plot(x, y); title('Sine Function'); xlabel('x'); ylabel('y'); 3. 数据分析 MATLAB 可以处理各种类型的数据,包括矩阵、向量、数组等,并提供了许多数据分析函数,如统计函数、信号处理函数等。 4. 脚本和函数
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

list根据id查询pid 然后依次获取到所有的子节点数据

可以使用递归的方式来实现根据id查询pid并获取所有子节点数据。具体实现可以参考以下代码: ``` def get_children_nodes(nodes, parent_id): children = [] for node in nodes: if node['pid'] == parent_id: node['children'] = get_children_nodes(nodes, node['id']) children.append(node) return children # 测试数
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。