2017-05-18 8 views
0

私は一度に1文字を推測する古典的なハングマンプログラム(GUIは問題ありません)を作ろうとしています。問題は、ユーザーが手紙を推測するときには、「_」の場所を推測された文字(単語内にある場合)に置き換えますが、次の文字が推測されるとき、最後の推測について忘れてしまいます。場所は「_」に戻ります。それは不明だ場合は申し訳ありませんが、ここでの例では、私はコードが仕事をしたいどのように部分文字列の値を変更するにはどうすればよいですか?

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

です:

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

は、どのように私はこれを達成することができますか?タイガーは単なる例であり、単語は配列からランダムに引き出されていることに注意してください。私はこれを行う唯一の方法は、ブランクの部分文字列の値を変更することですが、私はこれを行う方法がわかりません。今のところ、ユーザは、GUIウィンドウ(人間自身がいる)から手紙を推測し、ボタンを押して回答を提出する。今のところ出力はコンソールに表示されます。

は、ここでプログラムの面倒一部です:これにアプローチする

// 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

すでに 'guessedLetter'sが空白の中に保存されていますか? – d9ngle

+0

あなたの質問の絞り込みを試みるべきです。私は完全な解決策には少なくとも50-100行のJavaコードが必要だと思いますが、これは単一の答えには広すぎます。 –

+0

@ d9ngleかなり。 '空白 'の部分文字列が、' guessedLetter'の値を保持していればそれが正しいと思います。投稿の私の例を見てください:) – CodingNinja

答えて

5

一つの方法は、文字のそれぞれの推測の間に更新されるStringBuilderオブジェクトを維持することです。

あなたは言葉が文字が含まれている場合、複数回何をしたいのかを考慮する必要がある
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

これは理にかなっていますが、これは私のプログラムではやり方が変わっています。 charを使用しないでこれを行う同様の方法はありますか?私はむしろStringsに固執しますが、もしそれができないのであればOKです。クイック、有益な答え。 :) – CodingNinja

+0

あなたのユーザーが本当に一度に1文字を入力している場合、 'char'はここで使うのが最も理にかなっていると思われるプリミティブ型です。私のアプローチの違いは、 'reveal()'メソッドが基本的に文字列を返すようになったことです。実際のロジックは、ユーザーが推測するたびに発生します。あなたは何でも好きなものを自由に使うことができます。 –

+0

しかし、あなたの変数 'wordToShow'は、この場合は私の変数' blanks'と似ています。これは多くのアンダースコア(単語の長さ)を保持しています。 'wordToShow'が文字列の場合、' wordToShow.setCharAt(i、letter); 'は不可能ですか?これは非常にばかげて聞こえるが、文字列のように1文字以上の文字を保持できるか? – CodingNinja

0

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

あなたは単にプライベート変数(私は私のcurrentWord命名)、およびセットを作ることができますそれはblanksに等しい。次に、あなたのコードにいくつかのマイナーな変更を加える必要があります。

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!!"); 
    } 
} 

あなたが推測を使い果たし、またはcurrentWordは、元の単語と等しくなるまでこれは、一度にcurrentWord 1文字を変更します。これは、一度に1つの部分文字列を変更し、currentWordをその値に代入することによって機能します。その後、その言葉が印刷され、次の推測で変更され、印刷されます。

関連する問題