Hangman/ Galgenmännchen

Sukran2323

Mitglied
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.
 

TM69

Bekanntes Mitglied
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 :D
 

Sukran2323

Mitglied
Code:
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
 

mihe7

Top Contributor
Das ist schon mal falsch:
char [] geraten = new char[anzahlversuche];
Abgesehen davon: wo bitte kommt anzahlversuche her?

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
int versuche = 0;
wirklich die richtige Bezeichnung für diese Variable ist...
 

MoxxiManagarm

Top Contributor
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

Mitglied
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 :(


Java:
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();
 

Anhänge

  • HangmanFx.zip
    4,2 MB · Aufrufe: 0
K

kneitzel

Gast
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

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

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

Java:
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();
        }
    }
 
K

kneitzel

Gast
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.
 

Ähnliche Java Themen

Neue Themen


Oben