`
CnXiaowei
  • 浏览: 49777 次
社区版块
存档分类
最新评论

J2ME手机编程心得(四)

阅读更多
   上一个贪吃蛇的游戏是可以玩了,但是有个问题是,就算我玩的分数再高也没有记录,这样玩起来不是就没有挑战性了嘛?所以还需要为游戏加上一个记录分数和排名的模块,这样玩起来会有意思的多了。这就涉及到J2ME中的持久化的内容了,网上的这方面的资料都有很多,基本的原理就不多说了,直接说说在这个游戏中用到的技术。

    首先需要将用户的姓名和分数保存,这就需要一个格式,在这里定义为"用户分数#用户姓名"这样的格式。用户姓名是在记录分数的界面用户输入的,而用户的分数则是从GameScreen类中直接获取的。那如何获取GameScreen的实例呢?可以有多种方法,可以在构造RecordScreen的时候就将实例放到构造函数的参数中,也可以在Midlet的主类SnakeGame中获取GameScreen的实例。我偏向于第二种做法,因为这样看起来结构比较清晰,因为所有的屏幕都是属于这个Midlet的,将所有的屏幕(Screen)都做为主类的成员,再为每个设置get方法就可以在任何时候很方便的获取任意一个屏幕的实例。还有个问题是如何随时获取主Midlet类的实例呢?在JBuilder里面生成的代码中有个静态的变量instance,所以在任何地方都可以用SnakeGame.instance来获取这个类的实例。不过我的习惯是将instance设置成private类型,再写一个getInstance()的静态方法返回instance。这样,如果我想获取GameScreen的实例,就可以在任何地方直接用SnakeGame.getIntance().getGameScreen()获取了。

    数据可以获取了,现在就是保存了,保存很简单了,打开一个RecordStore,然后用addRecord方法添加记录就是了,这里的记录表现形式只能是byte数组类型的。代码如下:

    int score = gameScreen.getScore();//获取的分数
    String name = playerName.getString();//获取姓名
    String record = score + "#" + name;//组成字符串
    try {
      RecordStore rs = RecordStore.openRecordStore("SnakeGame", true);//打开,如果没有就新建
      rs.addRecord(record.getBytes(), 0, record.length());//保存
      rs.closeRecordStore();//关闭
    }
    catch (RecordStoreException ex) {
      ex.printStackTrace();
    }

    这样简单就把数据保存进去了。

    保存完了应该读取了,而且这个是要按排名先后来排序的,一般来说,遍历整个记录集可以使用RecordEnumeration,我们可以用RecordStore的enumerateRecords来进行遍历,enumerateRecords有三个参数,在这里只需要关心第二个参数就可以了,第二个参数是需要提供一个排序的类,这个类要实现RecordComparator接口,RecordComparator接口里面有compare(byte[] a byte[] b)函数,我们只要按照我们的意图实现这个方法就可以了。我们需要的是比较#前面的数字的大小,因此也比较简单,具体类的代码如下:

class MyExpenseComparator
    implements RecordComparator {
  public int compare(byte[] a, byte[] b) {
    String strA = new String(a);
    String strB = new String(b);
    int indexA = strA.indexOf("#");
    String scoreA = strA.substring(0, indexA);

    int indexB = strB.indexOf("#");
    String scoreB = strB.substring(0, indexB);

    if (Integer.parseInt(scoreA) > Integer.parseInt(scoreB)) {
      return this.PRECEDES;
    }
    if (Integer.parseInt(scoreA) < Integer.parseInt(scoreB)) {
      return this.FOLLOWS;
    }
    return this.EQUIVALENT;
  }
}

有了这个排序的类,其他的就好办了,遍历记录然后一条一条显示就可以了,考虑到如果记录多了会很长,因此遍历的时候只取出前10名的记录,后面的全部都删除掉。遍历以及显示记录的代码如下:


  private void listRecord() {
    String[] names;
    try {
      RecordStore rs = RecordStore.openRecordStore("SnakeGame", false);
      int count = 0;
      RecordEnumeration e = rs.enumerateRecords(null, new MyExpenseComparator(), false);
      while (e.hasNextElement()) {
        int rid = e.nextRecordId();
        String str = new String(rs.getRecord(rid));
        int index = str.indexOf("#");
        String score = str.substring(0, index);
        String name = str.substring(index + 1);
        if (count++ >= 10)
          rs.deleteRecord(rid);
        else
          append("No" + count + "." + "姓名:" + name + "  得分:" + score + "\r\n");
      }
      rs.closeRecordStore();
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }

    显示和记录都完成了,呵呵,再集成到我们的游戏里面去吧,整个RecordScreen的代码如下:

package snakegame;

import javax.microedition.lcdui.*;
import javax.microedition.rms.RecordStore;
import javax.microedition.rms.*;
import java.util.Hashtable;

public class RecordScreen
    extends Form implements CommandListener {
  private Command cancel;
  private Command save;
  private TextField playerName = new TextField("您的大名", "Noname", 10, TextField.ANY);
  private GameScreen gameScreen;
  public RecordScreen() {
    super("记录成绩");
    this.gameScreen = SnakeGame.getInstance().getGameScreen();
    cancel = new Command("取消", Command.EXIT, 1);
    save = new Command("保存成绩", Command.OK, 2);
    this.append(playerName);
    addCommand(cancel);
    addCommand(save);
    setCommandListener(this);
    listRecord();   
  }

  private void saveRecord() {
    int score = gameScreen.getScore();
    String name = playerName.getString();
    String record = score + "#" + name;
    try {
      RecordStore rs = RecordStore.openRecordStore("SnakeGame", true);
      int id = rs.addRecord(record.getBytes(), 0, record.length());
      rs.closeRecordStore();
    }
    catch (RecordStoreException ex) {
      ex.printStackTrace();
    }
    listRecord();
  }

  private void listRecord() {
    String[] names;
    try {
      RecordStore rs = RecordStore.openRecordStore("SnakeGame", false);
      int count = 0;
      RecordEnumeration e = rs.enumerateRecords(null, new MyExpenseComparator(), false);
      while (e.hasNextElement()) {
        int rid = e.nextRecordId();
        String str = new String(rs.getRecord(rid));
        int index = str.indexOf("#");
        String score = str.substring(0, index);
        String name = str.substring(index + 1);
        if (count++ >= 10)
          rs.deleteRecord(rid);
        else
          append("No" + count + "." + "姓名:" + name + "  得分:" + score + "\r\n");
      }
      rs.closeRecordStore();
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }
 
  public void commandAction(Command command, Displayable displayable) {
    if (command == save) {
      saveRecord();
      SnakeGame.getInstance().gameScreen();
    }
    if (command == cancel) {
      SnakeGame.getInstance().gameScreen();
    }
  }

}

class MyExpenseComparator
    implements RecordComparator {
  public int compare(byte[] a, byte[] b) {
    String strA = new String(a);
    String strB = new String(b);
    int indexA = strA.indexOf("#");
    String scoreA = strA.substring(0, indexA);

    int indexB = strB.indexOf("#");
    String scoreB = strB.substring(0, indexB);

    if (Integer.parseInt(scoreA) > Integer.parseInt(scoreB)) {
      return this.PRECEDES;
    }
    if (Integer.parseInt(scoreA) < Integer.parseInt(scoreB)) {
      return this.FOLLOWS;
    }
    return this.EQUIVALENT;
  }
}

OK,这个功能就实现了!

不过在测试中发现,如果输入的姓名有中文,可能显示的就会有点问题,上面的图片第二条记录,本来填写的是“无名”,结果显示的时候只显示出了“无”字。这个问题有人知道的话请告诉我解决的办法,多谢了!!

分享到:
评论
1 楼 9310974aa 2011-01-22  
非常感谢楼主!~~~

相关推荐

    j2me 手机短信编程(sms),经典

    j2me 手机短信编程(sms),经典 适合编程各个阶段的人学习,一定很有帮助

    J2ME手机扫雷游戏

    J2ME是Java技术的一个分支,主要用于嵌入式系统和移动设备,如早期的智能手机和平板电脑,它为开发者提供了跨平台的编程能力。 在这款J2ME手机扫雷游戏中,开发者运用了J2ME的核心技术,包括MIDP(Mobile ...

    j2me游戏开发实例

    **J2ME游戏开发实例详解** J2ME(Java 2 Micro Edition)是Java平台的一个子集,专门用于...通过这个J2ME游戏开发实例,你可以深入理解移动游戏开发的各个方面,逐步提升自己的编程技能,为未来的项目打下坚实基础。

    基于J2me MIDP2.0的手机游戏模拟

    MIDP(Mobile Information Device Profile)是J2ME的一部分,主要针对移动设备,特别是手机的游戏和应用开发。MIDP2.0是MIDP的一个版本,增加了更多功能和改进,如更强大的用户界面组件、多媒体支持和数据存储。 ...

    【中文】【 J2ME开发大全 】【pdf】【15.87 MB】

    给定信息中的“【中文】【 J2ME开发大全 】【pdf】【15.87 MB】”指的是一本关于J2ME开发的经典书籍,该书籍提供了详尽的J2ME开发指南,包括基础概念、编程技巧、最佳实践等内容。作为一本经典书籍,它对于想要深入...

    J2me手机泡泡堂游戏

    《J2ME手机泡泡堂游戏》是一款基于Java平台开发的移动设备游戏,它以其与经典泡泡堂游戏的高度相似性赢得了玩家的喜爱。此游戏的核心亮点在于它不仅提供了丰富的游戏体验,而且还附带了全部的源代码,这对于开发者和...

    j2me小练习,教学用

    【标题】"j2me小练习,教学用" 在IT领域,J2ME(Java 2 Platform, Micro Edition)是...通过实践这个项目,学习者不仅可以提升J2ME编程技能,还能深入理解移动游戏开发的各个方面,为未来更复杂的项目打下坚实的基础。

    j2me_fly_game_1945

    《J2ME飞翔之旅:1945飞行射击游戏源码解析》 在移动设备尚未普及智能操作系统的时代,Java...通过对这款源码的学习,开发者不仅可以掌握J2ME编程技巧,还能深入理解游戏开发的核心流程,为今后的项目提供宝贵的参考。

    J2ME学习视频

    这个资源可能是由一位名为“txyly998”的博主分享的,旨在帮助初学者和开发者掌握J2ME编程。 描述中提到的“博文链接”指向了iteye博客的一个页面(https://txyly998.iteye.com/blog/339081),该页面可能包含更...

    一个超简单的J2ME游戏实例

    J2ME,全称Java Micro Edition,是Java平台的一个子集,主要用于嵌入式设备和移动设备,如早期的智能手机和功能手机。它提供了开发和部署小型应用程序的框架,包括游戏。在这个超简单的J2ME游戏实例中,我们主要关注...

    手机游戏开发全书试读版本

    - **全面理解手机游戏开发**:通过本书的学习,读者不仅能够掌握具体的编程技巧,还能对整个手机游戏开发过程有一个全面的认识。 - **提升个人与团队能力**:本书提供的实用指南和技术支持,能够帮助开发者和开发...

    Java手机游戏海底探险源文件

    总的来说,Java手机游戏海底探险源文件提供了一个实践性的学习案例,涵盖了Java编程、J2ME技术、游戏设计与开发等多个重要知识点。通过研究这个项目,开发者不仅可以提升Java编程技能,还能了解到游戏开发的全过程,...

    编程人员应常去的网站

    42. **Fyter的博客**:个人技术博客,分享编程经验和心得。 43. **DevExpress**:提供ASP.NET、WinForms等控件和开发工具。 44. **OperaMask**:浏览器插件开发,尤其与JavaScript和Web开发相关。 45. **中国源码...

    个人收藏的编程下载资源全部公布

    ### 个人收藏的编程下载资源全面解析 在数字化时代,编程资源的获取变得前所未所地便捷,但对于初学者或是寻找特定资源的专业人士来说,筛选出高质量、可靠的学习资料仍然是一个挑战。本文将深入分析一份个人收藏的...

    java基础学习心得.docx

    Java 基础学习心得 Java 是一种广泛使用的编程语言,随着其广泛应用,越来越多的人开始学习 Java。那么,Java 学习需要什么根底?下面,我们将详细介绍 Java 学习的基础知识。 Java 学习需要什么根底? Java 学习...

    java学习心得总结.pdf

    Java学习心得总结 Java是一种广泛使用的高级编程语言,尤其在企业级应用开发中占据着重要地位。学习Java需要循序渐进,扎实基础,才能逐步掌握其精髓。以下是一些关于Java学习的关键点和注意事项: 1. **数据类型*...

    java实习心得.pdf

    每个方向都有其独特的挑战和潜力,如中国庞大的手机用户市场就为J2ME提供了广阔的发展空间。 实习不仅是技能的提升,更是个人成长的过程。在实习结束后,你需要反思,持续学习,保持对新信息的敏感度,这对于一个...

    JAVE 基础入门 外带经验心得 原版

    - **J2ME (Java 2 Micro Edition)**:专为移动设备如手机和平板电脑等小型设备设计的 Java 版本。 - **J2SE (Java 2 Standard Edition)**:标准版 Java,适用于桌面应用和企业级应用程序。 - **J2EE (Java 2 ...

    《Practical Java》中文版随书

    此外,文件名"okbase.net"可能是指一个包含更多资源或讨论平台的网站,读者可以在该网站上获取额外的支持、答疑解惑,或者与其他学习者交流心得,进一步提升自己的Java和J2ME技能。 总的来说,《Practical Java》...

Global site tag (gtag.js) - Google Analytics