WEB开发网
开发学院软件开发Java 用RMS存储游戏积分 阅读

用RMS存储游戏积分

 2007-12-23 12:37:30 来源:WEB开发网   
核心提示:import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.EOFExcept
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;

import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
import javax.microedition.rms.RecordComparator;
import javax.microedition.rms.RecordEnumeration;
import javax.microedition.rms.RecordFilter;
import javax.microedition.rms.RecordStore;
import javax.microedition.rms.RecordStoreException;

/**
 * A class used for storing and showing game scores.
 */
public class RMSGameScores extends MIDlet implements RecordFilter,
  RecordComparator {
 /*
  * The RecordStore used for storing the game scores.
  */
 PRivate RecordStore recordStore = null;

 /*
  * The player name to use when filtering.
  */
 public static String playerNameFilter = null;

 /**
  * The constUCtor opens the underlying record store, creating it if
  * necessary.
  */
 public RMSGameScores() {
  // Create a new record store for this example
  try {
   recordStore = RecordStore.openRecordStore("scores", true);
  } catch (RecordStoreException rse) {
   System.out.println("Record Store Exception in the ctor." + rse);
   rse.printStackTrace();
  }
 }

 /**
  * startApp()
  */
 public void startApp() throws MIDletStateChangeException {
  RMSGameScores rmsgs = new RMSGameScores();
  rmsgs.addScore(100, "Alice");
  rmsgs.addScore(120, "Bill");
  rmsgs.addScore(80, "Candice");
  rmsgs.addScore(40, "Dean");
  rmsgs.addScore(200, "Ethel");
  rmsgs.addScore(110, "Farnsworth");
  rmsgs.addScore(220, "Alice");
  RMSGameScores.playerNameFilter = "Alice";
  System.out
    .println("Print all scores followed by Scores for Farnsworth");
  rmsgs.printScores();
 }

 /*
  * Part of the RecordFilter interface.
  */
 public boolean matches(byte[] candidate) throws IllegalArgumentException {
  // If no filter set, nothing can match it.
  if (this.playerNameFilter == null) {
   return false;
  }

  ByteArrayInputStream bais = new ByteArrayInputStream(candidate);
  DataInputStream inputStream = new DataInputStream(bais);
  String name = null;

  try {
   int score = inputStream.readInt();
   name = inputStream.readUTF();
  } catch (EOFException eofe) {  System.out.println(eofe);
   eofe.printStackTrace();
  } catch (IOException eofe) {
   System.out.println(eofe);
   eofe.printStackTrace();
  }
  return (this.playerNameFilter.equals(name));
 }

 /*
  * Part of the RecordComparator interface.
  */
 public int compare(byte[] rec1, byte[] rec2) {

  // Construct DataInputStreams for extracting the scores from
  // the records.
  ByteArrayInputStream bais1 = new ByteArrayInputStream(rec1);
  DataInputStream inputStream1 = new DataInputStream(bais1);
  ByteArrayInputStream bais2 = new ByteArrayInputStream(rec2);
  DataInputStream inputStream2 = new DataInputStream(bais2);
  int score1 = 0;
  int score2 = 0;
  try {
   // Extract the scores.
   score1 = inputStream1.readInt();
   score2 = inputStream2.readInt();
  } catch (EOFException eofe) {
   System.out.println(eofe);
   eofe.printStackTrace();
  } catch (IOException eofe) {
   System.out.println(eofe);
   eofe.printStackTrace();
  }

  // Sort by score
  if (score1 > score2) {
   return RecordComparator.FOLLOWS;
  } else if (score1 < score2) {
   return RecordComparator.PRECEDES;
  } else {
   return RecordComparator.EQUIVALENT;
  }
 }

 /**
  * Add a new score to the storage.
  * 
  * @param score
  *      the score to store.
  * @param playerName
  *      the name of the play achieving this score.
  */
 public void addScore(int score, String playerName) {
  // Each score is stored in a separate record, formatted with
  // the score, followed by the player name.
  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  DataOutputStream outputStream = new DataOutputStream(baos);
  try {
   // Push the score into a byte array.
   outputStream.writeInt(score);
   // Then push the player name.
   outputStream.writeUTF(playerName);
  } catch (IOException ioe) {
   System.out.println(ioe);
   ioe.printStackTrace();
  }

  // Extract the byte array
  byte[] b = baos.toByteArray();
  try {
   // Add it to the record store
   recordStore.addRecord(b, 0, b.length);
  } catch (RecordStoreException rse) {
   System.out.println(rse);
   rse.printStackTrace();
  }
 }

 /**
  * A helper method for the printScores methods.
  */
 private void printScoresHelper(RecordEnumeration re) {

  try {
   while (re.hasNextElement()) {
    int id = re.nextRecordId();
    ByteArrayInputStream bais = new ByteArrayInputStream(
      recordStore.getRecord(id));
    DataInputStream inputStream = new DataInputStream(bais);
    try {
     int score = inputStream.readInt();
     String playerName = inputStream.readUTF();
     System.out.println(playerName + " = " + score);
    } catch (EOFException eofe) {
     System.out.println(eofe);
     eofe.printStackTrace();
    }
   }
  } catch (RecordStoreException rse) {
   System.out.println(rse);
   rse.printStackTrace();
  } catch (IOException ioe) {
   System.out.println(ioe);
   ioe.printStackTrace();
  }
 }

 /**
  * This method prints all of the scores sorted by game score.
  */
 public void printScores() {
  try {
   // Enumerate the records using the comparator implemented
   // above to sort by game score.

   // No RecordFilter here. All records in the RecordStore
   RecordEnumeration re = recordStore.enumerateRecords(null, this,
     true);

   // Print all scores
   System.out.println("Print all scores...");
   printScoresHelper(re);

   // Enumerate records respecting a RecordFilter
   re = recordStore.enumerateRecords(this, this, true);

   //Print scores for Farnsworth
   System.out.println("Print scores for : " + this.playerNameFilter);
   printScoresHelper(re);
  } catch (RecordStoreException rse) {
   System.out.println(rse);
   rse.printStackTrace();
  }}

 /**
  * pauseApp()
  */
 public void pauseApp() {
  System.out.println("pauseApp()");
 }

 /**
  * destroyApp()
  * 
  * This closes our open RecordStore when we are destroyed.
  * 
  * @param cond
  *      true if this is an unconditional destroy false if it is not
  *      (ignored here and treated as unconditional)
  */
 public void destroyApp(boolean cond) {
  System.out.println("destroyApp( )");
  try {
   if (recordStore != null)
    recordStore.closeRecordStore();
  } catch (Exception ignore) {
   // ignore this
  }
 }

}

(出处:http://www.cncms.com)


Tags:RMS 存储 游戏

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接