虽然循环没有退出

时间:2014-01-12 22:01:27

标签: java while-loop

这方面的Java新手。我正在尝试运行一个滚动两个骰子的程序,当两个骰子之间的总滚动为7或11时,程序将退出。出于某种原因,我的while语句一遍又一遍地执行,我无法弄清楚为什么。任何帮助将非常感激。代码如下。

再次,这是非常新的。不是那么专注于一种更有效的方式来实现这一点,而是关注为什么这不起作用的语义细节。

// import required packages for the program
// import all classes to be on the safe side
// will be using input/ouput and math, so those imports are needed
import java.io.*;
import java.math.*;
import java.text.*;

// Declare a class, class name Dice chosen
public class Dice
{
// need to use throws IOException because we are dealing with input and output, simple main method will not suffice
    public static void main(String[] args) throws IOException
    {

        // declare variables for the two dice, randomize each
        // die can each be rolled for # between 1-6
        double dice1 = Math.round(Math.random() * 6) + 1;
        double dice2 = Math.round(Math.random() * 6) + 1;

        // declare variable for combined roll
        double totalRoll = dice1 + dice2;

        //create loop to determine if totalRoll is a 7 or 11, if not continue rolling
        while ((totalRoll != 7.0) || (totalRoll != 11.0))
            {
            dice1 = Math.round(Math.random() * 6) + 1;
            dice2 = Math.round(Math.random() * 6) + 1;

            totalRoll = dice1 + dice2;

            System.out.println("The roll on die 1 is: " + dice1);
            System.out.println("The roll on die 2 is: " + dice2);
            System.out.println("The total of the two rolls is: " + totalRoll + "\n");

            if ((totalRoll == 7.0) || (totalRoll == 11.0)) 
            {
            System.out.println("You win!");
            }
            }


        /*
        // declare in as a BufferedReader; used to gain input from the user
        BufferedReader in;
        in = new BufferedReader(new InputStreamReader(System.in));

        //Simulate tossing of two dice
        */




    }
}

5 个答案:

答案 0 :(得分:5)

我认为您想要将OR换成AND。使用OR时,while语句将始终评估为true,因为单个数字不能同时为711(除非它是一些残酷的量子计算,但我认为它不是。)

while(totalRoll != 7.0 && totalRoll != 11.0) {
    // Continue.
}

注意 :如果您正在尝试制作量子骰子,那么有人可能会说你需要无数次掷骰子di face可以同时等同于所有数字,所以在这种情况下,你的程序工作得很漂亮......只是值得深思。

严重提示 :使用double来表示骰子上的值非常浪费。你需要的内存比你需要的多得多。如果您想优化内存使用,请使用int甚至是byte

编辑以回复评论

您将中断添加到if声明中;我在假设。嗯,你看,这是不同的。您声称该数字是否等于其中一个数字。让我为你举个例子。

处理平等时

if语句中的逻辑很好,因为,让我们说:

double totalRoll = 7.0;

if(totalRoll == 7.0 || totalRoll == 11.0)
{
    // Do something.
}

评估结果为:

if(7.0 == 7.0 || 7.0 == 11.0)
{
}

哪个成为:

if(true || false)

因为TRUE OR X == TRUE,它变为:

if(true)

同样,如果您将totalRoll设置为9.0

if(9.0 == 7.0 || 9.0 == 11.0)
{
}

哪个成了。

if(false || false)

最终评估为:

if(false)

所以我们通过演示证明,这个if statement可以处理输入。让我们试试你的while循环。

处理不平等时

double totalRoll = 7.0;

// We expect this to stop the loop..
while(totalRoll != 7.0 || totalRoll != 11.0)

评估到

while(7.0 != 7.0 || 7.0 != 11.0)

评估结果为:

while(false || true)

再次X OR TRUE == TRUE如此。

while(true)
亲爱的,亲爱的。正如您所看到的,while循环中断的唯一方法是,totalRoll的值同时为7.011.0

解决方案的工作原理

我们通过将OR替换为AND来解决此问题。

double totalRoll = 7.0;

while(7.0 != 7.0 && 7.0 != 11.0)
{
}

评估为..

while(false && true)

我们知道FALSE AND X == FALSE所以

while(false)

循环中断了。 11.0会发生同样的情况,但与其他任何数字都不会。

答案 1 :(得分:1)

您可以在System.out.print

之后添加一个中断
if ((totalRoll == 7.0) || (totalRoll == 11.0))
    {
        System.out.println("You win!");
        break;
    }

答案 2 :(得分:0)

你可能希望while语句是这样的 - 它更清楚:

   while (!(totalRoll == 7.0 || totalRoll == 11.0))

“虽然滚动等于7或11不正确......”

答案 3 :(得分:0)

Re:@Paranix“& is bitwise”......

这是SO的引用:

“&&和||运算符'短路',这意味着如果没有必要,它们不会评估右侧。&和|运算符,当用作逻辑运算符时,总是评估双方。“

我发现了 31次投票 here并在其他地方找到了类似的措辞。但也许这句话需要修改,因为& 确实“按位和”,期间

也就是说,如果两个操作数碰巧都是布尔值,则它们是整数,或者是1或0,所以按位的东西适用。

1& 1为真(等于1); 1& 0,0& 1,0& 0为假(等于0)。

下面的陈述打印0,0,0,1:

System.out.println((1&0) + "," + (0&1) + "," + (0&0) + "," + (1&1));

如果使用(1&& 0),则会出现错误,因为&&需要布尔操作数。

无论如何,修改后的骰子代码可以正常使用&或&&。

我读过&&如果右手操作数为空,则绝对需要,但我无法证明这一点。

答案 4 :(得分:-1)

比较那样的双打很成问题;由于表示双值的方式,即使totalRoll == 7.0正好是7.0,totalRoll也不会给你真实。比较双打的更好方法(如果你必须使用它们)将是这样的:

while (Math.abs(totalRoll - 7.0) > 0.0001 && Math.abs(totalRoll - 11.0) > 0.0001) { ... }

这样,保存双倍值的不准确性不会对你造成太大伤害。

编辑:由于存在downvotes,我会发布更多信息来支持我所说的内容:

此外,以下代码为我打印false

System.out.println(((7.0 / 100) * 100) == 7.0);

如果有人的信息反驳了我所说的话,那么请告诉我。