2016-09-09 6 views
-1

私はユーザーがトップナンバーを入力し、コンピューターが1からユーザーが入力した番号までの数字を選択する推測ゲームを作っています。正しい数字が推測された後は、それがdoStringの中にある間にdoを残してtoStringに移動することになっていますが、そうではありません。ここでプログラムがループを終了していないと思ってもそれがわかっている

は一例です:

Guessing Game - How many numbers? 10 
Enter a number between 1 and 10: 1 
Try again. 

Enter a number between 1 and 10: 2 
Try again. 

Enter a number between 1 and 10: 3 
Try again. 

Enter a number between 1 and 10: 4 
Enter a number between 1 and 10: 

あなたはそれが「もう一度試してみてください」と言うが、まだ別の推測を求めていないことがわかります。

は、ここに私のプログラム

import java.util.Scanner; 
import static java.lang.System.*; 

public class GuessingGame 
{ 
    public int upperBound; 
    int guesscount = 0; 

    public GuessingGame(int stop) 
    { 
     upperBound = stop; 
    } 

    public int playGame() 
    { 
     boolean guesscorrectly = false; 
     Scanner kb = new Scanner(System.in); 
     int correctNum = (int) ((Math.random()*upperBound) +1); 
     do{ 
      System.out.print("Enter a number between 1 and " + upperBound + ": "); 
      int guess = kb.nextInt(); 
      if(guess==correctNum){ 
       guesscount++; 
       guesscorrectly = true; 
      } 
      else{ 
       guesscount++; 
       System.out.println("Try again.\n"); 
      } 
     }while(guesscorrectly!=true); 
     return correctNum; 
    } 

    public String toString() 
    { 
     return "You correctly guessed " + playGame() + "! It took you " + guesscount + " guesses."; 
    } 
} 

され、その後、ここでの主な

import java.util.Scanner; 
import static java.lang.System.*; 

public class GuessRunner 
{ 
    public static void main(String args[]) 
    { 
     Scanner kb = new Scanner(System.in); 
     System.out.print("Guessing Game - How many numbers? "); 
     int upperBound = kb.nextInt(); 
     GuessingGame test = new GuessingGame(upperBound); 
     test.playGame(); 
     System.out.println(test); 
    } 
} 
+0

あなたのtoStringメソッドはどこから呼び出されますか? – user2677821

+1

@ user2677821「System.out.println(テスト)」に暗黙のうちに呼び出されています – azurefrog

+0

@ user2677821「System.out.println(テスト)」と言ったときに – Grant

答えて

7

はあなたがあなたのtoString()方法でplayGame()を呼び出すことです。あなたはそれをしてはいけませんし、ゲームを始めるべきではありません。

+0

私にそれを打ちなさい。ええと文字列は、playGame()の2番目の反復まで印刷されていません。 – bpgeck

+0

ああ、私はそれがちょうどメソッドが返されたものを印刷する印象を受けていた。私は完全に助けに感謝しますが、返されたものをどのように印刷することができるか知っていますか? – Grant

+0

@Grant Javaは自動的に戻り値を記憶しません。それをあなた自身の変数に割り当てる必要があります。 –

0

コードでplayGame()を実行するたびにplayGame()メソッドが呼び出されます。これは、メソッドがtoString()の内部で実行されることを意味します。あなたはこれを解決する3つの方法があります。

  1. main()test.playGame()を呼び出す行を削除します。 System.out.println()ステートメントをtoString()からmain()に移動し、playGame()test.playGame()に変更します。

  2. playGame()の戻り値を変数に代入して取得します。その後、toString()を上書きするのではなく、その変数の値をmain()に印刷することができます。

  3. playGame()から値を返す代わりに、値を格納するメンバーフィールドを作成できます。次にtoString()は、playGame()を呼び出すのではなく、メンバーフィールドの値を使用します。

+0

つまり、GuessingGameのインスタンス変数としてcorrectNumを追加し、playGameに返すのではなく、toStringの変数を参照します。 –

+0

@PerryMonschauまた、 'main()'のローカル変数に戻り値を代入します。 –

+0

@ Code-Apprenticeそのようにすることはできますが、自己完結型のオブジェクトは良い方法です。 Mainのコードはそのままではきれいです。 –

関連する問題