# Highscoreliste für ein Vokabeltrainer (brauche hilfe)



## aro69 (14. April 2006)

Hallo ersteinmal alle zusammen

Ich versuche mein Informatiktechniker in Abendform zu machen und brauche eure Hilfe. Bislang habe ich mich fürs Programmieren nicht interessiert (umsomehr für Netzwerktechnik) bin also Laie. Jetzt haben wir ein Fach bekommen das OPRO (Objekt Orientierte Prog.) heisst und ich habe grosse schwierigkeiten, diese Prog.Sprache (Java) zu verstehen. Es ist nicht so, dass ich es überhaupt nicht kann, jedoch ein Anfänger bin.
Also der Lehrer möchte das wir ein Vokabeltrainer (Deutsch-Englisch / Englisch-Deutsch) programmieren. Die Englisch bzw. Deutsche Vokabeln sollen aus einer Textdatei ausgelesen werden. Fals eine Vokabel in dieser Sitzung 3 mal infolge richtig beantwortet wird, soll sie nicht mehr abgefragt werden. Bein verlassen des Trainers soll eine Highscoreliste angezeigt werden, welches den "Platz, Name, Punkte, Wieviele Vokabeln, Richtige Vokabeln, Falsche Vokabeln" anzeigt.
Dies soll alles auf dem DOS Fenster geschehen.
Das Prog. habe ich soweit fertig programmiert (mit Hilfe eines Dicken Java Buches) bis zu Highscoreliste. Ich habe keinen blassen schimmer wie ich die programmieren soll?
Ich würde gerne die Hi-liste in eine Methode einpacken, da ich nicht weiss wie man zwei Classen miteinander verbindet.
Kann mir da Irgend jemand behilflich sein
Habe hier im Forum auch einige Hi-listen gefunden, jedoch nützen sie mir nicht viel, weil erstens ich nicht weiss was da passiert und zum zweiten diese nur 2-3 eintäge haben (Platz, Name, Punkte).
Würde mich freuen wenn mir jemand behilflich sein kann.
DANKE


----------



## flashray (14. April 2006)

Hallo,

der schwierigste Teil deiner Aufgabe wird sein, die notwendigen Daten während das Programm läuft zu sammeln und in eine Datei schreiben. Den Rest erledigt dann System.out.println(); . Also erstmal eine Methode implementieren die Namen, Datum, Anzahl richtige Antworten etc. in eine Datei speichert.


Vg Erdal


----------



## big_boom_bang (14. April 2006)

Hallo,
also ich denke mal das das mit ner ganznormalen int Zahl und einer if Verzweigung
gehen sollte z.B. so:

```
boolean voc=false; //Ein boolscher Wert der angibt ob die Vokabel gestellt wird
if (!voc) vocStellen();//wenn voc ==false ist wird die Vokabel gestellt    
if(i>3) voc = true // Die Meth. vocStellen rechnet i hoch wenn richtig. Wenn i>3 wird voc auf true gestellt somit ist die Abfrage Bedingung(!voc) nicht mehr erfüllt
```
MFG bigboombang


----------



## aro69 (14. April 2006)

Also mit dem 3 fach abfrage habe ich soweit erledigt.
Die ganzen Werte z.B "wieviele Vokabeln, davon richtige, dovon falsche, Punkte usw. die daten gehen mir in der Sitzung auch nicht verloren sprich die ganzen daten werden auch gesammelt. Jedoch weiss ich nicht wie ich sie in eine Highscoreliste einbauen soll. Besser gesagt ich weiss noch nicht einmal wie ich die Highscoreliste prog. soll
Ich habe eine Methode erstellt, wo ich ohne probleme die Daten für die Hi-liste anzeigen kann (sprich von dem aktuellen spieler) alo kann ich die daten auch in die methode weiter geben um sie in einer Hi-liste einzubauen. Aber wie baue ich sie ein wie prog. ich eine Hi-liste das  weiss ich nicht da liegt mein problem.


----------



## flashray (14. April 2006)

Auf der Doskonsole hast du ja garnicht so viele Möglichkeiten. Du gibts einfach in einer bestimmten Reihenfolge in einer Zeile die Werte zu einer Person aus.

System.out.println("Platz: " + platz + "Gewusste Wörter: " + anzahl + "Name: " + name";

Danach kommen jeweils die Werte zu anderen Personen analog zu oben. Die Reihenfolge muss halt stimmen, sonst wäre es nur eine Datenliste und keine Highscore.


Vg Erdal


----------



## aro69 (14. April 2006)

Hallo Flashray
Nur die werte ausgeben reicht leider nicht aus.
In etwa müsste es so aussehen:

Platz	Name	Punkte	WievieleVokab	RichtigVokab	FalschVokab
----------------------------------------------------------------------------------------------------------
1	  flash	     200	            50		   30		         20
2	  aro	     195	            60		   29		         31	
3	  flash	     180	            55		   25		         30
.
.
.
.
.
.
10	  aro	     45	                    80		    15		         65
-------------------------------------------------------------------------------------------------

Diese tabelle müsste auch irgendwie gespeichert werden, 
damit man beim nächsten spielen wieder auf die Werte zugreifen
kann.Am besten in ein Text Dokument welches man erst ausliest ggf.
ändert und wieder speichert.
Das ist mein problem...

PS: Die Daten sollten natürlich dierekt untereinander stehen. Ich habe es hier auf dem Board mit Tabulator nicht hinbekommen.


----------



## flashray (14. April 2006)

Hallo,

du brauchst jetzt drei Methoden hierfür:

loadScoreLists()

storeLastScore()

showHighScore()

Das speichern und lesen tust du in eine Textdatei mit Hilfe der Klasse Properties:
http://www.galileocomputing.de/open...sel11_006.htm#Rxx747java11006040003921F020100
http://de.wikipedia.org/wiki/Java-Properties-Datei
http://javaalmanac.com/egs/java.util/pkg.html#Property Files

Wobei ein Datenpaar so aussehen sollte. Für x sollte eine Zahl = Anzahl Datenpaar in Textdatei + 1 stehen
sessionx=Hans Müller/200/50/30/20

Nach dem lesen wirst du die Methode split() brauchen, mit welcher du immer ein Datenpaar auftrennst in seine Bestandteile und in ein mehrdimensionales Array[Anzahl Datenpaar in Textdatei+1][Anzahl spalten hier 5] speicherst.

In die letzte Zeile speicherst du dann die aktuellen Werte. Jetzt kannst in der Methode showHighScore() aus den Werten den Rang berechnen und dann nach der Reihenfolge mit System.out.println() ausgeben.

Versuch mal bitte diese drei Methoden zu implementieren. Und schreib deine Zwischenergebnisse hier ins Forum und eventuell wo es noch Probleme gibt.

Vg Erdal


----------



## aro69 (15. April 2006)

hallo flashray
erstmal vielen Dank für deine Hilfe und gedult.
Ich muss hier halt nochmal betonen, das ich ein anfänger bin. Ich habe mir die Links des öfteren durchgelesen jedoch ohne erfolg. Die Klasse Properties höre ich das erstemal und weiss noch nicht einmal richtig was es aus sich hat. Ich kann mir nichts darunter vorstellen.
Es sieht nach einer sehr eleganten art und weise des programmierens aus. Währe es möglich, mir das nochmal schritt für schritt mit beispielen zu zeigen? Ich blicke da einfach nicht durch!
Ich habe eine txt Datei erstellt wo ich zehn namen mit den dazugehörigen werten gespeichert habe, die durch ein komma getrennt sind z.B. (Hans,300,50,30,20) 
Wie muss ich jetzt weiter vorgehen bitte mit beispiel.

MfG


----------



## flashray (15. April 2006)

Hallo,

ich hatte für meine Programme mal eine Hilfsklasse für Properties geschrieben. Du könntest sowohl diese Klasse in deinem Programm nuzten, als auch hast du hier 4 Beispiele wie man die Klasse Properties anwendet.


```
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;

public class PropertiesHelp {

	private String file = "";

	public PropertiesHelp(String qfile) {
		file = qfile;
	}

	public String get(String key) {
		String out = "";
		try {
			Properties prop = new Properties();
			FileInputStream in = new FileInputStream(file);
			prop.load(in);
			in.close();
			out = prop.getProperty(key);
		} catch (IOException e) {
		}
		return out;
	}

	public void set(String key, String value) {
		try {
			Properties prop = new Properties();
			FileInputStream in = new FileInputStream(file);
			prop.load(in);
			in.close();
			prop.setProperty(key, value);
			FileOutputStream out = new FileOutputStream(file);
			prop.store(out, null);
			out.close();
		} catch (IOException e) {
		}
	}

	public boolean contain(String key) {
		boolean out = false;
		try {
			Properties prop = new Properties();
			FileInputStream in = new FileInputStream(file);
			prop.load(in);
			in.close();
			out = prop.containsKey(key);
		} catch (IOException e) {
		}
		return out;
	}

	public boolean empty() {
		boolean out = false;
		try {
			Properties prop = new Properties();
			FileInputStream in = new FileInputStream(file);
			prop.load(in);
			in.close();
			out = prop.isEmpty();
		} catch (IOException e) {
		}
		return out;
	}
}
```


Vg Erdal


----------



## aro69 (16. April 2006)

Wie kann ich die in eine Methode einbauen
Oder wie kann ich zwei klassen miteinander verbinden
Sind jetz in dem beispiel 4 eigenständige programme? wenn ja wo fangen die an und wo hören die auf
Kannst du mir vielleicht den Quellcode nur ein wenig  erklären um genau zu wissen was da überhaupt gemacht wird.
MfG


----------



## flashray (16. April 2006)

Hallo Aro69,

konnte leider bisher deinerseits nicht eine Zeile Code sehen  .

Schau mal hier:


```
public class PropertiesHelpUser {

	//config.txt mit folgendem Inhalt:
	//session1=Hans Jochen/30/20/10
	// ...
	//session10=Klaus Müller/45/15/30

	public static void main(String[] args) {
		String[][] matrix = new String[10][4];

		PropertiesHelp ph = new PropertiesHelp("config.txt");

		// Ein Wert auslesen ausgeben
		System.out.println(ph.get("session1"));

		// Werte einzelnen auslesen, splitten in die matrix notieren
		matrix[0] = ph.get("session1").split("/");
		matrix[0] = ph.get("session2").split("/");

		// Alle Werte mit einer Schleife einlesen ...
		for (int i = 0; i < 10; i++)
			matrix[i] = ph.get("session" + (i + 1)).split("/");

		System.out.println(matrix[0][0]); // Name
		System.out.println(matrix[0][1]); // Anzahl Wörter
		System.out.println(matrix[0][2]); // Anzahl gewusste Wörter
		System.out.println(matrix[0][3]); // Anzahl nicht gewusste Wörter
		
		// Analog geht auch das Speichern
		ph.set("session1", "James Bond/20/10/10");

		// Überprüfen ob ein Wert enthalten ist
		System.out.println(ph.contain("session4"));

		// Überprüfen ob leer ist
		System.out.println(ph.empty());
	}
}
```


Vg Erdal


----------



## aro69 (9. Mai 2006)

Hallo Flashray
Nach wochenlanger versuche habe ich es aufgegeben und mir überlegt, das Ich keine Highscoreliste Prog werde.
Ich werde eine Legende Prog. d.h. 

Wie oft wurde dieser Vokabeltrainer gespielt,
Wer ist der beste
Wieviele Vokabeln hat der jenigegespielt
Wieviel Prozent hat er

Wird zwar an der Endnote etwas schlechter ausfallen aber nun!?
Ich habe schon mal einiges gemacht, jedoch habe Ich jetzt probleme mit der (.split) datei.
Ich habe eine .txt Datei mit dem Inhalt  Hans/70/85.5/17 Ich bekomme beim auslesen der datei eine fehlermeldung.
Kannst du mir bitte helfen.


```
{
       BufferedReader lesen;
       String bestplayer ="";
        {
         int schreib=0;
         lesen = new BufferedReader(
         new FileReader("arif.txt"));//aus der Textdatei lesen
        
        
         while (bestplayer = lesen.readLine().split("/")); // Den array auffüllen (Deutsch)
          {							                  			// in einer schleife
			  Legende[schreib] = bestplayer;					// bis die arrayfelder
			  schreib += 1;											// voll sind
			 }
        }
		 lesen.close();  //lesen schlissen
		 
		  //vokarray = ein.readLine().split(";");* 

      String wieoftgespielt = (Legende[3]);
      int wieoftgespieltneu= Integer.parseInt(wieoftgespielt);
      wieoftgespieltneu += 1;
```

Ich bekomme diese Fehlermeldung

C:\Dokumente und Einstellungen\Arif\Desktop\Vokabeltrainer\Vokabeltrainer\vokabeltrainer4a.java:268: incompatible types

found   : java.lang.String

required: boolean

         while (bestplayer = lesen.readLine().split("/")); // Den array auffüllen (Deutsch)

                ^

Ich bin für jede hilfe Dankbar
Tschüss
Arif


----------



## teppi (9. Mai 2006)

Hallo aro69,

wow in einer Zeile 3 Fehler .. nich schlecht  

while (bestplayer = lesen.readLine().split("/")); 

1) eine While-Schleife erwartet einen boolschen Wert in der Klammer. (true -> Mach weiter! / false -> Brich ab!)
2) du deklarierst bestplayer als simplen String obwohl die String.split() Methode ein String Array zurück gibt.
3) das Semikolon hinten verhindert, dass der Code in den geschweiften Klammern hinter der While Zeile ausgeführt wird. 

Mein Rat: schau dir erstmal die Grundlagen an und lad dir die API runter.

Gruß Stefan


----------



## flashray (9. Mai 2006)

Hallo Arif,

hier mal ein Minibeispiel für einen Quiz mit Highscoreliste.


```
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Quiz {

	private static PrintStream o = System.out;

	private String[] word = { "K", "A", "N", "I", "N", "C", "H", "E", "N" };

	private String[] find = new String[word.length];

	private BufferedReader in;

	private int task = -1;

	private int tries = 0;

	private String input = "";

	private List<String[]> list = new ArrayList<String[]>();

	private PropertiesHelp ph = new PropertiesHelp("config.dat");

	public Quiz() {
		loadHighScoreList();
		greet();
		askForTask();
	}

	public static void main(String[] args) {
		Quiz p = new Quiz();
	}

	public void askForTask() {

		o.println("Type a number for wanted task, please!");
		o.println("After any input you have to press ENTER.");
		o.println("If you want ...");
		o.println();
		o.println("a) exit Quiz 2006 -> type 0");
		o.println("b) play Quiz 2006 -> type 1");
		o.println("c) show highscorelist -> type 2");

		o.println();

		try {
			in = new BufferedReader(new InputStreamReader(System.in));
			input = in.readLine();
		} catch (IOException e) {
			e.printStackTrace();
		}

		try {
			task = Integer.valueOf(input);
		} catch (NumberFormatException e) {
			o.println("Your input was invalid. Try it again, please!");
			o.println();
			task = 99;
		}

		switch (task) {
		case 0: {
			saveHighScoreList();
			o.println("Bye, till next game");
			System.exit(0);
		}
			break;
		case 1: {
			play();
		}
			break;
		case 2: {
			showHighScoreList();
		}
			break;
		default:
			askForTask();
		}

	}

	public void greet() {
		o.println("Hallo! Welcome to the prompt of Quiz 2006");
		o.println("Please, press ENTER to go on.");
		try {
			in = new BufferedReader(new InputStreamReader(System.in));
			input = in.readLine();
		} catch (IOException e) {
			e.printStackTrace();
		}
		o.println();
	}

	public void play() {
		for (int i = 0; i < word.length; i++)
			find[i] = "-";

		System.out.println("Find The Word");

		tries = 0;
		while (!Arrays.equals(word, find)) {
			printArray(find);
			System.out.println("Say a letter, please:");
			try {
				in = new BufferedReader(new InputStreamReader(System.in));
				input = in.readLine();
			} catch (IOException e) {
			}
			if (input.length() == 0)
				continue;
			for (int i = 0; i < word.length; i++) {
				if (word[i].equals("" + input.substring(0, 1).toUpperCase()))
					find[i] = input.substring(0, 1).toUpperCase();
			}
			tries++;
		}
		System.out.println("Bravo! You win!");
		printArray(find);

		enterNewPlayer();

		o.println();
		askForTask();
	}

	public void enterNewPlayer() {
		String player = "";

		o.println("Type your name, please!");

		try {
			in = new BufferedReader(new InputStreamReader(System.in));
			input = in.readLine();
		} catch (IOException e) {
			e.printStackTrace();
		}
		player = input;
		int point = (int) (100.0 * (1.0 / Math.pow((double) tries, 0.2)));
		if (player != null && player.length() > 0) {
			list.add(new String[] { player, "" + point });
			o.println("Your data is registered in the highscorelist.");
		}
	}

	public void showHighScoreList() {

		if (list.size() == 0)
			o.println("Highscorelist is empty!");
		else {
			Integer[] points = new Integer[list.size()];
			Integer[] order = new Integer[list.size()];
			for (int i = 0; i < list.size(); i++) {
				points[i] = Integer.parseInt(list.get(i)[1]);
			}
			for (int i = 0; i < list.size(); i++) {
				int index = Arrays.asList(points).indexOf(max(points));
				points[i] = -1;
				order[i] = index;
			}
			o.println("Quiz 2006 - Highscorelist:");
			for (int i = 0; i < list.size(); i++) {
				o.print("place: " + (i + 1) + " - " + list.get(order[i])[0]
						+ " - ");
				o.println(list.get(order[i])[1] + " points");
			}
		}

		o.println();
		askForTask();
	}

	public void loadHighScoreList() {
		File file = new File("config.dat");
		if (!file.exists()) {
			try {
				file.createNewFile();
			} catch (IOException e) {
				e.printStackTrace();
			}
		} else {
			int size = ph.getSize();
			for (int i = 0; i < size; i++) {
				list.add(ph.getProperty("player" + i).split("/"));
			}
		}
	}

	public void saveHighScoreList() {
		int size = list.size();
		for (int i = 0; i < size; i++) {
			ph.setProperty("player" + i, list.get(i)[0] + "/" + list.get(i)[1]);
		}
	}

	public void printArray(Object[] o) {
		for (int i = 0; i < o.length; i++)
			System.out.print(o[i]);
		System.out.println();
	}

	public int max(Integer[] t) {
		int maximum = t[0]; // start with the first value
		for (int i = 1; i < t.length; i++) {
			if (t[i] > maximum) {
				maximum = t[i]; // new maximum
			}
		}
		return maximum;
	}
}
```

Hilfsklasse:

```
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;

public class PropertiesHelp {

	private String file = "";

	public PropertiesHelp(String qfile) {
		file = qfile;
	}

	public String getProperty(String key) {
		String out = "";
		try {
			Properties prop = new Properties();
			FileInputStream in = new FileInputStream(file);
			prop.load(in);
			in.close();
			out = prop.getProperty(key);
		} catch (IOException e) {
		}
		return out;
	}

	public void setProperty(String key, String value) {
		try {
			Properties prop = new Properties();
			FileInputStream in = new FileInputStream(file);
			prop.load(in);
			in.close();
			prop.setProperty(key, value);
			FileOutputStream out = new FileOutputStream(file);
			prop.store(out, null);
			out.close();
		} catch (IOException e) {
		}
	}

	public boolean containsKey(String key) {
		boolean out = false;
		try {
			Properties prop = new Properties();
			FileInputStream in = new FileInputStream(file);
			prop.load(in);
			in.close();
			out = prop.containsKey(key);
		} catch (IOException e) {
		}
		return out;
	}

	public boolean isEmpty() {
		boolean out = false;
		try {
			Properties prop = new Properties();
			FileInputStream in = new FileInputStream(file);
			prop.load(in);
			in.close();
			out = prop.isEmpty();
		} catch (IOException e) {
		}
		return out;
	}

	public void printOut() {
		try {
			Properties prop = new Properties();
			FileInputStream in = new FileInputStream(file);
			prop.load(in);
			in.close();
			prop.list(System.out);
		} catch (IOException e) {
		}
	}

	public int getSize() {
		int size = 0;
		try {
			Properties prop = new Properties();
			FileInputStream in = new FileInputStream(file);
			prop.load(in);
			in.close();
			size = prop.size();
		} catch (IOException e) {
		}
		return size;
	}
}
```


Vg Erdal


----------



## aro69 (9. Mai 2006)

Hallo flashray
Dein beispiel ist für mich viel zu kompliziert.
Daher versuche ich es mit dem ".split" weiter. Habe jetzt versucht mit einer "for" schleife die daten auszulesen (klappt nicht). Das es mit der "while" schleife nicht funz habe ich mitbekommen. Was mache ich den hier falsch?

```
static void highscore(String highscoretabelle)
		throws IOException
      {
       String[]Legende = new String[4];
       BufferedReader lesen;
       {
         lesen = new BufferedReader(
         new FileReader("arif.txt"));//aus der Textdatei lesen
      try
    {
          for (int zahl = 0; zahl < Legende.length; ++zahl)
		  {
			Legende[zahl]=lesen.readLine().split("/");
			
			System.out.println(Legende[zahl]);
		  }
          
     }
    catch ( IOException e ) 
    {
      System.out.println( "Konnte Datei nicht erstellen" );
     }
```

Nach dem ich es compiliere bekomme ich diese fehlermeldung

Compile C:\Dokumente und Einstellungen\Arif\Desktop\Vokabeltrainer\Vokabeltrainer\vokabeltrainer4a.java....
C:\Dokumente und Einstellungen\Arif\Desktop\Vokabeltrainer\Vokabeltrainer\vokabeltrainer4a.java:269: incompatible types

found   : java.lang.String[]

required: java.lang.String

	Legende[zahl]=lesen.readLine().split("/");

                                                                                   ^
1 error
Compilierung beendet

PS: Dieses Zeichen  ^  ist unter ("/")

Gruss
Arif


----------

