# Hangman/ Galgenmännchen



## Sukran2323 (22. Jul 2020)

Hey ich habe ein Problem. Ich muss ein Galgenmännchen Spiel programmieren ich kann es auch mit den Quellqode schon durchführen, aber mein problem ist es, dass ich nicht weiß wie ich die Zählung von den Fehlern so einbauen kann. Ich benötige diese um Schritt für Schritt das Männchen zu erhängen. Ich würde mein Programm gerne einfügen es ist aber leider zu groß deswegen würde ich es einfach per Email zusenden.


----------



## mihe7 (22. Jul 2020)

Pack Dein src-Directory als ZIP und häng es einfach an.


----------



## TM69 (22. Jul 2020)

Sukran2323 hat gesagt.:


> Hey ich habe ein Problem. Ich muss ein Galgenmännchen Spiel programmieren ich kann es auch mit den Quellqode schon durchführen, aber mein problem ist es, dass ich nicht weiß wie ich die Zählung von den Fehlern so einbauen kann. Ich benötige diese um Schritt für Schritt das Männchen zu erhängen. Ich würde mein Programm gerne einfügen es ist aber leider zu groß deswegen würde ich es einfach per Email zusenden.


eine Anfrage über google hätte dich zu https://wiki.freitagsrunde.org/Javakurs/Übungsaufgaben/Hangman/Musterloesung gebracht


----------



## Sukran2323 (22. Jul 2020)

```
import java.util.Scanner;
import java.util.Random;

public class hangman3 {

  public static void main(String[] args) {
    Scanner tastatur = new Scanner(System.in);
    Random random = new Random(); 
   
    String [] woerter = {"ATMOSPHAERE", "TERASSENÜBERDACHUNG", "RYTHMUSGEFUEHL", "METAPHER", "WIRTSCHAFTINFORMATIK"}; 
   
    boolean nochmal = true;  //Endlosschleife while
   
    while (nochmal) {
     
      System.out.println("Herzlich Willkommen zum Galgenmännchen-Spiel"); 
      char [] zufallswort = woerter[random.nextInt (woerter.length)].toCharArray();
      char [] geraten = new char[anzahlversuche]; 

      int fehler;
      fehler = 0;
     
      for (int i = 0; i < geraten.length; i++) {
       
        geraten[i] = '_';
       
      }
      boolean erraten = false;
      int versuche = 0;
     
      while (!erraten && versuche != anzahlversuche) {
       
        System.out.print("Das gesuchte Wort: ");
        printArray(geraten);
       
        System.out.println("Du hast noch "+ (anzahlversuche - versuche) + " Versuche übrig" );
       
        System.out.print("Gebe ein Buchstabe ein(in Großbuchstaben): ");
        char eingabe = tastatur.nextLine().charAt(0);
       
        versuche++;
       
       
        if (eingabe == '-') {
         
          nochmal = false;
          erraten = true;
         
        } // end of if
        else {
         
         
         
          for (int i = 0; i < zufallswort.length; i++) {
           

            if (zufallswort[i] == eingabe) {
             
              geraten[i] = eingabe;
             
            } // end of if
           
           
           
            if (isteserraten(geraten)) {
             
              erraten = true;
              System.out.println("Herzlichen Glückwunsch du hast gewonnen!");
             
            } // end of if
           
          }
         
         
        } // end of if-else
       
       
      } // end of while
     

     
      if (!erraten) {
       
        System.out.println("GAME OVER! Du hast leider keine Versuche mehr :(");
        System.out.println("");
        System.out.println("Möchtest du nochmal spielen?(j/n)");
       
        String nocheinerunde = tastatur.next();
       
        if (nocheinerunde.equals("n")) {
         
          nochmal = false;
         
        } else {
         
          nochmal = true;
         
        } // end of if-else
       
      } // end of if
     
     
     
    } // end of while
   
    System.out.println("Game Over");
  } // end of main

  public static void printArray(char[] array){
   
    for (int i = 0; i < array.length; i++) {
     
      System.out.print(array[i] + " ");
     
    }
    System.out.println("");
   

  }

  public static boolean isteserraten(char[] array){
   
   
    for (int i = 0; i < array.length; i++) {
     
      if (array[i]=='_') {
        return false;
      } // end of if
     
    }
    return true;
  } // end of main

} // end of class hangman3
```


----------



## Sukran2323 (22. Jul 2020)

TM69 hat gesagt.:


> eine Anfrage über google hätte dich zu https://wiki.freitagsrunde.org/Javakurs/Übungsaufgaben/Hangman/Musterloesung gebracht


habe ich auch schon entdeckt aber bringt mich nicht weiter bei meinem Programm....


----------



## mihe7 (22. Jul 2020)

Das ist schon mal falsch:


Sukran2323 hat gesagt.:


> char [] geraten = new char[anzahlversuche];


Abgesehen davon: wo bitte kommt anzahlversuche her?



Sukran2323 hat gesagt.:


> aber mein problem ist es, dass ich nicht weiß wie ich die Zählung von den Fehlern so einbauen kann.


Naja, offensichtlich brauchst Du einen Zähler für die Fehler. In dem Zusammenhang stellt sich natürlich die Frage, ob


Sukran2323 hat gesagt.:


> int versuche = 0;


wirklich die richtige Bezeichnung für diese Variable ist...


----------



## MoxxiManagarm (22. Jul 2020)

Hier ein paar Anmerkungen:
- Terassenüberdachung sollte auch ue verwenden
- Hangman hat keine Versuchsanzahl, sondern eine Anzahl Fehlversuche
- Ich verstehe die '-' Bedingung nicht
- Du wirst nur nach einem neuen Spiel gefragt, wenn du verloren hast. Beim gewonnenen Spiel startet es einfach neu
- Ich empfehle "Spieleinstellungen"-Konstanten (hier Wörter, Anzahl Fehlversuche) als solche zu definieren. Du willst in größeren Programmen nicht den Code nach solchen Einstellungen durchsuchen.
- anzahlversuche wird bei dir nie definiert, fehler wird definiert und nicht verwendet
- Bitte gewöhne dir die "end of" Kommentare ab. Gute Klammerung (Einzug) reicht hier völlig aus.


----------



## spike86 (5. Aug 2020)

Hey Leute, auf grund dieses Threads, habe ich mich mal selber daran versucht via JavaFx ein Hangman Game zu schreiben, bis auf einen Fehler, bei dem ich nicht verstehe warum es so ist, läuft alles ganz gut. Das komplette Projekt hänge ich mal als Zip an.

Mein Fehler in dem Programm beseht darin, dass sobald ein Wort, den selben Buchstaben mehrmals beinhaltet, werden mir diese nicht ausegegeben. Irgendwie habe ich das Gefühl, dass es einfach nur eine Kleinigkeit ist, die ich falsch mache, aber ich komme nicht dahinter 



```
public boolean letterCheck(char[] wortToArr, char[] displayWord) {
        if(letter.getText().isEmpty() == false) {
        for (int i = 0; i < wortToArr.length; i++) {
            if(wortToArr[i] == letter.getText().toLowerCase().charAt(0)
                        || wortToArr[i] == letter.getText().toUpperCase().charAt(0)) {
                    displayWord[i] = wortToArr[i];
                    return true;
                    }
                }

        }
        return false;
    }

    // Confirm\check typed Letter
    public void checkLetter() {
        info.setText("");

        if (letterCheck(wortToArr, displayWord) == true) {
            rightletterString = new String(displayWord);
            hangmanWord.setText(rightletterString);
            info.setText("Richtig");
            
            AudioClip correctLetter = new AudioClip(
                    this.getClass().getResource("/sounds/correct.mp3").toExternalForm());
            correctLetter.play();

        } else {
            hangmanImage.setImage(new Image("/images/" + counter + ".png"));
            info.setText("Falsch");
            
            if (counter < 15) {
                AudioClip wrongLetter = new AudioClip(
                        this.getClass().getResource("/sounds/wrong.mp3").toExternalForm());
                wrongLetter.play();
            }
            counter++;
        }
        letter.clear();
```


----------



## kneitzel (5. Aug 2020)

Also als erstes ein kleiner Hinweis bezüglich der Bedingungen: ein == true bzw. == false ist nicht notwendig. Du hast schon ein boolean also reicht ein if (bedingung) statt if (bedingung == true) bzw if (!bedingung) statt eines if (bedingung == false).

Dann hast Du direkt ein return true, wenn ein Element gefunden wurde, d.h. du gehst nicht das ganze Wort durch. Du kannst vor der Schleife eine lokale Variable definieren z.B. `boolean result = false;`. Wenn der Buchstabe gefunden wird, dann setzt du result auf true und führst kein return aus. so gehst Du das wort weiter durch.
Am Ende dann natürlich ein return result statt einem return false.

Und statt in der if Bedingung zwei Dinge zu prüfen (einmal Großbuchstabe und einmal Kleinbuchstabe) kannst Du eine Prüfung durchführen bei der Du beide Seiten in Grossbuchstaben (oder Kleinbuchstaben, das ist natürlich egal) umwandelst. Das wäre dann evtl. einfacher zu lesen.

Die Benennung ist evtl. auch noch nicht ganz so schön. checkLetter und letterCheck ist fast gleich aber sie machen offensichtlich nicht das Gleiche ... Methodennamen sollten klar erkennen lassen, was diese Methoden machen und das ist hier ggf. noch nicht so gegeben.

Das einfach einmal von meiner Seite zu der Problematik.


----------



## spike86 (5. Aug 2020)

Ich danke dir, also wirklich eine Kleinigkeit, doof, dass ich nicht selber darauf gekommen bin -.- 
,aber ich stecke ja noch in den Kinderschuhen 

Mit den Groß - Kleinbuchstaben, dass würde ich lieber so belassen, gefällt mir irgendwie besser. 🙈
Irgendwie denke ich oft, während ich an meinen Projekten arbeite, an den Spruch "Viele wege führen nach Rom"
Ist diese Einstellung falsch, sollte man als Entwickler immer die perfekte Lösung anstreben?


Hier mein Code Update


```
public boolean arrayMatch(char[] wortToArr, char[] displayWord) {
        boolean result = false;
        if(!letter.getText().isEmpty()) {
        for (int i = 0; i < wortToArr.length; i++) {
            if(wortToArr[i] == letter.getText().toLowerCase().charAt(0)
                        || wortToArr[i] == letter.getText().toUpperCase().charAt(0)) {
                    displayWord[i] = wortToArr[i];
                    result = true;
                    }
                }

        }
        return result;
    }

    // Confirm\check typed Letter
    public void verifyTypedLetter() {
        info.setText("");

        if (arrayMatch(wortToArr, displayWord)) {
            rightletterString = new String(displayWord);
            hangmanWord.setText(rightletterString);
            info.setText("Richtig");
            
            AudioClip correctLetter = new AudioClip(
                    this.getClass().getResource("/sounds/correct.mp3").toExternalForm());
            correctLetter.play();

        } else {
            hangmanImage.setImage(new Image("/images/" + counter + ".png"));
            info.setText("Falsch");
            
            if (counter < 15) {
                AudioClip wrongLetter = new AudioClip(
                        this.getClass().getResource("/sounds/wrong.mp3").toExternalForm());
                wrongLetter.play();
            }
            counter++;
        }
        letter.clear();

        if (counter == 16) {
            hangmanWord.setText(wort);
            AudioClip wrongLetter = new AudioClip(this.getClass().getResource("/sounds/gameover.mp3").toExternalForm());
            wrongLetter.play();
        }
    }
```


----------



## kneitzel (5. Aug 2020)

Ja und ja:
Es gibt nicht die Lösung. Somit führen viele Wege nach Rom.
Aber es gilt auch: ja, man sollte immer an sich und dem Code arbeiten und ihn lesbarer machen, wenn möglich. Also sieh es als eine Art Clean Code Regel: Verlasse den Code immer lesbarer als Du ihn vorgefunden hast. (Kann man natürlich nicht erzwingen, aber wenn dir etwas auffällt: passe es an so es möglich ist! So verhindert man, das Code mit der Zeit nicht mehr wartbar ist.)

Generell ist es ok, wenn du sagst: so findest du es lesbarer. Es war ein Vorschlag, der nur eine Kleinigkeit war. Das kann jeder so sehen wie er für richtig hält. Deine Sichtweise ist nicht verkehrt und es spricht absolut nichts dagegen, es so zu belassen.

Ansonsten ist das Problem, welches Du hier hattest, eine typische Problematik am Anfang. Mit etwas Erfahrung wirst du nicht mehr über so Kleinigkeiten stolpern. Also einfach weiter (hoffentlich mit Spaß) dran bleiben.


----------



## Blender3D (6. Aug 2020)

Sukran2323 hat gesagt.:


> Hey ich habe ein Problem. Ich muss ein Galgenmännchen Spiel programmieren ich kann es auch mit den Quellqode schon durchführen, aber mein problem ist es, dass ich nicht weiß wie ich die Zählung von den Fehlern so einbauen kann.


Hier ein Beispiel dazu im Forum
https://www.java-forum.org/thema/mein-programm-beendet-sich-ohne-mein-zutun.185347/#post-1189943


----------

