【问题标题】:code never terminating代码永不终止
【发布时间】:2012-11-08 03:19:43
【问题描述】:

这是我的代码:

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;
}
}

我知道它必须在某些时候guess 必须等于 num,但代码永远不会结束当前的“游戏”,但是当我使用我的示例 5 作为 stop/upperBound 时,它似乎是无限循环

这是我要求的跑步者课程:

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'); 

}

}

【问题讨论】:

  • 如何启动程序,即main 方法?
  • 我现在已经添加了我的main 方法

标签: java loops while-loop do-while


【解决方案1】:

您有两个问题:首先,您的随机数将始终为零。换行

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

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

你的第二个问题是,即使你第一次猜对了,它总是会问你两次。这主要源于您复制并粘贴了您的猜测代码。如果您改为从代码中删除这些行,则不会发生这种情况(不是 do 循环中的那些):

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

此外,由于循环终止的方式,您不需要单独的 countattempt 变量。您总是可以预测attempt 变量将是什么(比count 大一...嗯,实际上,在您的程序中,它会大二,但这不是正确的猜测百分比)。您可以完全删除 attempt 变量,而是这样做

double countDouble = (double) count;
pct = (int) ((countDouble/(countDouble+1))*100.0);

【讨论】:

  • 我在本地对其进行了测试,结果很好……至少在upperBound 为 100 时。pastebin.com/hhEbPC4S
  • 好的,现在的问题是说我错了 0% 的时候我花了 3 次尝试猜测一个数字
  • 哦,我知道这是为什么,我会在上面修复它 - 整数除法。看看
  • 我得到了这个:pct = (int) ((doubleCount/(doubleCount+2))*100); 它似乎除了 0.0% 之外没有计算任何东西
  • 我必须使用 + 2 否则它会无限循环
【解决方案2】:

当你这样做时:

(int)Math.random()*upperBound;

它将 Math.random() 转换为 int,由于它是四舍五入的,所以它总是为零。因此 num 将始终等于 0。

【讨论】:

  • 我在以前的实验室遇到过类似的情况,我使用了这个:int num; num = (int) (Math.random()*3);
  • 我看到“num = (int)Math.random()*upperBound;”在他提交的原始代码中。
  • @LuiggiMendoza main 方法是更接近底部的代码。这是 2 个独立的类
  • @tech_geek23:我在您的代码中发现了一些其他错误。请看我下面的帖子
【解决方案3】:

你需要

(int)(Math.random()*upperBound)

【讨论】:

  • 不,你有 (int)Math.random()*upperBound,而不是 (int) ( Math.random()*upperBound )乙>。括号很重要,因为您的语句只是将随机数转换为 int(始终为 0),并且 n 乘以 upperBound——仍然始终为 0。您需要对乘法语句进行分组,以便将乘积转换为 int,而不仅仅是第一部分。
【解决方案4】:

从你的代码out.println("Enter a number between 1 and " + upperBound); 我看到你想在[1; upperBound] 范围内设置num 的值,但实际上你在[0, upperBound-1] 范围内设置了它。

如果您想从 1 到 N 随机数,请使用 (int) (Math.random()*N)+1。由于Math.random() 将返回范围 [0; 1)(没有 1)Math.random()*N 总是会在[0; N) 范围内返回 double 值(没有 N),但是由于我们将其转换为 int,因此范围将更改为 [0; N-1],所以要使其成为 [1; N] 你需要在返回值中添加1

【讨论】:

    猜你喜欢
    • 2015-01-09
    • 2021-06-18
    • 1970-01-01
    • 1970-01-01
    • 2014-05-13
    • 2021-10-08
    • 2014-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多