2012-04-05 16 views
0

所以我有一個數獨遊戲,我正在嘗試實現一個高分系統(記錄前五名玩家)它基於球員的時間。時間越短,高分的等級越高。我曾想過如何通過流。但是,我不知道如何將高分添加到我的2D陣列(nametime[5][2])。我可以添加一個名字和分數,但是當我再次玩我的遊戲時,我無法添加新的名字和分數。將新名稱和分數添加到現有2D陣列+ I/O流?

變量:

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; 
    } 

我決定,因爲我該怎麼辦與times[]陣列後面的東西合併我names[]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文件中。但就我而言,這並非如此。

回答

1

我建議創建一個擁有玩家時間對的類。另外,也許使用一些集合類來保持排序的結果。

這裏的(使用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; 
     } 
     } 
    } 
} 

輸出:

 
Result [name=c, time=1] 
Result [name=b, time=3] 
Result [name=a, time=5] 
Result [name=i, time=7] 
Result [name=f, time=8] 
+0

感謝您的回答。我是否仍然使用流來實現這一點?因爲我不能想到任何可以存儲和記住我已經存在的價值的東西。 – alicedimarco 2012-04-05 10:25:24

+0

您可以使用相同的流方式來保存和加載這些文件。 或者,您可以創建一個新的類,該類具有「結果」作爲字段並將其聲明爲可序列化。這可能會更快,但該文件不會是人類可讀的。您可以查看以下鏈接瞭解更多詳情:http://docs.oracle.com/javase/7/docs/platform/serialization/spec/serialTOC.html – MasterF 2012-04-05 11:25:20

+0

我很感激。另一個問題是,TreeSet能夠跟蹤已經保存的內容嗎?例如,我玩遊戲並記錄名稱+分數。當我關閉遊戲並再次打開遊戲並進行遊戲(需要另一個名稱和分數)時,TreeSet仍然保留以前的名稱+分數和當前名稱+分數嗎? – alicedimarco 2012-04-05 11:41:46