- 浏览: 465985 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
ty1972873004:
sunwang810812 写道我运行了这个例子,怎么结果是这 ...
Java并发编程: 使用Semaphore限制资源并发访问的线程数 -
lgh1992314:
simpleDean 写道请问,Logger.setLevel ...
Java内置Logger详解 -
sunwang810812:
我运行了这个例子,怎么结果是这样的:2号车泊车6号车泊车5号车 ...
Java并发编程: 使用Semaphore限制资源并发访问的线程数 -
jp260715007:
nanjiwubing123 写道参考你的用法,用如下方式实现 ...
面试题--三个线程循环打印ABC10次的几种解决方法 -
cb_0312:
SurnameDictionary文章我没看完,现在懂了
中文排序
在上两篇博文中,介绍了
Swing贪吃蛇游戏(一):基本功能实现 >>>> http://mouselearnjava.iteye.com/blog/1913290
Swing贪吃蛇游戏(二):增加随机产生障碍物功能 >>> http://mouselearnjava.iteye.com/blog/1913886
本文在这些既有功能之上,添加游戏进度的保存和加载功能。
游戏进度的保存和加载功能是通过序列化和反序列化来完成的。
保存--> 通过序列化的方式将当前游戏运行状态中用到的一些重要对象序列化到文件中加以保存,从而达到记录当前游戏状态的效果。
加载--> 通过反序列化的方式将序列化后的对象读取出来,从而达到恢复之前游戏保存时的状态的效果。用户可以在此基础上继续进行游戏。
那么,为了能够完成这个功能,我们需要做一些什么样的改动呢?
首先:添加用于保存和加载功能的MenuItem, 并为它们添加ActionListenser
public class SnakeGameFrame extends JFrame { private JMenuItem loadMI = new JMenuItem("Open"); public JMenuItem saveMI = new JMenuItem("Save"); public SnakeGameFrame() { //省略其它 setMenu.add(loadMI); setMenu.add(saveMI); loadMI.addActionListener(new LoadAction()); saveMI.addActionListener(new SaveAction()); } private class LoadAction implements ActionListener { public void actionPerformed(ActionEvent event) { FileDialog dialog = new FileDialog(SnakeGameFrame.this, "Open", FileDialog.LOAD); dialog.setVisible(true); String dir = dialog.getDirectory(); String fileName = dialog.getFile(); String filePath = dir + fileName; if (fileName != null && fileName.trim().length() != 0) { File file = new File(filePath); panel.loadGameDataFromFile(file); startMI.setEnabled(false); pauseMI.setEnabled(true); } else { JOptionPane.showConfirmDialog(SnakeGameFrame.this, "文件名为空\n装载游戏进度失败", "贪吃蛇游戏", JOptionPane.DEFAULT_OPTION); } } } private class SaveAction implements ActionListener { public void actionPerformed(ActionEvent event) { if (panel.getGameState() == GameState.INITIALIZE) { JOptionPane .showConfirmDialog(SnakeGameFrame.this, "游戏没有运行\n不能保存游戏进度", "贪吃蛇游戏", JOptionPane.DEFAULT_OPTION); return; } FileDialog dialog = new FileDialog(SnakeGameFrame.this, "Save", FileDialog.SAVE); dialog.setVisible(true); String dir = dialog.getDirectory(); String fileName = dialog.getFile(); String filePath = dir + fileName; if (fileName != null && fileName.trim().length() != 0) { File file = new File(filePath); panel.saveGameDataToFile(file); } else { JOptionPane.showConfirmDialog(SnakeGameFrame.this, "文件名为空\n保存游戏进度失败", "贪吃蛇游戏", JOptionPane.DEFAULT_OPTION); } } } }
其次:编写用于保存记录和加载记录的逻辑
public class SnakeGamePanel extends JPanel { //省略其它属性和方法 public void saveGameDataToFile(File file) { try { FileOutputStream fileStream = new FileOutputStream(file); ObjectOutputStream objectStream = new ObjectOutputStream(fileStream); objectStream.writeObject(flag); objectStream.writeObject(color); objectStream.writeObject(snake); objectStream.writeObject(food); objectStream.writeObject(new Integer(score)); objectStream.writeObject(barrier); objectStream.writeObject(new Boolean(needToGenerateFood)); objectStream.writeObject(new Boolean(needToGenerateBarrie)); objectStream.close(); fileStream.close(); JOptionPane.showConfirmDialog(frame, "保存游戏进度成功", "贪吃蛇游戏", JOptionPane.DEFAULT_OPTION); } catch (Exception e) { JOptionPane.showConfirmDialog(frame, e.toString() + "\n保存游戏进度失败", "贪吃蛇游戏", JOptionPane.DEFAULT_OPTION); } } public void loadGameDataFromFile(File file) { try { int[][] svaedFlag; Snake savedSnake; Grid savedFood; Integer savedScore; Color[][] savedColor; Barriers savedBarriers; Boolean savedNeedToGenerateFood; Boolean savedNeedToGenerateBarrie; FileInputStream fileStream = new FileInputStream(file); ObjectInputStream objectStream = new ObjectInputStream(fileStream); svaedFlag = (int[][]) objectStream.readObject(); savedColor = (Color[][]) objectStream.readObject(); savedSnake = (Snake) objectStream.readObject(); savedFood = (Grid) objectStream.readObject(); savedScore = (Integer) objectStream.readObject(); savedBarriers =(Barriers) objectStream.readObject(); savedNeedToGenerateFood = (Boolean)objectStream.readObject(); savedNeedToGenerateBarrie = (Boolean)objectStream.readObject(); objectStream.close(); fileStream.close(); if (svaedFlag != null && savedColor != null && savedSnake != null && savedFood != null && savedScore != null && savedBarriers != null && savedNeedToGenerateFood != null && savedNeedToGenerateBarrie != null) { flag = svaedFlag; color = savedColor; score = savedScore.intValue(); gameState = GameState.RUN; snake = savedSnake; food = savedFood; barrier = savedBarriers; needToGenerateFood = savedNeedToGenerateFood.booleanValue(); needToGenerateBarrie = savedNeedToGenerateBarrie.booleanValue(); frame.saveMI.setEnabled(true); if (!timer.isRunning()) { timer.start(); } repaint(); JOptionPane.showConfirmDialog(frame, "装载游戏进度成功", "贪吃蛇游戏", JOptionPane.DEFAULT_OPTION); } } catch (Exception e) { JOptionPane.showConfirmDialog(frame, e.toString() + "\n装载游戏进度失败", "贪吃蛇游戏", JOptionPane.DEFAULT_OPTION); } } }
至此,游戏进度存储和加载的功能就完成了。下面将给出游戏进度存储和加载功能的一个实例。
游戏进度存储-->>
某一时刻的游戏进度:
点击Save MenuItem,并保存游戏进度。
游戏进度读取-->>
打开之前保存的游戏进度文件Snake.dat
游戏继续,贪吃蛇向下运动一会的截图如下:
详细代码请参考附件MySnakeGame.7z
- MySnakeGame.7z (18 KB)
- 下载次数: 52
发表评论
-
工厂类中移除if/else语句
2016-07-10 19:52 900面向对象语言的一个强大的特性是多态,它可以用来在代码中移除 ... -
Java编程练手100题
2014-12-11 17:13 6728本文给出100道Java编程练手的程序。 列表如下: 面 ... -
数组复制的三种方法
2014-11-30 12:57 2212本文将给出三种实现数组复制的方法 (以复制整数数组为例)。 ... -
数组复制的三种方法
2014-11-30 12:54 0本文将给出三种实现数组复制的方法 (以复制整数数组为例)。 ... -
四种复制文件的方法
2014-11-29 13:21 1739尽管Java提供了一个类ava.io.File用于文件的操 ... -
判断一个字符串中的字符是否都只出现一次
2014-11-25 12:58 2724本篇博文将给大家带来几个判断一个字符串中的字符是否都只出现一 ... -
使用正则表达式判断一个数是否为素数
2014-11-23 13:35 2166正则表达式能够用于判断一个数是否为素数,这个以前完全没有想过 ... -
几个可以用英文单词表达的正则表达式
2014-11-21 13:12 3748本文,我们将来看一下几个可以用英文单词表达的正则表达式。这些 ... -
(广度优先搜索)打印所有可能的括号组合
2014-11-20 11:58 1953问题:给定一个正整n,作为括号的对数,输出所有括号可能 ... -
随机产生由特殊字符,大小写字母以及数字组成的字符串,且每种字符都至少出现一次
2014-11-19 14:48 3976题目:随机产生字符串,字符串中的字符只能由特殊字符 (! ... -
找出1到n缺失的一个数
2014-11-18 12:57 3173题目:Problem description: You h ... -
EnumSet的几个例子
2014-11-14 16:24 8749EnumSet 是一个与枚举类型一起使用的专用 Set 实现 ... -
给定两个有序数组和一个指定的sum值,从两个数组中各找一个数使得这两个数的和与指定的sum值相差最小
2014-11-12 11:24 3327题目:给定两个有序数组和一个指定的sum值,从两个数组 ... -
Java面试编程题练手
2014-11-04 22:49 6700面试编程 写一个程序,去除有序数组中的重复数字 编 ... -
Collections用法整理
2014-10-22 20:55 9846Collections (java.util.Collect ... -
The Code Sample 代码实例 个人博客开通
2014-09-04 18:48 1418个人博客小站开通 http://thecodesample. ... -
Collections.emptyXXX方法
2014-06-08 13:37 2145从JDK 1.5开始, Collections集合工具类中预先 ... -
这代码怎么就打印出"hello world"了呢?
2014-06-08 00:37 7396for (long l = 4946144450195624L ... -
最短时间过桥
2014-04-21 22:03 4137本文用代码实现最短时间过桥,并且打印如下两个例子的最小过桥时间 ... -
将数组分割成差值最小的子集
2014-04-20 22:34 2899本文使用位掩码实现一个功能 ==》将数组分割成差值最小的子集 ...
相关推荐
Swing版贪吃蛇游戏是一款基于Java Swing图形用户界面库开发的经典小游戏,它不仅保留了传统贪吃蛇的基本玩法,还增加了许多现代化的功能,如进度保存与加载、得分排行榜和随机生成的障碍物等,提升了游戏的趣味性和...
8. **文件操作**:虽然题目中没有明确提及,但若要实现保存和加载游戏进度,就需要文件操作的知识,例如使用FileWriter和FileReader进行读写。 9. **调试技巧**:在Eclipse环境中,开发者可能会利用断点、单步执行...
- 输入输出流(I/O):如果需要保存和加载游戏进度,可以使用Java的文件I/O功能将游戏状态写入文件,或者读取已保存的游戏。 - 枚举类型(Enum):用于定义蛇的方向,如UP、DOWN、LEFT、RIGHT,这样可以方便地进行...
7. **文件I/O**:如果游戏支持保存和加载进度,那么需要使用Java的文件I/O操作,如序列化技术将游戏状态写入文件,或者读取文件恢复游戏状态。 8. **异常处理**:在处理用户输入或文件操作时,可能会遇到各种异常,...
7. **文件操作**:论文部分可能涉及到游戏状态的存储和读取,这就需要使用到Java的文件I/O流,如FileInputStream和FileOutputStream,用于保存和加载游戏进度。 8. **开题报告与答辩**:这部分涵盖了项目的前期规划...
8. **文件操作与资源管理**:在毕业设计中,可能包含论文部分,因此,开发者可能需要学习如何在Java中读写文件,如保存和加载游戏进度,或者处理与论文相关的文本数据。 以上是JAVA贪吃蛇游戏毕业设计涉及的主要...
7. **文件操作**:可能涉及到保存和加载游戏进度,这需要使用到Java的文件I/O操作。 8. **用户交互**:设计友好的用户界面,包括菜单、提示信息和按钮,使用户能够轻松地开始、暂停和结束游戏。 这个毕业设计项目...
- **保存和加载游戏状态**:虽然这个描述没有提及,但为了增加游戏的持久性,可能包含了读写文件来保存游戏进度或配置。 8. **设计模式**: - **观察者模式**:可能用于更新游戏视图,当游戏状态发生变化时,观察...
同时,你需要了解如何使用Java的文件I/O来读取和保存游戏进度。 通过学习和实践这些小游戏,你可以深入理解以下Java编程概念: 1. **基础语法**:变量、数据类型、控制结构(条件语句、循环语句)、方法定义等。 2...
- **文件操作**:虽然题目中未提及,但保存和加载游戏进度可能需要文件输入输出。 7. **程序结构**: - **主函数**:main方法作为程序入口,初始化游戏环境并启动游戏循环。 - **模块化设计**:将游戏的不同功能...
9. **文件I/O**:虽然这个小游戏可能没有用到,但在更复杂的游戏设计中,可能会涉及保存和加载游戏进度,这就需要用到Java的文件读写操作。 【标签】“java”表示这个项目是使用Java编程语言实现的,它是一种广泛...
- 可能用于保存和加载游戏进度,或者记录高分。 8. **单元测试**: - 对游戏的关键组件进行测试,确保各个部分的功能正确无误。 通过研究这个项目,开发者不仅可以了解JAVA编程的基本概念,还可以掌握GUI开发、...
8. **文件操作**:虽然题目中没有提到具体文件,但游戏可能包含保存和加载进度的功能,这就需要使用到Java的文件I/O操作。 9. **面向对象编程**:将游戏的各个组成部分(如蛇、食物、游戏区)设计为独立的类,利用...
- **游戏记录**:保存和加载游戏进度,允许用户在游戏结束后查看最高分。 通过这个项目,你可以学习到Java编程的基本语法,面向对象的设计原则,以及如何使用Swing构建GUI应用。同时,你还会接触到线程管理和事件...
文件I/O在保存和加载游戏进度时也很重要。虽然贪吃蛇小游戏可能不需要复杂的持久化机制,但学习如何读写文件仍然是Java编程的一个基础技能。你可以使用`FileInputStream`和`FileOutputStream`来实现简单的数据存储。...
在Java中实现贪吃蛇游戏,通常会用到Java的图形用户界面(GUI)库,如Java AWT(Abstract Window Toolkit)或Swing。这些库提供了创建窗口、按钮、面板等组件的工具,以及处理用户事件的方法。在贪吃蛇游戏中,GUI...
10. **文件I/O**:虽然在给出的文件列表中没有显示,但如果你想要保存和加载游戏进度,就需要用到Java的文件I/O功能,例如使用`FileInputStream`和`ObjectInputStream`读取游戏状态,或者使用`FileOutputStream`和`...
- **存档和加载**:保存游戏进度,玩家可以随时继续游戏。 在实现Java贪吃蛇的过程中,你会接触到许多重要的编程概念,如面向对象设计、事件处理、多线程以及简单的算法(如碰撞检测)。这不仅有助于提升编程技能,...