0

数独ゲームがあり、プレイヤーの時間に基づいてハイスコアシステム(上位 5 人のプレイヤーを記録)を実装しようとしています。タイムが短いほど、ハイスコアのランクが高くなります。ストリームを介してそれを行う方法を考えました。ただし、新しいハイスコアを 2D 配列に追加する方法がわかりません( nametime[5][2])。名前とスコアを 1 つ追加することはできますが、ゲームを再度プレイするときに新しい名前を追加することはできません。

変数:

    private String[][] nametime = new String[5][2];
    private String[] names = new String[5];
    private String[] times = new String[5];

これまでに行ったことは次のとおりです。

    //assigns values to names[] and times[]
    private void addNamesAndTimes(String name, String score){

        names[0] = name;
        times[0] = score;

        System.out.println("Player: " + name + " || " + "Time: " + score);
    }

名前とスコアを最初のインデックスにのみ割り当てましnames[0]times[0]。これが私の問題がある場所だからです。配列に名前とスコアを追加し続ける方法がわかりません。

    //merges names[] and times[] array into one 2D array nametime[][]
    private String[][] mergeArrays(String[] a, String[] b){

        for(int i = 0; i < nametime.length; i++){
            nametime[i][0] = a[i];
            nametime[i][1] = b[i];
        }

        return nametime;
    }

後で配列を使用して何かを行うため、配列names[]と配列をマージすることにしました。(得点の比較)times[]times[]

public void createScoreFile(String name, String score){
    addNamesAndTimes(name, score);

    File file = new File("Scores.txt");

    try {
        if(!file.exists()){
            System.out.println("Creating new file...");
            file.createNewFile();
        }

        FileOutputStream fo = new FileOutputStream(file, true);
        PrintStream ps = new PrintStream(fo);

        for(int i = 0; i < nametime.length; i++){
            for(int j = 0; j < nametime[0].length; j++){
                ps.print(mergeArrays(names, times)[i][j] + "\t");
            }
            ps.println();
        }

        ps.close();

    } catch(Exception ex) {
        ex.printStackTrace();
    }
}

nametime[][]このメソッドは、配列を格納するファイルを作成するためのものです

//reads the contents of the text file and outputs it back to nametime[][]
    public String[][] loadScoreFile(){

    File file = new File("Scores.txt");

    try {
        Scanner scan = new Scanner(file);

        for(int i = 0; i < nametime.length; i++){
            for(int j = 0; j < nametime[i].length; j++){
                nametime[i][j] = scan.next();
            }  
        }

        System.out.println("Nametime Array:");
        for(int i = 0; i < nametime.length; i++){
            for(int j = 0; j < nametime[i].length; j++){
                System.out.print(nametime[i][j] + "\t");
            }  
            System.out.println();
        }

    } catch(Exception ex) {
        ex.printStackTrace();
    }

    return nametime;

}

このメソッドは、私の Score.txt ファイルを読み取るためのものです

//method for showing the table and frame
public void showFrame(){
        table = new JTable(loadScoreFile(), header);
        *other GUI stuff here*
}

私を助けてくれる人に感謝します!

編集:ここで私の問題をもう一度繰り返します。ゲームのプレイが終了すると、プレイヤー名とスコアが配列と .txt ファイルに記録されます。それから私はゲームを閉じます。ゲームを開いてもう一度プレイを終了すると、名前とスコアを配列と .txt ファイルに再度保存する必要があります。しかし、私の場合、それは起こっていることではありません。

4

1 に答える 1

1

プレーヤーと時間のペアを保持するクラスを作成することをお勧めします。また、Collectionsクラスを使用して、結果を並べ替えておくことができます。

次に例を示します(TreeSetを使用して結果を時間の昇順で保持します)。

import java.util.Iterator;
import java.util.SortedSet;
import java.util.TreeSet;

public class Test {
   static class Result implements Comparable<Result> {

      String name;
      int time;

      public Result(String name, int time) {
         this.name = name;
         this.time = time;
      }

      public int compareTo(Result o) {
         return this.time - o.time;
      }

      @Override
      public String toString() {
         return "Result [name=" + name + ", time=" + time + "]";
      }
   }

   public static void main(String[] args) {
      SortedSet<Result> results = new TreeSet<Result>();
      results.add(new Result("a", 5));
      results.add(new Result("b", 3));
      results.add(new Result("c", 1));
      results.add(new Result("d", 15));
      results.add(new Result("e", 10));
      results.add(new Result("f", 8));
      results.add(new Result("g", 9));
      results.add(new Result("h", 11));
      results.add(new Result("i", 7));
      results.add(new Result("j", 20));

      Iterator<Result> it = results.iterator();
      int i = 0;
      while (it.hasNext()) {
         System.out.println(it.next());
         i++;
         if (i == 5) {
            break;
         }
      }
   }
}

出力:

結果[名前=c、時間= 1]
結果[名前=b、時間= 3]
結果[名前=a、時間= 5]
結果[名前=i、時間= 7]
結果[名前=f、時間= 8]
于 2012-04-05T09:36:51.443 に答える