0

これが私のコードです:

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

public class GuessingGame
{
private int upperBound;
private int count, guess, num, pct;

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

public void setNum(int stop)
{
    upperBound = stop;
}

public void playGame()
{
    int count = 0;
    int attempt = 1;
    Scanner keyboard = new Scanner(System.in);
    //upperBound = keyboard.nextInt();
     num = (int)Math.random()*upperBound;
     guess = 0;
     out.println("Enter a number between 1 and " + upperBound);
        guess = keyboard.nextInt();
        count++;
        if(guess != num)
            attempt++;
    do{
        out.println("Enter a number between 1 and " + upperBound);
        guess = keyboard.nextInt();
        count++;
        if(guess != num)
            attempt++;
    }while(guess != num);
     pct = (count/attempt)*100;



}

public String toString()
{
    String output="";
    output = "It took you " + count + " tries to guess " + num + "\n you guessed wrong " + pct + "% of the time";
    return output;
}
}

ある時点で推測が num に等しくなければならないことはわかっていますが、コードは現在の「ゲーム」を終了することはありませんが、stop/upperBound に 5 の例を使用すると、無限にループしているようです

要求された私のランナークラスは次のとおりです。

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

public class Lab10e
{
public static void main(String args[])
{
    Scanner keyboard = new Scanner(System.in);
    char response = ' ';

    out.print("Guessing Game - how many numbers? ");

    //read in the player value
    int stop = keyboard.nextInt();

    GuessingGame game = new GuessingGame(stop);
    game.playGame();
    out.println(game);
    out.println("would you like to play again? (y/n):: ");
    String resp =  keyboard.next();
    response = resp.charAt(0);

    do {
    out.print("Guessing Game - how many numbers? ");
    stop = keyboard.nextInt();
    game.setNum(stop);
    game.playGame();
    out.println(game);
    out.println();
    out.println("would you like to play again? (y/n):: ");
    resp =  keyboard.next();
    response = resp.charAt(0);
    //



}while(response == 'y'); 

}

}
4

4 に答える 4

2

ここには 2 つの問題があります。まず、乱数は常にゼロになります。行を変更する

num = (int)Math.random()*upperBound;

num = (int)(Math.random()*upperBound);

2 番目の問題は、最初の試行で正しく推測したとしても、常に 2 回尋ねられることです。これは主に、推測コードをコピーして貼り付けたことが原因です。代わりにこれらの行をコードから削除すると、これは発生しません (doループ内の行ではありません)。

 out.println("Enter a number between 1 and " + upperBound);
    guess = keyboard.nextInt();
    count++;
    if(guess != num)
        attempt++;

さらに、ループの終了方法により、別のcountandattempt変数は必要ありません。変数がどうなるかはいつでも予測できattemptます (1 より大きいcount... 実際、プログラムでは 2 より大きいですが、それは正しい推測のパーセンテージではありません)。変数を完全に削除してattempt、代わりに

double countDouble = (double) count;
pct = (int) ((countDouble/(countDouble+1))*100.0);
于 2012-11-08T03:31:50.597 に答える
1

これを行う場合:

(int)Math.random()*upperBound;

Math.random() を にキャストしてintいます。これは、丸められる方法のために常にゼロになります。したがって、num は常に 0 になります。

于 2012-11-08T03:25:17.093 に答える
1

あなたが必要

(int)(Math.random()*upperBound)
于 2012-11-08T03:26:26.837 に答える
0

あなたのコードから、あなたは range で値out.println("Enter a number between 1 and " + upperBound);を作りたいと思っていますが、実際には range で作っています。num[1; upperBound][0, upperBound-1]

1 から N までの乱数を使用する場合は、 を使用します(int) (Math.random()*N)+1Math.random()範囲 [0; の値を返します。1) (1 なし)Math.random()*Nは常に範囲内の値を返しますdouble( Nなし[0; N)) 。int[0; N-1][1; N]1

于 2012-11-08T04:01:18.117 に答える