`
MouseLearnJava
  • 浏览: 463823 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Swing贪吃蛇游戏(三):增加游戏进度存储和加载功能

阅读更多

在上两篇博文中,介绍了

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

  • 大小: 20 KB
  • 大小: 26.8 KB
  • 大小: 7.1 KB
  • 大小: 20.7 KB
  • 大小: 20.8 KB
  • 大小: 25.9 KB
  • 大小: 7.1 KB
  • 大小: 23.6 KB
1
1
分享到:
评论

相关推荐

    Swing版贪吃蛇游戏

    Swing版贪吃蛇游戏是一款基于Java Swing图形用户界面库开发的经典小游戏,它不仅保留了传统贪吃蛇的基本玩法,还增加了许多现代化的功能,如进度保存与加载、得分排行榜和随机生成的障碍物等,提升了游戏的趣味性和...

    Java小游戏贪吃蛇 完整源码下载

    8. **文件操作**:虽然题目中没有明确提及,但若要实现保存和加载游戏进度,就需要文件操作的知识,例如使用FileWriter和FileReader进行读写。 9. **调试技巧**:在Eclipse环境中,开发者可能会利用断点、单步执行...

    Java开发的贪吃蛇游戏

    - 输入输出流(I/O):如果需要保存和加载游戏进度,可以使用Java的文件I/O功能将游戏状态写入文件,或者读取已保存的游戏。 - 枚举类型(Enum):用于定义蛇的方向,如UP、DOWN、LEFT、RIGHT,这样可以方便地进行...

    Java写的贪吃蛇游戏

    7. **文件I/O**:如果游戏支持保存和加载进度,那么需要使用Java的文件I/O操作,如序列化技术将游戏状态写入文件,或者读取文件恢复游戏状态。 8. **异常处理**:在处理用户输入或文件操作时,可能会遇到各种异常,...

    毕业论文设计-IT计算机-JAVA贪吃蛇游戏毕业设计(源代码+论文).zip

    7. **文件操作**:论文部分可能涉及到游戏状态的存储和读取,这就需要使用到Java的文件I/O流,如FileInputStream和FileOutputStream,用于保存和加载游戏进度。 8. **开题报告与答辩**:这部分涵盖了项目的前期规划...

    JAVA贪吃蛇游戏毕业设计(源代码+论文)

    8. **文件操作与资源管理**:在毕业设计中,可能包含论文部分,因此,开发者可能需要学习如何在Java中读写文件,如保存和加载游戏进度,或者处理与论文相关的文本数据。 以上是JAVA贪吃蛇游戏毕业设计涉及的主要...

    JAVA贪吃蛇游戏毕业设计(源代码+论文).zip

    7. **文件操作**:可能涉及到保存和加载游戏进度,这需要使用到Java的文件I/O操作。 8. **用户交互**:设计友好的用户界面,包括菜单、提示信息和按钮,使用户能够轻松地开始、暂停和结束游戏。 这个毕业设计项目...

    贪吃蛇小游戏java实现.zip

    - **保存和加载游戏状态**:虽然这个描述没有提及,但为了增加游戏的持久性,可能包含了读写文件来保存游戏进度或配置。 8. **设计模式**: - **观察者模式**:可能用于更新游戏视图,当游戏状态发生变化时,观察...

    java小游戏包括五子棋贪吃蛇坦克等

    同时,你需要了解如何使用Java的文件I/O来读取和保存游戏进度。 通过学习和实践这些小游戏,你可以深入理解以下Java编程概念: 1. **基础语法**:变量、数据类型、控制结构(条件语句、循环语句)、方法定义等。 2...

    Java贪吃蛇代码可以直接执行

    - **文件操作**:虽然题目中未提及,但保存和加载游戏进度可能需要文件输入输出。 7. **程序结构**: - **主函数**:main方法作为程序入口,初始化游戏环境并启动游戏循环。 - **模块化设计**:将游戏的不同功能...

    简易版贪吃蛇小游戏(Java)

    9. **文件I/O**:虽然这个小游戏可能没有用到,但在更复杂的游戏设计中,可能会涉及保存和加载游戏进度,这就需要用到Java的文件读写操作。 【标签】“java”表示这个项目是使用Java编程语言实现的,它是一种广泛...

    用JAVA编写的贪吃蛇小游戏 实现了开始START界面,结束GAME OVER界面,.zip

    - 可能用于保存和加载游戏进度,或者记录高分。 8. **单元测试**: - 对游戏的关键组件进行测试,确保各个部分的功能正确无误。 通过研究这个项目,开发者不仅可以了解JAVA编程的基本概念,还可以掌握GUI开发、...

    java智能贪吃蛇

    8. **文件操作**:虽然题目中没有提到具体文件,但游戏可能包含保存和加载进度的功能,这就需要使用到Java的文件I/O操作。 9. **面向对象编程**:将游戏的各个组成部分(如蛇、食物、游戏区)设计为独立的类,利用...

    java贪吃蛇

    - **游戏记录**:保存和加载游戏进度,允许用户在游戏结束后查看最高分。 通过这个项目,你可以学习到Java编程的基本语法,面向对象的设计原则,以及如何使用Swing构建GUI应用。同时,你还会接触到线程管理和事件...

    贪吃蛇小游戏

    文件I/O在保存和加载游戏进度时也很重要。虽然贪吃蛇小游戏可能不需要复杂的持久化机制,但学习如何读写文件仍然是Java编程的一个基础技能。你可以使用`FileInputStream`和`FileOutputStream`来实现简单的数据存储。...

    Java写的贪吃蛇

    在Java中实现贪吃蛇游戏,通常会用到Java的图形用户界面(GUI)库,如Java AWT(Abstract Window Toolkit)或Swing。这些库提供了创建窗口、按钮、面板等组件的工具,以及处理用户事件的方法。在贪吃蛇游戏中,GUI...

    Java贪吃蛇毕业设计源代码(配套毕业论文请看我其他资源)

    10. **文件I/O**:虽然在给出的文件列表中没有显示,但如果你想要保存和加载游戏进度,就需要用到Java的文件I/O功能,例如使用`FileInputStream`和`ObjectInputStream`读取游戏状态,或者使用`FileOutputStream`和`...

    Java贪吃蛇

    - **存档和加载**:保存游戏进度,玩家可以随时继续游戏。 在实现Java贪吃蛇的过程中,你会接触到许多重要的编程概念,如面向对象设计、事件处理、多线程以及简单的算法(如碰撞检测)。这不仅有助于提升编程技能,...

Global site tag (gtag.js) - Google Analytics