在上几篇博文中,介绍了

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贪吃蛇游戏(四):增加游戏得分排行榜功能相关推荐

  1. 基于Java实现的贪吃蛇大作战小游戏

    贪吃蛇大作战小游戏 整体思路与架构 本项目主要分为三个部分,即UI界面.游戏逻辑与网络传输. UI界面部分,主要是为了实现不同界面之间的切换.包括了注册登陆窗口(loginFrame)与游戏主窗口(G ...

  2. JAVA 实现《贪吃蛇大作战》游戏|CSDN创作打卡

    前言 贪吃蛇(也叫做贪食蛇)游戏是一款休闲益智类游戏,有PC和手机等多平台版本.既简单又耐玩.该游戏通过控制蛇头方向吃东西,从而使得蛇变得越来越长. 本程序是通过java的swing来实现<贪吃 ...

  3. Java实现贪吃蛇大作战小游戏(完整教程+源码)额外实现积分和变速功能

    大家好,我是黄小黄同学!今天给大家带来的是小项目是 基于Java+Swing+IO流实现 的贪吃蛇大作战小游戏.实现了界面可视化.基本的吃食物功能.死亡功能.移动功能.积分功能,并额外实现了主动加速和 ...

  4. 贪吃蛇大作战类游戏的实现

    贪吃蛇大作战类游戏的实现 前段时间玩了一个叫做贪吃蛇大作战的手机游戏,一下子就喜欢上了,然后就有了尝试实现的想法. 制作的平台环境:vs2012/cocos2dx3.8.1/C++ 关于贪吃蛇游戏的了 ...

  5. java 贪吃蛇 控制台_控制台游戏贪吃蛇Java版

    无心间看到的一个贪吃蛇的控制台小游戏,起初只是想copy下来玩玩,没想里面有不少小问题,就顺手解决,固然仍是不完美,可是也勉强能玩了.java import java.util.LinkedList; ...

  6. #进击的贪吃蛇-----将贪吃蛇,飞机大战,坦克大战功能融合形成新的游戏

    #进击的贪吃蛇-----将贪吃蛇,飞机大战,坦克大战功能融合形成新的游戏. 想必很多大一新生在刚学C语言时和我们遇到过同样的问题,就是如何去做第一个C语言大作业. 我们小组内部在讨论大作业时,并不打算 ...

  7. 【Java闭关修炼】SpringBoot项目-贪吃蛇对战小游戏-配置git环境和项目创建

    [Java闭关修炼]SpringBoot项目-贪吃蛇对战小游戏-配置git环境和项目创建 项目的逐步细分 配置git环境 创建项目后端 前后端不分离写法-url访问路径解析资源 安装vue vue文件 ...

  8. 【Java闭关修炼】SpringBoot项目-贪吃蛇对战小游戏-配置Mysql与注册登录模块2

    [Java闭关修炼]SpringBoot项目-贪吃蛇对战小游戏-配置Mysql与注册登录模块2 传统的登录验证模式 JWT登录验证方式 下载安装依赖 创建JWTUTIL JwtAuthenticati ...

  9. java连连看倒计时_0053 游戏连连看增加倒计时和暂停功能和提示功能

    原标题:0053 游戏连连看增加倒计时和暂停功能和提示功能 上节课增加了更多的功能,让游戏可以持续玩下去,并处理了游戏结束和重新开始. 这节课来增加更多的功能:提示功能.倒计时功能和暂停功能. 将关卡 ...

最新文章

  1. 远程连接linux(Ubuntu配置SSH服务)22端口
  2. pipe创建匿名管道`
  3. 服务器部署docker
  4. 【c语言】指针数组和数组指针-解释和用法
  5. 制造linux内核异常,了解Linux内核中的异常
  6. python内存地址替换原理(20秒读懂)
  7. 代码生成器 Freemaker
  8. 我的管理实践---《人件》读后感
  9. python 实现 BCH 纠错码的方法
  10. 三个月的试用期终于结束了
  11. UWP: 实现 UWP 应用自启动
  12. PCM音频压缩A-Law算法,uLaw
  13. python中import用法sys_python sys模块的常见用法汇总
  14. 487计算机毕业设计
  15. Ubuntu 21.04 如何进入命令行的登录界面
  16. win10下定时任务备份,bat脚本运行
  17. 爬取双色球的中奖号码
  18. 文墨绘学21天习惯养成方法,学好就会优秀
  19. 奇偶校验,异或校验,和校验,nios串口校验
  20. python编程工时计算_Python项目:工作量计算器

热门文章

  1. MYSQL数据操作(CRUD)(二):查询
  2. java获取当前页面url地址_js如何准确获取当前页面url网址信息
  3. Android逆向入门1——引言与抓包
  4. 使用小程序实现图表(圆饼图、柱状图、折线图)
  5. 图像颜色空间转换-CSC
  6. 微信小程序如何使用tabbar底部栏
  7. moba寻路_MOBA手游排行榜前十名_MOBA手游排行榜2017
  8. VNC远程控制TX2
  9. java 拉普拉斯_opencv3_java 图形图像的拉普拉斯平滑Laplacian Laplacian
  10. android studio最新最全视频,史上最详Android Studio入门及使用详解视频教程全套