Hangman spiel

Theroth

Mitglied
Hallo ich lese momentan als Anfänger das buch Java ist auch eine Insel und bin momentan bei Strings und habe im Buch nun ein Beispiel für das Spiel Hangman.

Code:
public class Hangman1
{
  public static void main( String[] args )
  {
    String hangmanWord = "alligatoralley";
    String usedChars = "";

    String guessedWord = "";
    for ( int i = 0; i < hangmanWord.length(); i++ )
      guessedWord += "_";

    for ( int guesses = 1; ; )
    {
      if ( guesses == 10 )
      {
        System.out.printf( "Nach 10 Versuchen ist jetzt Schluss. Sorry! "+
                           "Apropos, das Wort war '%s'.", hangmanWord );
        break;
      }

      System.out.printf( "Runde %d. Bisher geraten: %s. Was wählst du für ein 
                          Zeichen?%n", guesses, guessedWord );
      char c = new java.util.Scanner( System.in ).next().charAt( 0 );
      if ( usedChars.indexOf( c ) >= 0 )
      {
        System.out.printf( "%c hast du schon mal getippt!%n", c );
        guesses++;
      }
      else  // Zeichen wurde noch nicht benutzt
      {
        usedChars += c;
        if ( hangmanWord.indexOf( c ) >= 0 )
        {
          guessedWord = "";
          for ( int i = 0; i < hangmanWord.length(); i++ )
            guessedWord += usedChars.indexOf( hangmanWord.charAt( i ) ) >= 0 ?
                             hangmanWord.charAt( i ) : "_";

          if ( guessedWord.contains( "_" ) )
            System.out.printf( "Gut geraten, '%s' gibt es im Wort. " +
                               "Aber es fehlt noch was!%n", c );
          else
          {
            System.out.printf( "Gratulation, du hast das Wort '%s' erraten!",
                               hangmanWord );
            break;
          }
        }
        else // hangmanWord.indexOf( c ) == –1
        {
          System.out.printf( "Pech gehabt, %c kommt im Wort nicht vor!%n", c );
          guesses++;
        }
      }
    }
  }
}

So sieht das aus nun verstehe ich diese Zeile nicht
Code:
          guessedWord = "";
          for ( int i = 0; i < hangmanWord.length(); i++ )
            guessedWord += usedChars.indexOf( hangmanWord.charAt( i ) ) >= 0 ?
                             hangmanWord.charAt( i ) : "_";

          if ( guessedWord.contains( "_" ) )
            System.out.printf( "Gut geraten, '%s' gibt es im Wort. " +
                               "Aber es fehlt noch was!%n", c );

was genau passiert hier und was bedeutet das
>= 0 ?

für diese lange frage entschuldige ich mich aber ich schreibe ungern etwas ab was ich nicht verstehe.

Vielen vielen dank im Vorraus

Mit freundlichen Grüßen
Dominik
 
Code:
          guessedWord = "";
          for ( int i = 0; i < hangmanWord.length(); i++ )
            guessedWord += usedChars.indexOf( hangmanWord.charAt( i ) ) >= 0 ?
                             hangmanWord.charAt( i ) : "_";

          if ( guessedWord.contains( "_" ) )
            System.out.printf( "Gut geraten, '%s' gibt es im Wort. " +
                               "Aber es fehlt noch was!%n", c );

was genau passiert hier und was bedeutet das
>= 0 ?

Also ich bin kein Fan von solchen kombinierten Kommandozeilen, weil sie mir auch erschweren, den Code zu verstehen.

Also wenn du hier angekommen bist, heißt es, dass du einen Buchstaben richtig erraten hast. Davor wurde aber der eingetipte Buchstabe in "usedChars" zu einen String addiert.
z.B wenn du schon 3 Buchstaben eingegeben hast: abc, so hat dieser String einen Index, der von 0 bis 2 geht. "012"

guessedWord = ""; hier wird der der String geleert. Davor hatte man das hier "______________" reingespeichert.

dann wird eine for-Schleife konstruiert, die so lange durchläuft, wie die Lände des Strings ist, damit man alle Buchstaben des zu erratenden Wortes vergleichen kann.
for ( int i = 0; i < hangmanWord.length(); i++ )



Grobe Erklärung:
Hat man einen Buchstaben getroffen, so wird er an den String angehängt(Schleifenindex ist entscheidend), sonst ein Strich "_".

z.B wenn Schleifenindex i = 5 ist und du hast einen Buchstaben getroffen, dann wird an der 5.Stelle der Buchstabe angehängt. ____g__________


guessedWord += usedChars.indexOf( hangmanWord.charAt( i ) ) >= 0 ? hangmanWord.charAt( i ) : "_";

hangmanWord.charAt( i ) : liefer den Buchstaben an der i.ten Stelle
usedChars.indexOf( hangmanWord.charAt( i ) ) : liefert die Stelle von dem Buchstaben , falls er in usedChars existiert. Und wenn ja, ist der Index vermutlich größer oder gleich 0 ist.

? hangmanWord.charAt( i ) Bei Treffer wird der Buchstabe an der i.ten Stelle in "guessedWord" hinzugefügt. wenn nicht : "_"; ein Strich.


Java:
 if ( guessedWord.contains( "_" ) )
            System.out.printf( "Gut geraten, '%s' gibt es im Wort. " +
                               "Aber es fehlt noch was!%n", c );

hier wird kontrolliert ob alle Buchstaben erraten wurden oder noch in dem String "guessedWord" einen Strich "_" existiert. Wenn ja entsprechende Meldung, sonst gewonnen.


Ich habe versucht möglich verständlich zu erklären und hoffe konnte helfen.
 
Zuletzt bearbeitet:
Um noch ergänzend hinzuzufügen handelt es sich hierbei

Java:
            guessedWord += usedChars.indexOf( hangmanWord.charAt( i ) ) >= 0 ?
                             hangmanWord.charAt( i ) : "_";

um die Verwendung eines Tenären Operators, dieser ist eine alternative Art eine "einfache" If-Anweisung zu schreiben welche einen booleschen Vergleich repräsentiert, Nachteil hierbei ist das es sehr schnell , sehr kryptisch werden kann sobald die Bedingung komplexer wird.

Syntax ist immer folgende

boolescher Vergleich ? Rückgabewert wenn Vergleich wahr : Rückgabewert wenn vergleich Falsch;

Hier noch schnell ein einfaches Beispiel :

Java:
// Variablen
		int x = 10;
		int y = 12;
		
		// Tenärer Operator
		String res = x == y ? "Wahr" : "Falsch"; 
		
		// ist equivalent zu :
		
		// If-Anweisung 
		String result ="";
		
		if (x == y) {
			result = "Wahr";
		}
		else{
			result = "Falsch";
		}
 
Zuletzt bearbeitet:
Wow vielen vielen dank für deine Hilfe habe es verstanden 🙂 . Finde es ein bisschen schade das so etwas im Buch nicht gemacht wird. Aber nochmal vielen dank

Mit freundlichen Grüßen
Dominik
 
Ok habe den code nun nach mein Verstand umgestellt und er funktioniert auch bis auf den Anfang wo er mir als Ausgabe dieses hier Liefert

_ _ _ _ _ _ _ d_ _ _ _ _ _ // Mein Wort ist dabei dominik es sind also zuviele "_" .

Code:
public class Hangman{
	
	public static void main(String[] args){
		
		String HangmanWord = "dominik";
		String usedChars = "";
		String guessed = "";
		
		for(int i=0; i<HangmanWord.length(); ++i)
		{
			guessed += "_ ";
		}
		
		
		for(int counter= 0 ; ; )
		{
			
			char input = new java.util.Scanner(System.in).next().charAt(0);
			
			if(usedChars.indexOf( input ) >= 0)
			{
				
				
				System.out.println("Buchstabe bereits Verwendet");
				++counter;
				System.out.println("Versuch " + counter);
			}
			else  //Zeichen nicht benutzt sonst kann es übersprungen werden
			{
				
				usedChars += input;
				
				
				
				for(int i=0; i< HangmanWord.length(); ++i)
				{
					
					
					if( usedChars.indexOf( HangmanWord.charAt(i) ) >= 0 )
					{
						guessed += HangmanWord.charAt(i);
						
					}
						
					
					else
					{
						guessed += "_ ";
						
						
					}
		
				}
				
				
				System.out.println(guessed);
				
				if(!guessed.contains("_ "))
				{
					System.out.println("Gratulation du hast das Wort erraten !");
					break;
				}
				
				guessed = "";
				
				if(counter==5)
				{
					System.out.println("Sie haben verloren !");
					System.out.println("Das Word war "+ HangmanWord);
				}
				
				
				
				
			}
			
			
			
			
			
			
			
			
		}
		

		
		
	}
	
}

Nochmal vielen dank an alle die bereit sind meine Fragen zu beantworten und mein Code zu lesen. Sehe es als nicht Selbstverständlich an und bedanke mich deswegen nochmal an alle 😀


Mit freundlichen Grüßen
Dominik
 
Zuletzt bearbeitet:
ich bin mir grad nicht sicher da ich es nur überflogen habe , aber an dieser stellen

Java:
for(int i=0; i< HangmanWord.length(); ++i)
				{
					
					
					if( usedChars.indexOf( HangmanWord.charAt(i) ) >= 0 )
					{
						guessed += HangmanWord.charAt(i);
						
					}
						
					
					else
					{
						guessed += "_ ";
						
						
					}
		
				}

prüfst du ob ein Buchstabe schonmal verwendet wurde, und fügst dann deinem Wort entweder den Buchstaben hinzu, oder aber wieder ein "_" sprich jedes mal wenn ein Buchstabe schon verwendet wurde wird dein Wort länger, korrekt wäre aber glaube ich keine Aktion, sprich kein else block.
 
Zuletzt bearbeitet:

Zurück
Oben