2017-05-18 6 views
0

Ich versuche, ein klassisches Hangman-Programm (die GUI ist in Ordnung, kein Problem damit), wo der Benutzer einen Buchstaben nach dem anderen raten. Das Problem ist, wenn der Benutzer einen Buchstaben errät, ersetzt er die Stelle von "_" mit dem erratenen Buchstaben (wenn der Buchstabe in dem Wort ist), aber wenn der nächste Buchstabe erraten wird, vergisst er die letzte Schätzung und die Ort geht zurück auf "_". Sorry, wenn das unklar ist, hier ist ein BeispielWie ändere ich den Wert eines Teilstrings?

Word is tiger, 
user guesses "g", 
outputs _ _ g _ _, 
user guesses "r", 
outputs _ _ _ _ r. 

Wie ich den Code arbeiten wollen:

Word is tiger, 
user guesses "g", 
outputs _ _ g _ _, 
user guesses "r", 
outputs _ _ g _ r. 

Wie kann ich das erreichen? Denken Sie daran, dass Tiger nur ein Beispielwort ist, Wörter werden zufällig aus einem Array gezogen. Ich denke, der einzige Weg, dies zu tun, ist, den Wert des Teilstrings in Leerzeichen zu ändern, aber ich weiß nicht, wie ich das machen soll. Ab jetzt rät der Benutzer den Buchstaben aus dem GUI-Fenster (wo der Mann selbst ist) und übermittelt die Antwort per Knopfdruck. Die Ausgabe wird nur auf der Konsole für jetzt gedruckt.

Hier ist das lästige Teil des Programms:

// guess is the name of JTextPane next to button 
// randWord is the word pulled randomly from an array 
private void guessLetter() { 
    guessedLetter = guess.getText(); 
    if (randWord.contains(guessedLetter)){ 
     reveal(); // method below 
    } else { 
     wrongGuesses++; // when wrongGuesses adds, 
     update(); // another body part is added, method not below 
    } 
} 

private void reveal() { 
    int start = randWord.indexOf(guessedLetter); //gets the index of the letter guessed 
    String print = blanks.substring(0, start) + guessedLetter + blanks.substring(start+1); //reveals the letter 
    System.out.println(print);//prints the revealed letter in correct spot 
} 
+0

Speichern Sie bereits 'geratenLetter's Innenrohlinge? – d9ngle

+0

Sie sollten versuchen, Ihre Frage einzugrenzen. Ich denke, eine vollständige Lösung würde mindestens 50-100 Zeilen Java-Code erfordern, was für eine einzelne Antwort ein bisschen zu weit ist. –

+0

@ d9ngle ziemlich viel. Ich möchte, dass der Teilstring von 'Leerzeichen' den Wert von' guessedLetter' enthält, wenn er korrekt ist. schau dir mein Beispiel im Beitrag an :) – CodingNinja

Antwort

5

Ein Weg, um diesen Ansatz ist es, ein StringBuilder Objekt zu halten, die während jeder Vermutung eines Briefes aktualisiert werden würde.

String wordToGuess = "tiger"; 
StringBuilder wordToShow = new StringBuilder(); 
for (int i=0; i < wordToGuess.length(); ++i) { 
    wordToShow.append("_"); 
} 

// update publicly shown string; return true if one or more matches found, 
// otherwise return false 
public boolean guessLetter(char letter) { 
    boolean result = false; 
    for (int i=0; i < wordToGuess.length(); ++i) { 
     if (wordToGuess.charAt(i) == letter) { 
      // reveal the correctly guessed character 
      wordToShow.setCharAt(i, letter); 
      result = true; 
     } 
    } 

    return result; 
} 

public String reveal() { 
    return wordToShow.toString(); 
} 
+0

Dies ist sinnvoll, aber das ist eine Menge Änderungen in meinem Programm zu tun. Gibt es eine ähnliche Möglichkeit, dies ohne Verwendung von Zeichen zu tun? Ich bleibe lieber bei Strings, aber wenn ich nicht kann, ist das in Ordnung. Schnelle, hilfreiche Antwort. :) – CodingNinja

+0

Wenn Ihr Benutzer wirklich ein Zeichen gleichzeitig eingibt, dann ist 'char' der primitive Typ, der hier am sinnvollsten zu sein scheint. Der Unterschied in meiner Herangehensweise ist, dass die Methode 'reveal()' nun auf die einfache Rückgabe einer Zeichenkette reduziert wurde. Die wahre Logik passiert jedes Mal, wenn ein Benutzer eine Vermutung trifft. Sie können frei verwenden, was immer Sie wünschen. –

+0

Aber Ihre Variable 'wordToShow' ist in diesem Fall wie meine Variable' Leerzeichen', die viele Unterstriche enthält (so viele wie die Länge des Wortes). Macht das 'wordToShow.setCharAt (i, letter);' unmöglich, wenn 'wordToShow' eine Zeichenkette ist? Das hört sich sehr dumm an, aber kann ein Zeichen mehr als 1 Zeichen enthalten wie eine Zeichenkette? – CodingNinja

0

Sie müssen berücksichtigen, was Sie tun wollen, wenn ein Wort ein Brief mehrmals enthält:

guessedSoFar = reveal(guessedSoFar, randWord, guessedLetter); 

private String reveal(String guessedSoFar, String randWord, char letter) { 

    String newString = ""; 

    for (int i = 0 ; i < randWord.length(); i++) { 
     if (randWord.charAt(i) == letter && guessedSoFar.charAt(i) == '_') 
      newString += randWord.charAt(i); 
     else 
      newString += guessedSoFar.charAt(i); 
    } 

    return newString; 
} 
0

Sie können einfach eine private Variable machen (Ich nannte mein currentWord) und stellen es entspricht blanks. Dann müssen Sie einige kleinere Änderungen an Ihrem Code vornehmen:

public class Hangman extends JFrame { 
    private String currentWord; 
    //when "blanks" gets assigned a value, make "currentWord" equal to it 
    //... 
    //... 
private void guessLetter() { 
    guessedLetter = guess.getText(); 
    if (randWord.contains(guessedLetter)){ 
     reveal(); 
    } else { 
     wrongGuesses++; 
     update(); 
    } 
} 

private void reveal() { 
    int start = randWord.indexOf(guessedLetter); 
    currentWord = currentWord.substring(0, start) + guessedLetter + currentWord.substring(start+1); 
    System.out.println(currentWord); 
    if (currentWord.equals(randWord)){ 
     System.out.println("You win!!"); 
    } 
} 

Dies wird currentWord einen Buchstaben zu einem Zeitpunkt, ändern, bis Sie aus Vermutungen laufen oder currentWord entspricht dem ursprünglichen Wort. Dies funktioniert, indem Sie jeweils einen Teilstring ändern und diesem Wert currentWord zuweisen. Dann wird dieses Wort gedruckt, mit der nächsten Schätzung geändert, gedruckt usw., bis Sie gewinnen oder verlieren.

Verwandte Themen