Swing贪吃蛇游戏(四):增加游戏得分排行榜功能
在上几篇博文中,介绍了
Swing贪吃蛇游戏(一):基本功能实现 >>>
[url]http://mouselearnjava.iteye.com/blog/1913290[/url]
Swing贪吃蛇游戏(二):增加随机产生障碍物功能 >>>
[url]http://mouselearnjava.iteye.com/blog/1913886[/url]
Swing贪吃蛇游戏(三):增加游戏进度存储和加载功能 >>>
[url]http://mouselearnjava.iteye.com/blog/1914225[/url]
本文在这些既有功能之上,添加游戏得分排行榜功能。[b]得分排行榜上列出Top 10的记录信息,包括玩家名称,得分和名次。[/b]
为了完成这个功能,我们需要做的主要改动有如下几点:
首先:创建与记录相关的类。
其次:完成游戏结束后对记录文件更新的操作。
最后:完成点击Record相关的MenuItem,读取记录信息,并用ScrollPane展示出来。
[b]1. 创建与记录相关的类[/b]
package my.games.snake.model;
import java.io.Serializable;import java.util.Arrays;import java.util.Collections;import java.util.Comparator;
/** * @author Eric
* @desc 贪吃蛇游戏的排行榜 */public class SnakeGameRecords implements Serializable {
private static final long serialVersionUID = 4513299590910220441L;
private static final int TOP_TEN = 10;
private Record[] records = null;
private int numberInRecord = 0; // 排行榜中已经拥有的记录个数
public SnakeGameRecords() { records = new Record[TOP_TEN]; }
@SuppressWarnings("unchecked") public void sortRecords() { Collections.sort(Arrays.asList(getAvailableRecords()), new RecordComparator()); }
private Record[] getAvailableRecords(){ Record[] availableRecords = new Record[numberInRecord]; for(int i=0;i<numberInRecord;i++){ availableRecords[i] = new Record(records[i].getPlayer(),records[i].getScore()); } return availableRecords; }
/** * * @return */ public Record getLastAvailableRecord() { return isEmpty() ? null : records[numberInRecord - 1]; }
/** * * @param record */ public void addRecordToTopTen(Record record) { if (isEmpty()) { records[0] = record; numberInRecord++; return; }
if (isFull()) { if (records[TOP_TEN - 1].getScore() < record.getScore()) { records[TOP_TEN - 1] = record; sortRecords(); return; } }
records[numberInRecord] = record; numberInRecord++; sortRecords(); }
/** * * @return */ public boolean isEmpty() { return 0 == numberInRecord; }
/** * * @return */ public boolean isFull() { return TOP_TEN == numberInRecord; }
/** * @return the numberInRecord */ public int getNumberInRecord() { return numberInRecord; }
/** * @param numberInRecord * the numberInRecord to set */ public void setNumberInRecord(int numberInRecord) { this.numberInRecord = numberInRecord; }
/** * @return the records */ public Record[] getRecords() { return records; }
/** * @param records * the records to set */ public void setRecords(Record[] records) { this.records = records; }
private class RecordComparator implements Comparator {
public int compare(Object o1, Object o2) { Record r1 = (Record) o1; Record r2 = (Record) o2;
return (0 == compareScore(r1, r2)) ? compareName(r1, r2) : compareScore(r1, r2); }
private int compareScore(Record r1, Record r2) { return r1.getScore() - r2.getScore(); }
private int compareName(Record r1, Record r2) { return r1.getPlayer().compareTo(r2.getPlayer()); }
}
}
package my.games.snake.model.record;
import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.ObjectInputStream;
import my.games.snake.model.SnakeGameRecords;
/** * * @author Eric * @vesion 1.0 * @desc Read Record */public class ReadRecord {
public SnakeGameRecords readRecordsFromFile(File recordFile) { SnakeGameRecords records = new SnakeGameRecords(); FileInputStream fileInput = null; ObjectInputStream objectInput = null;
if (!recordFile.exists()) { return records; }
try { fileInput = new FileInputStream(recordFile); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); }
try { objectInput = new ObjectInputStream(fileInput); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } Object o = null; try { o = objectInput.readObject(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); }
try { objectInput.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { fileInput.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } records = (SnakeGameRecords) o; records.sortRecords(); return records; }
}
package my.games.snake.model.record;
import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectOutputStream;
import my.games.snake.model.SnakeGameRecords;
/** * @author Eric * @vesion 1.0 * @desc Write records */public class WriteRecord {
public void writeRecordToFile(SnakeGameRecords records, File recordFile) { FileOutputStream fileOutput = null; try { fileOutput = new FileOutputStream(recordFile); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } ObjectOutputStream objectOutput = null; try { objectOutput = new ObjectOutputStream(fileOutput); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { objectOutput.writeObject(records); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { objectOutput.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { fileOutput.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
[b]2. 完成游戏结束后对记录文件更新的操作。[/b]
[b]3. 完成点击Record相关的MenuItem,读取记录信息,并用ScrollPane展示出来。[/b]
public class SnakeGameFrame extends JFrame { private JMenuItem recordMI = new JMenuItem("Record");
public SnakeGameFrame() { setMenu.add(recordMI); recordMI.addActionListener(new RecordAction()); }
private class RecordAction implements ActionListener {
@SuppressWarnings("deprecation") public void actionPerformed(ActionEvent event) { File file = new File("file.dat"); SnakeGameRecords records = new ReadRecord() .readRecordsFromFile(file); records.sortRecords(); JScrollPane panel = new RecordScrollPane().getReadScrollPane(records, file);
JDialog recordDialog = new JDialog(SnakeGameFrame.this, "贪吃蛇游戏"); recordDialog.setBounds(300, 300, 300, 219);
Container container = recordDialog.getContentPane(); container.add(panel); recordDialog.show(); } }}
package my.games.snake.ui;
import java.io.File;
import javax.swing.JScrollPane;import javax.swing.JTable;
import my.games.snake.model.Record;import my.games.snake.model.SnakeGameRecords;
public class RecordScrollPane{
private static final long serialVersionUID = -3552642981292000951L;
public JScrollPane getReadScrollPane(SnakeGameRecords records, File recordFile) { Object[][] data = new Object[records.getNumberInRecord()][3]; for (int i = 0; i < records.getNumberInRecord(); i++) { Record record = records.getRecords()[i]; data[i][0] = String.valueOf(i + 1); data[i][1] = record.getPlayer(); data[i][2] = String.valueOf(record.getScore()); } Object[] columnNames = new Object[3]; columnNames[0] = "ID"; columnNames[1] = "Name"; columnNames[2] = "Score"; JTable table = new JTable(data, columnNames); table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); JScrollPane pane = new JScrollPane(table); return pane; }}
//游戏结束时,如果分数大于0,那么将分数写入到排行榜中去
public class SnakeGamePanel extends JPanel {private void writeScore() { if (score == 0) { return; } File file = new File("file.dat"); SnakeGameRecords records = new ReadRecord().readRecordsFromFile(file); if (records == null || records.isEmpty() || !records.isFull() || (records.getLastAvailableRecord().getScore() < score && records .isFull())) { String playerName = JOptionPane .showInputDialog("Please input your name"); if (playerName == null || playerName.length() == 0 || playerName.trim().equals("")) { playerName = "无名英雄"; } Record record = new Record(playerName, score); records.addRecordToTopTen(record); new WriteRecord().writeRecordToFile(records, file); }
}}
一个演示的示例如下:
游戏结束时,输入Frank的玩家名字。
[img]http://dl2.iteye.com/upload/attachment/0087/5102/0034b235-7358-35de-b362-e1a37e5225c0.jpg[/img]
查看得分排行榜:
[img]http://dl2.iteye.com/upload/attachment/0087/5106/2dd54c9d-f22e-3021-a440-228cfe2fb3cf.jpg[/img]
[img]http://dl2.iteye.com/upload/attachment/0087/5104/16cc9469-7e59-3485-b0ad-dee712e7eaaa.jpg[/img]
至此,一个拥有进度存储和加载功能,得分排行榜以及随机产生障碍物的Swing贪吃蛇游戏就完成了。
代码还没有优化过,详细代码请参考附件MySnakeGame.7z
Swing贪吃蛇游戏(四):增加游戏得分排行榜功能相关推荐
- 基于Java实现的贪吃蛇大作战小游戏
贪吃蛇大作战小游戏 整体思路与架构 本项目主要分为三个部分,即UI界面.游戏逻辑与网络传输. UI界面部分,主要是为了实现不同界面之间的切换.包括了注册登陆窗口(loginFrame)与游戏主窗口(G ...
- JAVA 实现《贪吃蛇大作战》游戏|CSDN创作打卡
前言 贪吃蛇(也叫做贪食蛇)游戏是一款休闲益智类游戏,有PC和手机等多平台版本.既简单又耐玩.该游戏通过控制蛇头方向吃东西,从而使得蛇变得越来越长. 本程序是通过java的swing来实现<贪吃 ...
- Java实现贪吃蛇大作战小游戏(完整教程+源码)额外实现积分和变速功能
大家好,我是黄小黄同学!今天给大家带来的是小项目是 基于Java+Swing+IO流实现 的贪吃蛇大作战小游戏.实现了界面可视化.基本的吃食物功能.死亡功能.移动功能.积分功能,并额外实现了主动加速和 ...
- 贪吃蛇大作战类游戏的实现
贪吃蛇大作战类游戏的实现 前段时间玩了一个叫做贪吃蛇大作战的手机游戏,一下子就喜欢上了,然后就有了尝试实现的想法. 制作的平台环境:vs2012/cocos2dx3.8.1/C++ 关于贪吃蛇游戏的了 ...
- java 贪吃蛇 控制台_控制台游戏贪吃蛇Java版
无心间看到的一个贪吃蛇的控制台小游戏,起初只是想copy下来玩玩,没想里面有不少小问题,就顺手解决,固然仍是不完美,可是也勉强能玩了.java import java.util.LinkedList; ...
- #进击的贪吃蛇-----将贪吃蛇,飞机大战,坦克大战功能融合形成新的游戏
#进击的贪吃蛇-----将贪吃蛇,飞机大战,坦克大战功能融合形成新的游戏. 想必很多大一新生在刚学C语言时和我们遇到过同样的问题,就是如何去做第一个C语言大作业. 我们小组内部在讨论大作业时,并不打算 ...
- 【Java闭关修炼】SpringBoot项目-贪吃蛇对战小游戏-配置git环境和项目创建
[Java闭关修炼]SpringBoot项目-贪吃蛇对战小游戏-配置git环境和项目创建 项目的逐步细分 配置git环境 创建项目后端 前后端不分离写法-url访问路径解析资源 安装vue vue文件 ...
- 【Java闭关修炼】SpringBoot项目-贪吃蛇对战小游戏-配置Mysql与注册登录模块2
[Java闭关修炼]SpringBoot项目-贪吃蛇对战小游戏-配置Mysql与注册登录模块2 传统的登录验证模式 JWT登录验证方式 下载安装依赖 创建JWTUTIL JwtAuthenticati ...
- java连连看倒计时_0053 游戏连连看增加倒计时和暂停功能和提示功能
原标题:0053 游戏连连看增加倒计时和暂停功能和提示功能 上节课增加了更多的功能,让游戏可以持续玩下去,并处理了游戏结束和重新开始. 这节课来增加更多的功能:提示功能.倒计时功能和暂停功能. 将关卡 ...
最新文章
- 远程连接linux(Ubuntu配置SSH服务)22端口
- pipe创建匿名管道`
- 服务器部署docker
- 【c语言】指针数组和数组指针-解释和用法
- 制造linux内核异常,了解Linux内核中的异常
- python内存地址替换原理(20秒读懂)
- 代码生成器 Freemaker
- 我的管理实践---《人件》读后感
- python 实现 BCH 纠错码的方法
- 三个月的试用期终于结束了
- UWP: 实现 UWP 应用自启动
- PCM音频压缩A-Law算法,uLaw
- python中import用法sys_python sys模块的常见用法汇总
- 487计算机毕业设计
- Ubuntu 21.04 如何进入命令行的登录界面
- win10下定时任务备份,bat脚本运行
- 爬取双色球的中奖号码
- 文墨绘学21天习惯养成方法,学好就会优秀
- 奇偶校验,异或校验,和校验,nios串口校验
- python编程工时计算_Python项目:工作量计算器
热门文章
- MYSQL数据操作(CRUD)(二):查询
- java获取当前页面url地址_js如何准确获取当前页面url网址信息
- Android逆向入门1——引言与抓包
- 使用小程序实现图表(圆饼图、柱状图、折线图)
- 图像颜色空间转换-CSC
- 微信小程序如何使用tabbar底部栏
- moba寻路_MOBA手游排行榜前十名_MOBA手游排行榜2017
- VNC远程控制TX2
- java 拉普拉斯_opencv3_java 图形图像的拉普拉斯平滑Laplacian Laplacian
- android studio最新最全视频,史上最详Android Studio入门及使用详解视频教程全套