这方面的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
*/
}
}
答案 0 :(得分:5)
我认为您想要将OR
换成AND
。使用OR
时,while
语句将始终评估为true,因为单个数字不能同时为7
和11
(除非它是一些残酷的量子计算,但我认为它不是。)
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.0
和11.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);
如果有人的信息反驳了我所说的话,那么请告诉我。