2016-10-02 20 views
4

私はJavaへのイントロのクラスを取っていますし、私たちは絞首刑執行人のゲームを扱うプロジェクトを持っています。私はほとんどのコードを修正しましたが、解決できないようなバグがあります。基本的なハングマンゲーム(主に懸念の文字列操作)

最初に、プログラムはユーザに文字とその文字があると思う場所を入力するように促し、その後、一連のハイフンで単語を表示し、ユーザが正しい推測をすると、対応する文字ハイフンは上記の文字に置き換えられます。テスト目的のために

、言葉はnarrowにデフォルト設定されています。

私は手紙rを推測していたとスペースのために、私は、インデックス2を推測した場合、プログラムは私を与えるので:

Guess a letter: r 

Guess a space: 2 

Guess: --r--- 

を私が午前問題は、私は、インデックス3を推測するときということですスペースのために、次のrを推測しようとすると、プログラムは以前と同じ出力を私に与えます。

我々はまだそれについて話していないので、配列や文字列ビルダを使用することはできません。ここで

は私の変数です:ここでは

// default word for testing 
    String blank = "narrow"; 

    // variables to manipulate the string 
    String start = ""; 
    String end = ""; 
    String word = ""; 

    // variables for input and output 
    // input is used for the user's letter guess 
    String input; 
    // space is used for the user's index guess 
    String space = ""; 
    // guess is used at the end to display the word to the user and set equal to word after 
    // it has been manipulated 
    String guess = ""; 

は、文字列が操作されているコードです。

for (int i = 0; i < blank.length(); i++) { 
     if (i == blank.indexOf(input)) { 
      start = guess.substring(0, i); 
      end = guess.substring(i + 1); 
      word = start.concat(input).concat(end);      
     } 
    } 

私はそれがif statementに関係していると思うが、私はいくつかの他のものを試してみましたし、彼らは働いていません。どんな助けもありがとう。

ありがとうございます。

+1

問題は、文字列操作であれば、 'のchar []'、それもされている実際の単語への参照を保持できるため、なぜあなた自身のラッパークラスを作成していない。したがって、すべてのために私はどうなると思います推測される。不変ではないので、それを操作する方が簡単です。あなたは文字を入力することができます。 –

+0

私たちがそれをすることができるかどうかは分かりませんが、とにかく感謝します – Equinoxinator

答えて

2

あなたのコードに問題が毎回blank.indexOf(入力)が2毎回を返すことである(のindexOfが2である「R」の最初のoccuranceを返す)

あなたが条件を変更することができますユーザが推測した空間の文字が、ユーザが推測した文字を含むかどうかをチェックする。 以下のようにしてください:

  1. 印刷するパターンを維持します。このための変数を作ります。
  2. ユーザーが正しく推測するたびにパターンを更新します。

注:以下のコードの推測では、私は言葉のために、最初は「------」に設定されているかについて話しています変数である「狭い」

// check if the space has the letter you guessed 
    if (blank.charAt(space) == input.charAt(0)) { 
     // if it has just update the pattern string to also contain the new letter 
     guess = guess.substring(0, space) + input + guess.substring (space + 1) 

あなただけ印刷することができますパターン文字列を返します(メソッドの場合)。

+0

あなたのやり方はうまくいきました。ありがとうございました – Equinoxinator

+1

助けて嬉しいです! :) – Moonstruck

1

私はこのようにそれを記述します。

//set up variables 
Scanner keyboard = new Scanner(System.in); 
String word = "narrow"; 
String display = ""; 
for (int i = 0; i < word.length(); i++) { 
    display = display + "-"; 
} 

//loop until the word is guessed 
while (display.contains("-")) { 

    //show the user flow, take input 
    System.out.println("Guess: " + display); 
    System.out.print("Guess a letter: "); 
    String letter = keyboard.nextLine(); 
    System.out.print("Guess a space: "); 
    String spaceStr = keyboard.nextLine(); 
    int space = Integer.parseInt(spaceStr); 

    //check if the guess is right 
    if (letter.equals(word.charAt(space) + "")) { 

    //modify the string shown to the user 
    String temp = display.substring(space + 1); 
    display = display.substring(0, space); 
    display = display + letter + temp; 
    } 
} 

キーは本当の言葉を保持しているユーザーと1に示されている一つの変数を持つことです。彼らが正しい推測をするとき、ユーザーに表示される文字列を変更することができます。

1

私はそのinput文字の最初のオカレンスだけインデックスblank.indexOf(input)リターンを考えます。だから、thisindexOf(int ch, int fromIndex)を使用する必要があります。あなたの場合、いくつかのint型の変数に入力文字が最後に現れるのストアインデックスで 、その後、fromIndexとしてそれを使用。

int lastOccurrence = 0; 
for (int i = 0; i < blank.length(); i++) { 
    if (i == blank.indexOf(input, lastOccurrence)) { 
     lastOccurrence = i; 
     start = guess.substring(0, i); 
     end = guess.substring(i + 1); 
     word = start.concat(input).concat(end);      
    } 
} 
1

indexOf(String str)は、指定された部分文字列のFIRST OCCURENCEのこの文字列内のインデックスを返します。このより多くhere

私が提案する最良の方法は、ユーザーが正しいと判断した場合にのみ出力を変更することです。

if(blank.charAt(space) == input.charAt(0)) 
{ 
    start = guess.substring(0, space); 
    end = guess.substring(space + 1); 
    word = start.concat(input).concat(end); 
}