Java 代码永不终止
这是我的密码:Java 代码永不终止,java,loops,while-loop,do-while,Java,Loops,While Loop,Do While,这是我的密码: 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) {
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,但代码永远不会结束当前的“游戏”,但当我使用我的示例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');
}
}
执行此操作时:
(int)Math.random()*upperBound;
它将Math.random()转换为int
,因为它是如何舍入的,所以始终为零。因此num始终等于零。执行此操作时:
(int)Math.random()*upperBound;
它将Math.random()转换为int
,因为它是如何舍入的,所以始终为零。因此num始终等于零。您需要
(int)(Math.random()*upperBound)
你需要
(int)(Math.random()*upperBound)
这里有两个问题:第一,你的随机数总是零。换线
num = (int)Math.random()*upperBound;
到
你的第二个问题是,即使你第一次猜对了,它也会问你两次。这主要是因为您复制并粘贴了猜测代码。如果从代码中删除这些行,则不会发生这种情况(不是do
循环中的行):
此外,由于循环终止的方式,您不需要单独的count
和trunt
变量。您总是可以预测trunt
变量将是什么(一个大于count
…实际上,在您的程序中,它将大于两个,但这不是正确的猜测百分比)。您可以完全删除trunt
变量,然后执行以下操作
double countDouble = (double) count;
pct = (int) ((countDouble/(countDouble+1))*100.0);
这里有两个问题:第一,你的随机数总是零。换线
num = (int)Math.random()*upperBound;
到
你的第二个问题是,即使你第一次猜对了,它也会问你两次。这主要是因为您复制并粘贴了猜测代码。如果从代码中删除这些行,则不会发生这种情况(不是do
循环中的行):
此外,由于循环终止的方式,您不需要单独的count
和trunt
变量。您总是可以预测trunt
变量将是什么(一个大于count
…实际上,在您的程序中,它将大于两个,但这不是正确的猜测百分比)。您可以完全删除trunt
变量,然后执行以下操作
double countDouble = (double) count;
pct = (int) ((countDouble/(countDouble+1))*100.0);
从code
out.println(“输入一个介于1和“+上限”之间的数字)
我看到您想在范围[1;上限]
中设置num
值,但实际上是在范围[0,上限-1]
中设置的
如果要将数字从1随机分配到N,请使用
(int)(Math.random()*N)+1
。由于Math.random()
将返回范围[0;1]中的值(不带1)Math.random()*N
将始终返回范围[0;N)
中的值(不带N),但由于我们将其强制转换为int
范围将更改为[0;N-1]
,因此使其成为[1;N]
您需要将1
添加到返回值中。从您的代码输出。println(“输入一个介于1和“+上限”之间的数字);
我知道您想在范围[1;上限]
中设置num
值,但实际上是在范围[0,上限-1]
中设置的
如果要从1到N随机数,请使用
(int)(Math.random()*N)+1
。因为Math.random()
将返回范围[0;1]中的值(不带1)Math.random()*N
始终将返回范围[0;N]中的值(不带N)但由于我们将其强制转换为int
范围将更改为[0;N-1]
,因此使其成为[1;N]
您需要将1
添加到返回值中。如何启动您的程序,即main
方法?我现在添加了main
方法如何启动您的程序,即main
方法?我现在添加了main
方法我与以前的实验室有类似的情况,我使用了这个方法:int num;num=(int)(Math.random()*3);
我看到了“num=(int)Math.random()*上限在他提交的原始代码中。@LuiggiMendozamain
方法是靠近底部的代码。它是两个独立的classes@tech_geek23:我在你的代码中发现了一些其他错误。请看我下面的帖子。我在以前的实验室中也遇到过类似的情况,我使用了这个:int-num;num=(int)(Math.random()*3);
我看到了“num=(int)Math.random()*upperBound;”在他提交的原始代码中。@LuiggiMendozamain
方法是靠近底部的代码。它是两个独立的classes@tech_geek23:我在您的代码中发现了一些其他错误。请参阅下面我的帖子否,您有(int)Math.random()*上限,而不是(int)(Math.random()*上限)。括号很重要,因为您的语句只是将随机数强制转换为int(始终为0),而n乘以上限——仍然始终为0。您需要对乘法语句进行分组,以便将乘积强制转换为int,而不仅仅是其第一部分。不,您有(int)Math.random()*上限,而不是(int)(Math.random())*括号很重要,因为您的语句只是将随机数强制转换为int(始终为0)n乘以上限——仍然是0。你需要对乘法语句进行分组,使乘积被转换为int,而不仅仅是它的第一部分。我在本地测试了它,它生成的结果很好……至少当上限
为100时。好吧,现在的问题是,当我用3次尝试猜测时,有0%的时间我是错的一个数字,我知道为什么,我会在整数除法上面修正它。检查一下,我得到了:pct=(int)((doubleCount/(doubleCount+2))*100)
除了0.0%之外,它似乎什么都不算,我必须使用+2,否则它会无限循环,我在本地测试它,它生成的结果很好……至少当上限为100时。好的,现在问题是