# Rangliste erstellen



## moe_joe (8. Okt 2007)

ich will für mein kleines Spiel ne Highscore liste erstellen, die in eine txt datei geschrieben wird. momentan bin ich so weit:

```
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?


```
//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


```
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


----------



## madboy (8. Okt 2007)

moe_joe hat gesagt.:
			
		

> jetzt stellen sich mir noch die fragen: wie kann ich ein array in nem textarea darstellen?
> 
> 
> ```
> ...


du erstellst ja jedes Mal einen neuen Dialog und ne neue TextArea. Das wird wohl nicht das sein was du willst.
Versuchs mal so:

```
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);
hs.setEditable(false);
hs.setLineWrap(true);
hs.setBackground(Color.black);
hs.setWrapStyleWord(true);
hs.setForeground(Color.white);
 //Ausgabe der Liste
for (int i = 0; i < highscore.length; i++) {
			hs.append(highscore[i] + "\n");
}
hsd.setVisible( true );
```



			
				moe_joe hat gesagt.:
			
		

> 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
> 
> 
> ```
> ...


Sorry, da verstehe ich nicht, was du meinst. Willst du das auch in der JTextArea darstellen?


----------



## moe_joe (8. Okt 2007)

ich hatte das so gedacht, da sich nen Jdialog erstelle, der das JTextArea darstellt. dort sollen die daten der highscore liste ausgegeben werden. die daten FÜR die highscore liste sollen sich aus 

```
System.out.println("Trefferquote: "
+ (((tries - mistakes) * 100) / tries) + "%");
```

beziehen. es soll als wert die treffquote genommen werden. der name für die highscore liste soll dann seperat vom benutzer eingeben werden.


----------



## madboy (8. Okt 2007)

Das Prinzip ist eigentlcih nicht weiter kompliziert:

```
String trefferquote = "Trefferquote: " 
+ (((tries - mistakes) * 100) / tries) + "%";
JTextArea hs = new JTextArea();
hs.append(trefferquote + "\n");
```
Wie genau du das dann implementierst/haben willst verstehe ich immer noch nicht ganz. Poste doch mal, wie das aussehen soll in der JTextArea. Beispiel:


```
Name:     Treffer:
blablubb:  10%
blubbbla:  20%
```

Für die Eingabe nimmst wohl am besten ein JTextField:

```
JTextField tf = new JTextField();
//evtl. noch einen ActionListener ans JTextField mit tf.addActionListener(...);
//dialog.add(tf) usw.
//...
String eingabe = tf.getText();
hs.append(eingabe);
//...
```


----------



## moe_joe (8. Okt 2007)

es soll aussehen wie dein bsp. Das Spiel ist zu ende, dann soll der benutzer seinen namen eingeben können, auf button klicken "Highscore" und dann soll der eingebene namen mit der trefferquote zusammen in die highscore liste geschreiben werden.

Name : Trefferquote : (vielleicht noch datum wenns nich zu kompliziert ist)


----------



## moe_joe (8. Okt 2007)

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. 


```
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


```
case -1:
			g.drawImage(tk.getImage("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 aufgerufen werden


```
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
```

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?


----------

