carookee - group communication for you
Home / JavaForum / Beginner
Infos   |   Features   |   Gold-Edition   |   Kundenservice   
java
  Übersicht
  Forum
Beginner
Java allgemein
JDBC
JNI
Networking
Online-Ressourcen
Swing + AWT
XML
Meckerecke
  Mitglieder
LOGIN





· Passwort vergessen
· Kostenlos anmelden
  Information
  Demo
  Features
  Im Vergleich
  Anmeldung
SUCHE
Beiträge, Foren oder Verfasser finden:
  Kundenservice
  Impressum
  Datenschutz
  AGB
Status
4.593 User online
1 User eingeloggt
 

Beiträge
   Antworten     Neuer Beitrag    

Beitrag 25 von 2963 (1%) |<   <   >   >|

Autor MoeJoe
Datum 16.10.07, 12:10
Betreff Hangman Problem


Hi, ich hab mir ne kleine version von Hangman geschrieben. Allerdings läuft das Programm immer nur 1. mal durch bis ein Wort erraten/nicht errate wurde. Find das ganze nen bischen unpraktisch und hab mir überlegt das es ja sinnvoller wäre wenn das Programm solangge weiterläuft, bis der Benutzer auf "Ende" klickt oder ein Wort nicht erraten wurde. Wollte das mit ner For Schleife machen, aber alles was ich probiert habe führte nur zum kompletten chaos. Könnte ,mir vielleicht mal jemand einen Tipp/ansatz geben wie man das realisieren könnte?

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.AbstractAction;
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 java.io.IOException;
import java.util.Arrays;

public class Hangman extends JPanel implements ActionListener {
    
    private static final long serialVersionUID = -1844350059334672767L;
    // 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
    double runde = 0;
    static int ende = 0;
    KL control;
    char c;
    String ename = new String();
    
    
    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 suche ien wort ist...
                         myword = stmp; // setze myword auf gerade gelesenen
                         break;// String
                     }
                 }
            }
            f.close(); // Datei wieder schließen
        }// Ende von try
        
        catch (IOException ioe){ // Falls ein Fehler auftreten sollte
             System.out.println("IOException: " + ioe.toString()); // Fehlermeldungausgeben
            System.out.println(" Fehler 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 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);
             removeKeyListener(control);
             if (mistakes<6){
                 runde++;
             }
            
             new SortArray();
            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
             mistakes++; // schon einmal 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
             mistakes = -1;// Lösungswort sind
             if (mistakes >= 6)// wenn mehr als 5 Fehler gemacht wurden
             mistakes = 6;
             repaint(); // Grafikfenster neuzeichnen
         }
     }// Ende class KL
    
     public class highscoreliste{
         public void highscore(){
             File hsfile = new File("highscore.dat");
            if (hsfile.exists()) {//prüfen, ob die Datei existiert
                 try {
                     JDialog highscored = new JDialog();
                     JTextArea highscoreta = new JTextArea();
                     highscoreta.setEditable(false);
                     highscoreta.setLineWrap(true);
                     highscoreta.setBackground(Color.black);
                     highscoreta.setWrapStyleWord(true);
                     highscoreta.setForeground(Color.white);
                     highscored.add(highscoreta);
                     highscored.setTitle(".:Hangman:. - Highscore");
                     highscored.setSize( 300, 450 );
                     highscored.setResizable(false);
                     highscored.setLocation (450, 0);
                    FileReader hsfileR = new FileReader(hsfile);
                    //FileReader liest ein array of char und keinen String
                    char[] c = new char[(int) hsfile.length()];
                    hsfileR.read(c); //und in das erstellte char-array einlesen
                    String s = new String(c);//aus dem char-array einen string erzeugen
                     highscoreta.setText(s);
                     highscored.setVisible( true );
                     highscoreta.setVisible( true );
                    hsfileR.close(); //den FileReader wieder schließen
                    } catch (FileNotFoundException e) { //falls Fehler beim
                    e.printStackTrace(); //Einlesen auftreten,
                    } catch (IOException e) { //diese ausgeben
                    e.printStackTrace();
                }
            }
            else {
            }
         };
     };
    
     public class SortArray { //In Objekten dieser inneren Klasse werden die einzelnen
        //Highscore-einträge (Paare aus Spieler und Punkten) abgelegt
         private class HighscoreEintrag implements Comparable<Object> {
            
             private String name; //Speichert den Namen
             private double punkte; //Speichert die Punkte
            
            
             //Erzeugt einen neuen HighscoreEintrag
             public HighscoreEintrag(String name, double punkte) {
                 this.name = name;
                 this.punkte = punkte;
             }
            
             public int compareTo(Object o) { //Vergleich des eigenen
                 HighscoreEintrag hE = (HighscoreEintrag) o;//Objekts mit dem übergebenen
                 if (this.punkte > hE.getPunkte()) {
                     return 1;
                     } else if (this.punkte < hE.getPunkte()) {
                     return -1;
                 }
                 return 0;
             }
            
             public String getName() { //Es folgen drei Funktionen, um die Werte auszulesen
                 name=ename;
                 return name;
             }
            
             public double getPunkte() {
                 punkte=runde;
                 return punkte;
             }
            
             public String toString() {
                 return this.name + ": " + this.punkte;
             }
         }//Ende der inneren Klasse
        
         //Der Konstruktor, hier geht es richtig los
         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.dat");
            
             //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++) {
                 System.out.println(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();
             }
            
         }
     }
     @Override
     public void actionPerformed(ActionEvent arg0) {
     }
    
    
     public static void main(String[] args){ // Main
         Hangman Jpanel = new Hangman(); // Neuer Panel
         Jpanel.setLayout(null);
         final JFrame f = new JFrame("JFrame"); // Frame vereinbaren
         Button endeb = new Button("Ende");
        endeb.setBounds(320,175,80,20);
         Jpanel.setFocusable(true);
         Jpanel.requestFocusInWindow(); // Focus in Panel setzen
         Jpanel.add(endeb);
         ActionListener al = new ActionListener() {
             public void actionPerformed( ActionEvent e ) {
                 ende=1;
                 System.out.println(ende);


 Auf diesen Beitrag antworten
 Neuen Beitrag verfassen


|<   <   >   >|

                                                                                                                                                                                                                           

Impressum  · Datenschutz  · AGB  · Infos  · Presse
Ein modernes Forum: teamturn.com