Highscore-liste erstellen

moe_joe

Mitglied
ich will für mein kleines Spiel ne Highscore liste erstellen, die in eine txt datei geschrieben wird. hab mal die sufu genutz und dabei das gefunden:

Code:
 public SortArray() {
	        //Ein Array mit 10 einträgen vom Type HighScoreEintrag wird erstellt
	        //In diesem Array werden die einzenen Paare aus Spieler und Punktestand
	        //gespeichert
	        HighscoreEintrag[] highscore = new HighscoreEintrag[10];

	        //Ein neue "Dateiverbindung" erstellen
	        File f = new File("hs.txt");

	        //prüfen, ob die Datei existiert
	        if (f.exists()) {
	            try {
	                //Wenn sie existiert werden wir sie mit dem FileReader auslesen
	                FileReader fR = new FileReader(f);

	                //FileReader liest ein array of char und keinen String
	                char[] c = new char[(int) f.length()];

	                //und in das erstellte char-array einlesen
	                fR.read(c);

	                //aus dem char-array einen string erzeugen, der dann den
	                //Dateinhalt enthält
	                String s = new String(c);

	                //Den String bei Zeilenumbruch teilen und die einzelnen
	                //Teile (=Zeilen) in ein array of string schreiben
	                String[] entrys = s.split("\n");

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

	                        //einen neuen Highscoreeintrag mit den eingelesenen
	                        //Erzeugen, an der entsprechenden stelle im oben
	                        //defineirten Array
	                        highscore[i] = new HighscoreEintrag(entry[0], Double
	                                .parseDouble(entry[1]));
	                    }
	                }
	                //den FileReader wieder schließen
	                fR.close();
	            } catch (FileNotFoundException e) { //falls Fehler beim
	                e.printStackTrace(); //Einlesen auftreten,
	            } catch (IOException e) { //diese ausgeben
	                e.printStackTrace();
	            }
	        } else {
	            //Wenn die Datei nicht existiert werden Beispieleinträge angelegt
	            highscore[0] = new HighscoreEintrag("a", 10);
	            highscore[1] = new HighscoreEintrag("b", 90);
	            highscore[2] = new HighscoreEintrag("c", 55);
	            highscore[3] = new HighscoreEintrag("d", 5);
	            highscore[4] = new HighscoreEintrag("e", 20);
	            highscore[5] = new HighscoreEintrag("f", 50);
	            highscore[6] = new HighscoreEintrag("g", 40);
	            highscore[7] = new HighscoreEintrag("h", 80);
	            highscore[8] = new HighscoreEintrag("i", 30);
	            highscore[9] = new HighscoreEintrag("j", 70);
	        }

	        //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++) {
	        	JDialog hsd = new JDialog(); 
	        	JTextArea hs = new JTextArea();
				hsd.add(hs);
				hsd.setTitle(".:Hangman:. - Highscore");
				hsd.setSize( 300, 450 ); 
				hsd.setResizable(false);
				hsd.setLocation (450, 0);
				hsd.setVisible( true );
				hs.setEditable(false);
				hs.setLineWrap(true);
				hs.setBackground(Color.black);
				hs.setWrapStyleWord(true);
				hs.setForeground(Color.white);
				hs.setText(highscore[i]);
	        }

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

	    }
	}

jetzt stellen sich mir noch die fragen: wie kann ich ein array in nem textarea darstellen?
Code:
 //Ausgabe der Liste
	        for (int i = 0; i < highscore.length; i++) {
	        	JDialog hsd = new JDialog(); 
	        	JTextArea hs = new JTextArea();
				hsd.add(hs);
				hsd.setTitle(".:Hangman:. - Highscore");
				hsd.setSize( 300, 450 ); 
				hsd.setResizable(false);
				hsd.setLocation (450, 0);
				hsd.setVisible( true );
				hs.setEditable(false);
				hs.setLineWrap(true);
				hs.setBackground(Color.black);
				hs.setWrapStyleWord(true);
				hs.setForeground(Color.white);
				hs.setText(highscore[i]);
	        }

und wo kann ich der highscore liste die werte übergeben? den namen soll der benutzer nach dem programm ende eingeben können und die werte (Trefferquote) sollen von hier ausgelesen werden

Code:
if (underscores == 0 || mistakes >= 6) {
				System.out.println(" (" + myword + ")");
				System.out.println("Anzahl Versuche: " + tries
						+ "    davon falsch: " + mistakes);
				System.out
						.println("Getippte Buchstaben: " + new String(probed));
				System.out.println("Anzahl versch. Buchstaben im Wort: "
						+ (tries - mistakes));
				System.out.println("Trefferquote: "
						+ (((tries - mistakes) * 100) / tries) + "%");
			}

ich hoffe ihr könnt mir soweit folgen.

mfg moe_joe
 
Hallo,

zu deinem ersten Problem, wie du die highscore-Liste ausgibst. Vielleicht würde es dir helfen, deinen eigenen Quelltext mal selbst Schritt für Schritt durch zu gehen. Bei einer Schleifen würde es sich lohnen, mehrere durchläufe im Kopf durch zu gehen. Dann hättest du nämlich sicher gemerkt, dass du für jede Zeile einen eigenen Dialog mit einer eigenen TextArea machst, anstatt alles in eine TextArea zu schreiben.

Die Lösung deines nächsten Problems hast du schon in deinem Quellcode stehen. Du befüllst deine Liste schon mit Beispieldaten.

Es würde dir etwas mehr bringen, wenn du versuchst den Quellcode, den du von anderen kopierst zu verstehen. Sowas funktioniert zum Beispiel, wenn man sich kleine Beispiel-Programme schreibt und da mal alles ausprobiert. So ist der Lernerfolg viel größer als so.
Die Leute die dir helfen, machen nämlich nichts anderes.

MFG

zEriX
 
also zu dem ding mit der schleife, das mir auch schon auf´gefallen und geändert. hab halt den quelltext noch nich geupdated.

Die Lösung deines nächsten Problems hast du schon in deinem Quellcode stehen. Du befüllst deine Liste schon mit Beispieldaten.

hättest du dir mal den ganzen quellcode angesehen wüsstest du das die liste nur mit bsp daten gefüllt wird wenn noch keine highscore.txt datei vorhanden ist! das ist sie bei mir aber. und deshalb wird sie nicht mit den bsp daten gefüllt! die hghscoredaten soll er mir nämlcih in das TextArea schreiben. mein problem ist jetzt nur da sich nciht weis wie ich dem text area die daten aus dem array anzeigen lass. grob gesagt, so:
Code:
hs.setText(highscore[i]);
 
hättest du dir mal den ganzen quellcode angesehen wüsstest du das die liste nur mit bsp daten gefüllt wird wenn noch keine highscore.txt datei vorhanden ist!

Das habe ich schon gesehen, aber nach dieser Frage zu urteilen

Code:
und wo kann ich der highscore liste die werte übergeben?
Sieht, das so aus, als wüsstest du nicht, wie du einen Highscoreeintrag anlegst, obwohl du es mit einen Beispieleinstellungen machst.

Wenn eine Datei schon vorhanden ist, solltest du die Werte alle einlesen und in dein Array schreiben. Wenn einer dann gespielt hat und die einen Eintrag vornehmen willst, musst du schauen an welche stelle er kommt und alles weiterrücken.

mein problem ist jetzt nur da sich nciht weis wie ich dem text area die daten aus dem array anzeigen lass

Jedes Object hat eine toString-Methode. Da könntest du festlegen was ausgegeben wird. Diese Methode müsstest du bei deiner Highscore-Klasse überschreiben und da gibst du halt den Namen mit den Punkten aus.
Code:
hs.append(highscore[i].toString());


MFG

zEriX
 
hab jetzt Highscore als eigene methode geschrieben und versuche jetzt das beim gewinnen des SPiels die methode aufgerufen wird, nen neues JDialog erscheint in dem der benutzer unten seinen namen eingeben kann der dann zusammen mit der trefferquote im JDialog in die Highscore geschrieben wird.

Code:
public void Highscore() {
		
    	JDialog hsd = new JDialog(); 	
    	JTextField tf = new JTextField();
		JButton hsbutton = new JButton("Hinzufügen");
		hsd.add(hsbutton);
		hsd.add(tf);
		hsd.setTitle(".:Hangman:. - Highscore");
		hsd.setSize( 300, 450 ); 
		hsd.setResizable(false);
		hsd.setLocation (450, 0);
		hsbutton.setLocation (450, 0);
		tf.setLocation (450, 0);
		hsd.setVisible(true);
		tf.setVisible(true);
		ActionListener hsb = new ActionListener() {
		      public void actionPerformed( ActionEvent e ) {
		        System.exit( 0 );
		      }
		 };

		hsbutton.addActionListener(hsb);
		
	}

das meine methode Highscore

Code:
case -1:
			g.drawImage(tk.getImage("http://www.tutorials.de/forum/images/hm.gif"), SX, SY, this);
			g.setColor(Color.green);
			g.drawString(">>> GEWONNEN <<<", WND_B / 2 - 70, WND_H / 2 + 10);
			Highscore();
			removeKeyListener(control);
			break;

wenn das Spiel gewonnen ist soll die methode ausgerufen werden

Code:
	    private class HighscoreEintrag implements Comparable {

	        //Speichert den Namen
	        private String name;

	        //Speichert die Punkte
	        private double punkte;

	        //Erzeugt einen neuen HighscoreEintrag
	        public HighscoreEintrag(String name, double punkte) {
	            this.name = name;
	            this.punkte = punkte;
	        }

	        //Vergleichsfunktio
	        public int compareTo(Object o) {
	            HighscoreEintrag hE = (HighscoreEintrag) o;
	            if (this.punkte > hE.getPunkte()) {
	                return 1;
	            } else if (this.punkte < hE.getPunkte()) {
	                return -1;
	            }
	            return 0;
	        }

	        //Es folgen drei Funktionen, um die Werte auszulesen
	        public String getName() { 
	        	String eingabe = tf.getText(); 
	            return name;
	        }

	        public double getPunkte() {
	        	String trefferquote = "Trefferquote: "
	        	+ (((tries - mistakes) * 100) / tries) + "%";
	        	hs.append(trefferquote + "\n"); 
	            return punkte;
	        }

	        public String toString() {
	            return this.name + ": " + this.punkte;
	        }
	    }//Ende der inneren Klasse

in dem danne rscheinenden JDialog soll die Highscore liste angezeigt werden. ganz unten soll ein textfeld sein zum eingeben des namens und ein button zum hinzufügen zur highscore. dann sollen name und trefferquote zusammen in die highscore geschrieben werden.
 
Zuletzt bearbeitet:
Hat jemand zu was eine Idee. Du hast keine Frage gestellt. Aber falls die Frage sein soll, wo du die Methode aufrufen sollst, glaube ich kaum, dass du ne Antwort bekommen wirst.

MFG

zEriX
 
ich hätt gedacht wenn man sich meinen post durchliest wäre klar was ich meine. Aber zerix wenn du sooo auf ein fragezeichen bestehst sollst du es auch bekommen!

Mein Problem ist momentan das der JDialog 2 mal angezeigt wird. eigentlich soll der JDialog nur 1. mal erscheinen und die highscore.txt datei anzeigen. Im unteren Teil des Dialogs sollen JTextfield zum eingebn des namens für die highscore und nen button zum abschicken sein.das ganze klappt aber nicht wirklich, warum?

besser?

mfg mo_joe
 
*klugscheisserin an*
1. Sei froh das er versucht dir zu helfen :D
2. methodenNamen schreibt man klein :D
*klugscheisserin aus*
 
Zuletzt bearbeitet:
natürlich bin ich froh das es hier leute gibt die mir helfen^^ :)
meinte nich mal jemand das man methoden namen immer groß schreiben soll? aber gut wenn du sagtst die müssen klein sein wirds wohl stimmen.... <- wird sofort geändert

mfg moe_joe
 
Na du hast doch alle klein, nur die neue Highscore hast du gross geschrieben.
Klassennamen schreibt man gross, methoden und attribute klein
War ja auch nur nen Hinweis ^^

Aber teste mal ob du vllt 2 mal in die case -1 reinkommst.
 

Neue Beiträge

Zurück