Highscore-liste erstellen

Poste mal bitte deinen ganzen Quellcode. In dem Quellcode jetzt kann ich keinen Fehler erkennen.

Nur mal so als Tipp. Schreib für deine Dialoge eigene Klassen die von JDialog erben. In diesen Klassen definierst du dann, wie ein solcher Dialog aussehen soll. Das halt deine Klasse wesentlich übersichtlicher und kleiner.

MFG

zEriX
 
also hab hier und da noch nen paar kleine änderungen vorgenommen. also das ich 2. mal in case-1 komme ist unwarscheinlich! da kommt man ja nur rein wenn das spiel gewonnen ist. so denn hier der ganze quellcode:

Code:
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Arrays;

public class Hangman extends JPanel implements ActionListener {

	private static final long serialVersionUID = 1L;
	// Globale Variablen
	final static int WND_B = 425, WND_H = 360;
	final static int EXIT_ON_CLOSE = 0;
	final int SX = 50, SY = 50;
	RandomAccessFile file;
	String myword = null; // das zu erratene wort
	char xyword[]; // das ungelöste Wort
	char probed[];
	char notprobed[];
	char alphab[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',
			'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
			'Y', 'Z', 'Ä', 'Ö', 'Ü', 'ß' };

	int mistakes = 0; // Anzahl der Fehler
	int tries = 0; // Anzahl der Versuche
	KL control;
	char c;


	public Hangman() // Hauptroutine
	{
		String stmp = new String();
		try {
			int wordcount = 0; // neuer Integer für Wörterzahl
			int wordseek = 0; // ~ für Zielwort-Position
			RandomAccessFile f = new RandomAccessFile("hangman.dat", "r");
			while ((stmp = f.readLine()) != null) {
				wordcount++;
			}
			if (wordcount == 0) {
				System.out
						.println("ACHTUNG! In der Datendatei sind keine gültigen Wörter zu finden.");
				System.exit(0);
			}
			System.out.println("Woerter in Datendatei: " + wordcount); // Statusbericht
			while (wordseek == 0) // Solange wordseek noch 0 ist, tue ...
			{
				wordseek = (int) (Math.random() * wordcount) + 1; // hol' Dir
				// einen
				// Integer-Wert
			}
			System.out.print("Ausgewaehltes Wort: #" + wordseek); // Statusbericht
			f.seek(0); // Position auf Dateianfang setzen
			wordcount = 0; // Wieder auf NULL

			while ((stmp = f.readLine()) != null) // und das ganze von vorne
			{
				if (stmp.charAt(0) != '#') {
					wordcount++;
					if (wordcount == wordseek) // wenn an der Position, die wir
					// suchen ...
					{
						myword = stmp; // setze myword auf gerade gelesenen
						// String
						break;
					}
				}
			}
			f.close(); // Datei wieder schließen
		}// Ende von try

		catch (IOException ioe) // Falls ein Fehler auftreten sollte
		// Fehlermeldung ausgeben
		{
			System.out.println("IOException: " + ioe.toString()); // Fehlermeldung
			System.out
					.println("\n\nFehler beim Bearbeiten der Datendatei. Stellen Sie sicher," +
							" daß die Datei HANGMAN.DAT auch existiert und lesbar ist.");
			System.exit(0);// Beenden
		}

		KeyListener control = new KL(); // neuer KeyListener: CONTROL
		addKeyListener(control); // hinzufügen
		xyword = new char[myword.length()]; // array erstellen
		for (int i = 0; i < myword.length(); i++) {
			xyword[i] = '_';
		}
		probed = new char[alphab.length]; // array erstellen
		notprobed = new char[alphab.length];
		for (int i = 0; i < alphab.length; i++) {
			probed[i] = '-';
			notprobed[i] = alphab[i];
		}
	}// Ende Public Hangman () Hauptroutine

	public void update(Graphics g) {
		paint(g);
	}

	public void paint(Graphics g) // die Grafiken
	{
		Toolkit tk = Toolkit.getDefaultToolkit();
		g.setColor(Color.black); // Setzt Farbe auf Schwarz
		g.fillRect(0, 0, WND_B, WND_H);
		g.drawImage(tk.getImage("images/bg.gif"), 1, 1, this);
		g.drawString("Wort: " + new String(xyword), 40, 215);
		if (mistakes != -1) {
			g.drawString("Buchstaben: ", 40, 260);

			for (int i = 0; i < alphab.length; i++) {
				g.drawChars(probed, i, 1, 118 + i * 8, 260);
				g.drawChars(notprobed, i, 1, 118 + i * 8, 275);
			}

			g.drawString("Fehler: " + mistakes, 40, 230);
		}
		updatehangman(g); // Hangman updaten
	}// Ende pain(Graphics g)
	
	public void highscore() {
		File hsf = new File("highscore.txt");
		FileReader hsfR = new FileReader(hsf);
		char[] hsc = new char[(int) hsf.length()];
		hsfR.read(hsc);
		String hss = new String(hsc);
    	JDialog hsd = new JDialog(); 	
    	JTextField tf = new JTextField();
    	JTextField ta = new JTextField();
		JButton hsbutton = new JButton("Hinzufügen");
		hsd.add(hsbutton);
		hsd.add(tf);
		hsd.add(ta);
		ta.setEditable(false);
		ta.setSize(300, 400);
		String(hsc)= ta.getText();
		hsd.setTitle(".:Hangman:. - Highscore");
		hsd.setSize( 300, 450 ); 
		hsd.setResizable(false);
		hsd.setLocation (450, 0);
		hsd.setBackground(Color.black); // Hintergrund schwarz
		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);

		
	}
	
	

	public void updatehangman(Graphics g) {
		Toolkit tk = Toolkit.getDefaultToolkit(); // Toolkit für grafikdateien

		switch (mistakes) // Verschiedenen Fälle für Fehlermeldungen
		{
		case 6:
			g.drawImage(tk.getImage("images/hm6.gif"), SX, SY, this);
			g.setColor(Color.red);
			g.drawString(">>> VERLOREN <<<", WND_B / 2 - 70, WND_H / 2 + 10);
			g.setColor(Color.white);
			g.drawString("Das gesuchte Wort war '" + myword + "'!",
					WND_B / 4 - 100, WND_H / 2 - 10);
			removeKeyListener(control);
			break;
		case 5:
			g.drawImage(tk.getImage("images/hm5.gif"), SX, SY, this);
			break;
		case 4:
			g.drawImage(tk.getImage("images/hm4.gif"), SX, SY, this);
			break;
		case 3:
			g.drawImage(tk.getImage("images/hm3.gif"), SX, SY, this);
			break;
		case 2:
			g.drawImage(tk.getImage("images/hm2.gif"), SX, SY, this);
			break;
		case 1:
			g.drawImage(tk.getImage("images/hm1.gif"), SX, SY, this);
			break;
		case 0:
			g.drawImage(tk.getImage("images/hm0.gif"), SX, SY, this);
			break;
		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;
		}// Ende Switch
	}// Ende UpdateHangMan (Graphics g)

	class KL implements KeyListener {

		public void keyPressed(KeyEvent e) {

		}

		public void keyReleased(KeyEvent e) {

		}

		public void keyTyped(KeyEvent e) {
			c = e.getKeyChar(); // Taste holen
			c = Character.toUpperCase(c);
			int i;
			boolean status = false;
			boolean check = false;

			for (i = 0; i < alphab.length; i++) {
				if (c == alphab[i]) {
					if (probed[i] != c)
						probed[i] = c;
					else
						check = true;
					if (notprobed[i] == c)
						notprobed[i] = '-';
				}
			}

			int underscores = 0; // Integer für Anzahl der "_" im bisherigen
			// Wort

			for (i = 0; i < myword.length(); i++) // "Verschlüsseln" des
			// Ratewortes
			{
				if (c == Character.toUpperCase(myword.charAt(i))) {
					xyword[i] = myword.charAt(i);
					status = true;
				}

				if (xyword[i] == '_')
					underscores++;
			}

			if (!status && !check)// wenn der Buchstabe Falsch ist und nicht
				// schon einmal
				mistakes++; // Getippt wurde Fehler +1

			if (!check)
				tries++;

			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) + "%");
				
			}

			if (underscores == 0) // wenn keine fehlenden Zeichen im
				// Lösungswort sind
				mistakes = -1;

			if (mistakes >= 6)// wenn mehr als 5 Fehler gemacht wurden
				mistakes = 6;

			repaint(); // Grafikfenster neuzeichnen
		}
	}// Ende class KL
	
	public class sortArray {

	    //In Objekten dieser inneren Klasse werden die einzelnen
	    //Highscore-einträge abgelegt
	    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) + "%";
	            return punkte;
	        }

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

	    //Der Konstruktor
	    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("highscore.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
	        Arrays.sort(highscore);

	        //Ausgabe der Liste
	        for (int i = 0; i < highscore.length; i++) {
	        	ta.append(highscore[i].toString());
	        }

	        //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();
	        }

	    }
	}
	

	public static void main(String[] args) // Main
	{
		Hangman Jpanel = new Hangman(); // Neuer Panel
		final JFrame frame = new JFrame("JFrame"); // Frame vereinbaren
		Jpanel.setFocusable(true);
		Jpanel.requestFocusInWindow(); // Focus in Panel setzen
		frame.setTitle(".:Hangman:."); // Titel setzen
		frame.add(Jpanel, BorderLayout.CENTER); // Frame den Panel zuweisen
		frame.setSize(425, 360); // Größe setzen
		frame.setResizable(false);
		frame.setBackground(Color.white); // Hintergrund schwarz
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// Beim Klicken
		JMenuBar menuBar = new JMenuBar();// Menübar erstellen
		frame.setJMenuBar(menuBar);// Menü dem Frame zuweisen
		JMenu datei = new JMenu("Datei");// Menüpunkt "Datei" Vereinbaren
		menuBar.add(datei);// Menüpunkt "Datei" der Menübar hinzufügen
		JMenu hilfe = new JMenu("Hilfe");// Menüpunkt "Hilfe" vereinbaren
		menuBar.add(hilfe);// Menüpunkt "Hilfe" der Menübar hinzufügen
		datei.add(new AbstractAction("Nochmal") {
			public void actionPerformed(ActionEvent arg0) {
				System.out.print("Nochmal...");
				frame.dispose();
                initializeNewWindow();
			}

			private void initializeNewWindow() {
				// TODO Auto-generated method stub
				
			}
		});

		datei.add(new AbstractAction("Beenden") {
			public void actionPerformed(ActionEvent e) {
				System.out.println("Beenden...");
				System.exit(0);
			}
		});
		hilfe.add(new AbstractAction("Spielregeln") {
			public void actionPerformed(ActionEvent e){
				System.out.println("Spielregeln...");
				JDialog d = new JDialog(); 
				JTextArea ta = new JTextArea();
				ta.setEditable(false);
				ta.setLineWrap(true);
				ta.setBackground(Color.black);
				ta.setWrapStyleWord(true);
				ta.setForeground(Color.white);
				ta.setText("                          .:Hangman:. Spielregeln" +
						"                              " +
						"Wenn das spiel startet erscheint eine Kette von Strichen, " +
						"die so viele Elemente enthält wie das zu erratene Wort lang ist. " +
						"Nun geben Sie einen beliebigen Buchstaben des Alphabets ein (A-Z, ü, ä, ö, ß). " +
						"Falls der Buchstabe vorkommt, wird er über jeden Strich geschrieben, " +
						"der an einer Position steht, an der der Buchstabe im Wort verwendet wird. " +
						"Falls der Buchstabe nicht vorkommt, wird ein Galgen mit einem Strichmännchen " +
						"um ein weiteres von insgesamt 6 Elementen vervollständigt. Im unteren teil " +
						"des Fensters sehen Sie die von ihnen schon getippten Buchstaben. Wurde das " +
						"Wort erraten, bevor der Galgen komplett gezeichnet werden konnte, ist das S" +
						"piel gewonnen. Andernfalls ist das spiel beendet und der Computer hat Gewonnen." +
						"                 Viel Spaß!");
				d.add(ta);
				d.setTitle(".:Hangman:. - Spielregeln");
				d.setSize( 300, 450 ); 
				d.setResizable(false);
				d.setLocation (450, 0);
				d.setVisible( true );
			}});
			
			hilfe.add(new AbstractAction("Highscore") {
				public void actionPerformed(ActionEvent e){
					System.out.println("Highscore...");
					
				}});

	frame.setVisible(true);// Frame sichtbar machen	
	}// Ende Main
	
	
	

	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub

	}
}// Ende public class Hangman
 
Zuletzt bearbeitet:
Ich frage mich wie das Programm bei dir läuft. Ich hab es bei mir reinkopiert und mir wurden direkt mehrere Syntaxfehler angezeigt + fehlende try-catch-blöcke.

Du kannst auch keine Textfelder irgendwo verwenden, wo diese gar nicht bekannt sind. Genau wie TextAreas. Du solltest das setzen des Strings über getter und setter-Methoden lösen.

MFG

zEriX
 
Nochmal Verbesserungen
1. Entweder schreib alle Methodennamen gross oder klein, du hast zb die UpdateHangMan methode wieder gross und den rest klein
2. Gib deinen variablen sinnvolle namen. hsd, tf, ta sagt doch nix aus.
3. Wie zerix schon sagte, schreib fuer die Dialoge eigenen Klassen.
 
ja das mit dem syntax ist noch so nen kleines problem bei mir^^aber sosnt läufts! das scheint den compiler nicht daran zu stören es bei mir anzuzeigen.

2. Gib deinen variablen sinnvolle namen. hsd, tf, ta sagt doch nix aus.

schon behoben


2. Gib deinen variablen sinnvolle namen. hsd, tf, ta sagt doch nix aus.

ja das imemrso das ding mit variablen namen... für mich sind sie sinnvoll, hsd=highscore dialog usw... aber wwenn andere leute das lesen müssen...stimmt schon nich grad das verständlichste

3. Wie zerix schon sagte, schreib fuer die Dialoge eigenen Klassen.

da kann ich jetzt nich so ganz folgen... steh grad auf'm schlauch

Du kannst auch keine Textfelder irgendwo verwenden, wo diese gar nicht bekannt sind. Genau wie TextAreas

ja ich weiß, bin ja auhc noch dabei das zu ändern, aber weiß noch wie ich das machen soll....
 
Das programm kann so gar nicht laufen, da es so gar nicht compiliert werden kann.

Ich gebe dir noch einen Rat. Lass das Spiel sein und mach kleinere Übungen, bis die Gundlagen mal sitzen. Du machst Fehler die einer macht, der das erste mal was programmiert und da sollte man nicht direkt mit einem solchen Spiel anfangen.

Alleine der Zeitraum den du braucht um das Spiel umzusetzen zeigt schon, dass die noch viel wissen fehlt und das solltest du dir erst einmal aneignen. Das ist jetzt - wenn ich richtig gezählt hab - die dritte Woche, die du an dem Programm verbringst. Ich hätte das Spiel in 2 Arbeitstagen fertig- mit Highscore-Liste, einer Datenbank und einem Dialog mit dem man selbst Wörter einfügen kann.

3. Wie zerix schon sagte, schreib fuer die Dialoge eigenen Klassen.
da kann ich jetzt nich so ganz folgen... steh grad auf'm schlauch

Du hast mit deiner Klasse Hangman ein JPanel erweitert. Genauso kann man das mit jeder anderen Klasse machen, also auch mit einem JDialog. Dann brauchst du in der Klasse Hangman nur noch ein Object anzulegen und brauchst nicht den ganzen Dialog noch zu bauen.

Du kannst auch keine Textfelder irgendwo verwenden, wo diese gar nicht bekannt sind. Genau wie TextAreas
ja ich weiß, bin ja auhc noch dabei das zu ändern, aber weiß noch wie ich das machen soll....

Wie ich schon sagte - Grundlagen. Schau dir mal Getter und Setter methoden an.

MFG

zEriX
 
@mimij85
Ich sage ja auch nicht, dass er dafür 2 Tage brauchen soll. Ich will nur mal deutlich machen, dass ihm noch sehr viele Grundlagen fehlen.

MFG

zEriX
 
mal wieder das theman.... ja das das programm so nicht compiliert werden kann kann ich ja nich riechen! eclipse macht es bei mir. frag mich nciht warum?! gibt mir nur ein paar warnmeldungen aus.
ja ich weiß da sich noch viele fehler mache... ich weiß aber auch das sich durch dieses spiel schon viel gelernt habe was ich vorher nicht wusste. Also hat es schonmal was gebracht.und NEIN ich lasse es nicht sein, soll ich meinem chef sagen du sorry aber ich programmier das Spiel nicht weiter, da hat einer ausm forum gesagt ich soll das sein lassen.... da guckt der mich auch nur blöd an. ja ich bin 3 wochen dabei, aber zwischen durch halt noch andere sachen zu tun berufsschule usw...
 
Aber warum verlangt dein Chef von dir das du sowas programmiers, wenn du kaum Kentnisse hast? Vor allem welcher Chef will nen Hangman haben? ^^
 
Zurück