Highscore erstellen in TXT-Datei (Java, Netbeans IDE)

Zadek

Grünschnabel
Hey,

ich studiere Multimedia und Kommunikation in Ansbach und fertige gerade im ersten Semester Java Programmierung ein Spiel als Studienarbeit an. Am nächsten Montag, den 29.06.2009 ist Abgabe und ich komme auch mit googlen einfach nicht weiter.

Mein Spiel liefert zwei Namen und zwei Scores zurück, die mit getter geholt werden. Meinem Spiel fehlt noch der Highscore. Es gibt bereit einen Thread bei tutorials.de, der sich damit befasst, aber er ist schon alt und geschlossen:

http://www.tutorials.de/forum/java/290931-highscore-liste-erstellen.html#post1501482

Den Code aus dem ersten Posting des Threads habe ich modifiziert und eingebaut, allerdings wird bezug auf eine Klasse "HighscoreEintrag" genommen (bei mir heißt sie AddHighscore), von der ich nicht weiß, was darin stehen muss.

Ich bekam eine FileNotFoundException, da die Datei gar nich angelegt wurde, dann eine ArrayIndexOutOfBoundsExeption beim Wert 1 in der Zeile, in der ich mit einer if-Schleife Werte aus der Datei in das AddHighscore-Array einlese.

Mein komplettes Spiel habe ich euch mal in den Anhang gepackt. Es hat noch ein paar andere Macken, aber es funktioniert immerhin schon.

Hier der Code, der den Highscore betrifft:
Code:
public class Highscore extends javax.swing.JFrame {
    // Deklaration der Variablen
    private Game game;

    AddHighscore[] highscore = new AddHighscore[10];
    File highScoreFile = new File("highscore.txt");
    FileReader highScoreFileReader = new FileReader(highScoreFile);
    String winner1 = Properties.getSpieler1Name();
    String winner2 = Properties.getSpieler2Name();
    int score1 = Game.getScore1();
    int score2 = Game.getScore2();

    /** Creates new form Page7_Highscore */
    public Highscore() throws IOException {
        initComponents();
        setFocusable(true);
        setSize(540, 600);
        if (highScoreFile.exists()) {
	            try {

	                char[] charArray = new char[(int) highScoreFile.length()];

	                highScoreFileReader.read(charArray);

	                String dateiInhalt = new String(charArray);

	                String[] eintraegeZeilen = dateiInhalt.split("\n");

	                for (int i = 0; i < eintraegeZeilen.length; i++) {
	                    //Jede einzelene Zeile bei : trennen
	                    //dieser wurde als Trennzeichen zwischen Spieler und
	                    //Punktestand gewählt
	                    if (i < 10) {
	                        String[] eintrag = eintraegeZeilen[i].split(":");

	                        //einen neuen Highscoreeintrag mit den eingelesenen
	                        //Erzeugen, an der entsprechenden stelle im oben
	                        //defineirten Array
	                        highscore[i] = new AddHighscore(eintrag[0]/*Name*/, Double.parseDouble(eintrag[1]/*Score*/));
	                    }
	                }
	                //den highScoreFileReader wieder schließen
	                highScoreFileReader.close();
	            } catch (FileNotFoundException e) { //falls Fehler beim
	                e.printStackTrace(); //Einlesen auftreten,
	            } catch (IOException e) { //diese ausgeben
	                e.printStackTrace();
	            }
	        } else {
                    //highScoreFile = new File("highscore.txt");
	            //Wenn die Datei nicht existiert werden Beispieleinträge angelegt
	            highscore[0] = new AddHighscore("Julian", 100);
	            highscore[1] = new AddHighscore("Matze", 400);
	            highscore[2] = new AddHighscore("Miki", 550);
	            highscore[3] = new AddHighscore("Tricha", 50);
	            highscore[4] = new AddHighscore("Phipsy", 200);
	            highscore[5] = new AddHighscore("Nino", 500);
	            highscore[6] = new AddHighscore("Batman", 400);
	            highscore[7] = new AddHighscore("Spiderschwein", 600);
	            highscore[8] = new AddHighscore("Urmel", 300);
	            highscore[9] = new AddHighscore("Rod", 400);
	        

    //Das Array wird sortiert!
	        //Dabei wird die in dem HighscoreEintrag implementierte
	        //Vergleichsfunktion verwendet (ohne dass Du es merkst)
	        Arrays.sort(highscore);

	        //Ausgabe der Liste
	        for (int i = 0; i < highscore.length; i++) {
                                //Highscore auf GUI ausgeben
				System.out.println(highscore[i]);
                                //Test
                                jTextArea1.append(highscore[i].toString());
	        }

	        //Der FileWriter ist analog zum FileReader
	        try {
	            FileWriter highScoreFileWriter = new FileWriter(highScoreFile);
	            for (int i = 0; i < highscore.length; i++) {
	                if (i < highscore.length - 1) {
	                    highScoreFileWriter.write(highscore[i].toString() + "\n");
	                } else {
	                    highScoreFileWriter.write(highscore[i].toString());
	                }
	            }
	            highScoreFileWriter.close();
	        } catch (FileNotFoundException e) {
	            e.printStackTrace();
	        } catch (IOException e) {
	            e.printStackTrace();
	        }

	    }

            }

Code:
public class AddHighscore {
       private static String name;
       private static double score;
    public AddHighscore(String nameadd, double scoreadd) {
        name = nameadd;
        score = scoreadd;
        System.out.println(name + ": " + score);

    }
    public static String getHighscoreName() {
        return name;
    }
    public static double getHighscoreScore() {
        return score;
    }
}

Es muss also irgendwo ein Fehler versteckt sein, oder aber ich hab einfach die AddHighscore falsch geschrieben. Weiß jemand wie ich das hinbekomme?


Ich wäre euch echt dankbar, wenn ihr mir helfen könntet. Eure Seite hat mir schon oft geholfen, diesmal aber muss ich mich direkt an euch wenden.
MeinProf kann mir aus zeitmangel nicht weiterhelfen, und da ich im ersten Semester Java bin, brauche ich sowieso noch Stunden, um die ganzen APIs durchzusehen und selbst weiterzukommen...
 

Anhänge

  • Tohuwabohu.zip
    2,8 MB · Aufrufe: 35
Zuletzt bearbeitet:
wow, das ging ja schnell :)

du meinst also, ich soll das mit Vektoren versuchen? Die kenne ich noch gar nicht, deshalb war mir das mit den Arrays gleich sympathischer. Gut ich mach mich da mal schlau, aber ich hab ja nur noch ne Woche...
Geht es denn viel leichter mit der Datei, wenn ich Vektoren benutze?

Ach ja, was nun eigentlich meine Frage ist:
Wenn du den Code vergleichst, also den des verlinkten Postings vom alten Thread und den aus meinem Spiel, fällt dir da ein Fehler auf, oder liegt er vielleicht in der AddHighscore-Klasse? Und wenn ja, was muss ich denn da reinschreiben?

Der Highscore wird ja aus einer Datei ausgelesen, die immer Name:Score aufgebaut ist und zehn Zeilen enthalten soll. Wenn die Datei nicht existiert, werden zehn Beispieleinträge in das highscore Array geschrieben, dass Instanzen der AddHighscore-Klasse enthält. Die werden dann mit dem FileWriter in die Datei geschrieben. Das passiert bei jedem Aufruf der Klasse Highscore. Die Namen und Scores der Spieler sollen dann mit den Werten in der Datei verglichen und alle zusammen ausgegeben werden, bevor alles wieder in die Datei gespeichert wird (mit den zwei neuen Werten, falls diese es in den Highscore geschafft haben).
 
Ich nehme an es ist eher belanglos, aber bist du dir sicher, dass du folgende Zeile brauchst?

Code:
private Game game;

Finde keine Stelle, wo game verwendet wird...

Ich glaube was Hammet meint ist, dass du dir dein zeilenweises Einlesen sehr umständlich machst.

Code:
String s;
try {
      BufferedReader in = new BufferedReader(new InputStreamReader(
                                            new FileInputStream( "highscore.txt" ) ) );
      while( null != (s = in.readLine()) ) {
        //TODO: Verareitung der eingelesenen Zeile (hier s)
      }
      in.close();
    } 
    catch( FileNotFoundException ex ) { System.out.println( ex ); } 
    catch( IOException ex ) { System.out.println( ex ); }

Weiterhin seh ich nicht, wo du score1 und score2 nochmal in deinem Code verwendest, ich nehme an, du möchtest den vergleichen und dementsprechend einordnen.
 
Zuletzt bearbeitet:
Ja genau, ich meinte das zeilenweise Einlesen.
Du bekommst ja eine Exception, also einen Fehlerwo du schonmal weißt an welcher Stelle der Fehler auftritt. Der Rest ist jetzt einfach nurnoch das Durchgehen der Logik im Kopf, oder im Debugger. Deine Fehlermeldung lässt darauf schließen, dass der Wert, auf den du zugreifen möchtest in deinem Array nicht existiert (das Feld im Array existietr nicht). Jetzt musst du schauen warum das os ist.

An welche Stelle tritt den der Fehler genau auf?
 
Vielleicht wird der Split nicht so durchgeführt, wie es erwartet wird.
Lies dir das mal durch:
http://www.tutorials.de/forum/java-grundlagen/276720-die-split-methode.html

Oder hast du mal geschaut, ob in der Datei, die du einliest auch gültige Werte vorhanden sind?
Wenn in einer Zeile dann z.B. kein ':' steht, wird nur ein String in dein String[] geschrieben und somit wird ja eintrag[1] ungültig.
Ich würde also vor

Code:
highscore[i] = new AddHighscore(eintrag[0]/*Name*/, Double.parseDouble(eintrag[1]/*Score*/));

noch eine Abfrage machen, ob eintrag[] mindestens 2 Elemente hat!
Da sähe dann ungefähr so aus:

Code:
if(eintrag.length>=2) highscore[i] = new AddHighscore(eintrag[0]/*Name*/, Double.parseDouble(eintrag[1]/*Score*/));
 
Zuletzt bearbeitet:
Also ich denke mal, dass es wie gewollt funktioniert. DIe Methode trennt eben nach jedem Zeilenumbruch.
Wobei mir auch gerade einfällt, dass die Schleife etwas "blöd" geschrieben ist ;)

Java:
       for (int i = 0; i < 10; i++) {
	                    //Jede einzelene Zeile bei : trennen
	                    //dieser wurde als Trennzeichen zwischen Spieler und
	                    //Punktestand gewählt
	           
	                        String[] eintrag = eintraegeZeilen[i].split(":");

	                        //einen neuen Highscoreeintrag mit den eingelesenen
	                        //Erzeugen, an der entsprechenden stelle im oben
	                        //defineirten Array
	                        highscore[i] = new AddHighscore(eintrag[0]/*Name*/,        Double.parseDouble(eintrag[1]/*Score*/));	         
	                }

So ist es wahrscheinlich besser ;)
 
hey da bin ich wieder... hatte 3D Design und war noch unterwegs.
Danke für eure Antworten. Ich versteh schon, was ihr meint, aber mir gehts ja vor allem um die AddHighscore Klasse, denn da fehlt meiner Meinung nach noch Code, oder? Es muss ja noch ein Doppelpunkt eingefügt werden und das ganze dann mittels FileWriter in die TXT Datei geschrieben werden...?

Oder hast du mal geschaut, ob in der Datei, die du einliest auch gültige Werte vorhanden sind?

Also im Code is ja ne if else abfrage, die veranlässt, dass Beispieleinträge ins AddHighscore Array geschrieben werden und später auch in der Datei landen. Also ist ja ausgeschlossen, dass falsche Werte drin stehen. Die Datei existiert ja noch gar nicht, aber wenn ich das ganze ausführe, erstellt es auch gar keine.

private Game game;

Diese Zeile brauche ich dafür, um mit dem "Noch einmal spielen" Button eine neue Instanz der Game Klasse als JFrame zu öffnen.


Das mit score1 und score2 stimmt so wie du es gesagt hast. Aber ihr müsst wissen, dass wir in der FH vor allem Grundlagen gelernt haben (in einem Semester gleich mit GUI anzufangen ist schon ziemlich viel, wenn man bedenkt wie viele Studienarbeiten wir machen müssen. Mein Problem ist also vor allem, dass ich mich einfach nicht gut genug auskenne in Java um selbst einen Highscore zu programmieren. Ich hab mir also einfach Beispiele im Netz angesehen und bin dabei auf den alten Thread hier gestoßen (ihr solltet euch den unbedingt ansehen um zu verstehen wie ich drauf komme, so zu coden). Versteht das nicht als Bitte, mir das zu programmieren, ich will es ja selbst verstehen. Den Code aus dem ersten Posting (von moe_joe) hab ich denke ich soweit verstanden und versucht einzubauen, aber ich komme infach insofern nicht weiter, da ich nicht genau weiß, wie man richtig debuggt und den Fehler findet.
Ich steh also einfach auf dem Schlauch und mir raucht schon fast der Kopf vor lauter Java :)

An welche Stelle tritt den der Fehler genau auf?

Java:
	                        highscore[i] = new AddHighscore(eintrag[0]/*Name*/, Double.parseDouble(eintrag[1]/*Score*/));

An dieser Stelle kommt die ArrayIndexOutOfBoundsException, und zwar sobald der Wert 1 als i eingesetzt wird.

Hab ich jetzt alles beantwortet?

Ach ja: Wenn ich die Highscore-Klasse ausführe, wird keine Datei mit dem Namen highscore.txt erstellt.
 
An der Stelle, an der der Fehler auftritt hat noch nichts mit deiner AddHighscroe-Klasse zu tun.
Und deine if-else-Abfrage überprüft nur i und sonst nichts, also ist das kein Indiez für korrekte Werte.
1. Du solltest deine Logik auf die Logik umstellen, die ich dir gezeigt habe. HonniCilest hat dir eine Portierung auf deinen Code gepostet.
2. Solltest du deinen Debugger bemühen und bei jedem Schleifendurchlauf auf korrekte Werte prüfen. Solltest du nicht mit dem Debugger umgehen können, lass dir die Werte mittels System.out.println() ausgeben.

PS: Das keien Datei erstellt wird ist ja klar. Dein Programm bricht auch viel früher ab...
 
Die if-else Abfrage prüft doch "
Code:
if (highScoreFile.exists())
" und nicht i.
Und außerdem ist ja
Code:
highscore[i]
in "
Code:
highscore[i] = new AddHighscore(eintrag[0]/*Name*/, Double.parseDouble(eintrag[1]/*Score*/));
" (das was ich vorhin geschrieben habe) ein Array der Klasse AddHighscore.

Aber du hast Recht, ich werd meine Logik morgen früh mal auf deine Weise machen und dann poste ich das Ergebnis ;-)
 

Neue Beiträge

Zurück