1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Hangman Problem

  • moejoe
  • 17. Oktober 2007 um 09:00
  • Unerledigt
  • moejoe
    1
    moejoe
    Mitglied
    Punkte
    10
    Beiträge
    1
    • 17. Oktober 2007 um 09:00
    • #1

    Hi, ich probier jetzt schon seit einiger Zeit Hangman mit Java zu Programmieren... bin da auch schon ein gutes Stück weitergekommen. Was noch nciht so klappt ist in der Menüauswahl "Neustarten" das Programm neustartten zu lassen. Wenn da einer ne Idee hat wäre das super. Jetzt habe ich das Problem das mein Programm nach jedem erratenen/nicht erratenem wort endet. Besser fände ich es aber wenn das programm solange durchläuft bis ein wort nicht erraten wurde. Wenn dann die methode Highscoreeintrag am Porgrammende erscheint, befinden sich im unteren Teil des Dialogs ein JTextfield und ein JButton, hier soll man seinen Namen eingeben können und beim klick auf den Button der Name und die erreichte Punktzahl(rundenzahl) in die Highscoreliste geschrieben werden. Kann mir vielleicht jemand nen paar tipps geben wie man das realisieren könnte?

    Java
    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.IOException;
    
    
    
    
    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;
        static String eingegebener_name;     //Speichert den Namen
    
    
        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);
                       highscoreeintrag();
                       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==-1){
                           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 static void highscore(){
               File hsfile = new File("highscore.dat");
            if (hsfile.exists()) {//prüfen, ob die Datei existiert
                try {
                    JDialog highscored = new JDialog();
                    highscored.setLayout(new FlowLayout(FlowLayout.CENTER) );
                    JTextArea highscoreta = new JTextArea();
                    highscoreta.setEditable(false);
                    highscoreta.setLineWrap(true);
                       highscoreta.setBackground(Color.black);
                       highscored.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 static void highscoreeintrag(){
               File hsfile = new File("highscore.dat");
            if (hsfile.exists()) {//prüfen, ob die Datei existiert
                try {
                    JDialog highscored = new JDialog();
                    JTextArea highscoreta = new JTextArea();
                    JTextField name_eingabe = new JTextField();
                    JButton name_hinzufuegen = new JButton("Hinzufuegen");
                    highscored.add(name_hinzufuegen);
                    highscored.add(name_eingabe);
                    name_eingabe.setBounds(120,350,90,20);
                    name_hinzufuegen.setBounds(120,375,90,20);
                    eingegebener_name=name_eingabe.getText();
                    System.out.println(eingegebener_name);
                    highscoreta.setEditable(false);
                    highscoreta.setLineWrap(true);
                       highscoreta.setBackground(Color.black);
                       highscored.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> {  
    
                   String name;     //Speichert den Namen
                   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=eingegebener_name;
                       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)
                   java.util.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);
                }
             };
             endeb.addActionListener( al );
               f.setTitle(".:Hangman:."); // Titel setzen
               f.getContentPane().add(Jpanel); // Frame den Panel zuweisen
               f.setSize(425, 360); // Größe setzen
               f.setResizable(false);
               f.setBackground(Color.white); // Hintergrund schwarz
               f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Beim Klicken
               JMenuBar menuBar = new JMenuBar(); // Menübar erstellen
               f.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") {         
                   private static final long serialVersionUID = -2159585841646138441L;
                   public void actionPerformed(ActionEvent arg0) {
                       System.out.print("Nochmal...");
                       f.dispose();
                       initializeNewWindow();
                   }
                   private void initializeNewWindow() {
                   }
               });
    
               datei.add(new AbstractAction("Beenden") {
                   private static final long serialVersionUID = -3336927753599945264L;
    
                   public void actionPerformed(ActionEvent e) {
                       System.out.println("Beenden...");
                       System.exit(0);
                   }
               });   
    
               hilfe.add(new AbstractAction("Spielregeln") {
                   private static final long serialVersionUID = 6696373815358767871L;
                   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") {
                   private static final long serialVersionUID = 0L;
                   public void actionPerformed(ActionEvent e){
                       System.out.println("Highscore...");
                       highscore();
    
    
            }});
    
               f.setVisible(true);//
           }// Ende Main
    
    
    }// Ende public class Hangman
    Alles anzeigen

    mfg moejoe

  • Konterproduktiv
    5
    Konterproduktiv
    Mitglied
    Reaktionen
    3
    Punkte
    188
    Beiträge
    36
    • 19. Oktober 2007 um 23:04
    • #2

    Ich sehe in deinem Programm keine Stelle wo du den Programmfluss steuerst. Du hast mehr oder weniger 1 JPanel, wobei ein Teil der Logik in der Paint-Methode, der andere im Keyhandler steckt.
    Ich würde das Ganze mal überdenken und etwas umstrukturieren. In der jetzigen Form sind Gamestates oder Dialoge nicht gut möglich.

  • Maximilian Rupp 27. Dezember 2024 um 12:04

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Rechtliches

Impressum

Datenschutzerklärung