Java中的循环和条件
Posted
技术标签:
【中文标题】Java中的循环和条件【英文标题】:Loops and Conditionals in Java 【发布时间】:2015-11-14 21:56:45 【问题描述】:编辑。字符串比较部分的问题已经解决了,但是当2个骰子中只有一个1时,代码仍然不会下一个玩家,只有当两个骰子都是1时才会下一个玩家。
这是目前为止的代码,第一堂课几乎来自教科书,第二堂课的主要方法是我所做的。
该程序正在尝试创建一个名为 pig 的骰子游戏。如果有兴趣,简单的规则在代码的底部,但主要的问题。
我遇到的是它没有正确循环,当我没有将y
放入扫描仪以再次发出信号滚动时,它就像我输入y
一样继续,而我没有。此外,if
语句也不能正常工作,因为当玩家用其中一个骰子掷出1
时,它不会再投给下一个玩家。
抱歉,如果我没有正确解释问题。我也不想使用更多的方法或类。我认为有比我正在做的方式更快的方法来完成这一点,但如果我想在我的代码中使用额外的方法,那是为了以后。我在计算点数方面也有问题,因为有时它不会适当地改变它们,但一旦其余的工作正常,我就能弄清楚。
这是第一段代码。这段代码对问题来说并不是很重要,但是如果你想知道我在main
中调用了哪些方法,你可以看看这些:
import java.util.Random;
public class PairOfDice
private final int MAX = 6;
private int faceValue;
private int faceValue1;
Random generator0 = new Random();
Random generator1 = new Random();
public PairOfDice()
faceValue = 1;
faceValue1 = 1;
public int getFaceValue()
return faceValue;
public void setFaceValue(int faceValue)
this.faceValue = faceValue;
public int getFaceValue1()
return faceValue1;
public void setFaceValue1(int faceValue1)
this.faceValue1 = faceValue1;
public int rollOne()
faceValue = generator0.nextInt(MAX) + 1;
return faceValue;
public int rollTwo()
faceValue1 = generator1.nextInt(MAX) + 1;
return faceValue1;
public int sumOfRoll()
return faceValue + faceValue1;
@Override
public String toString()
return "First roll of the die: \t" + rollOne()
+ "\nSecond roll of the die: " + rollTwo()
+ "\nThe sum of both rolls: \t" + sumOfRoll();
下一段代码是我自己的。我已经更新了代码中的一些内容,现在在比较字符串时使用 .equals,并且我更改了 while 条件并稍微简化了 if 语句。
public class NewClass
public static void main(String[] args)
PairOfDice player1 = new PairOfDice();
PairOfDice player2 = new PairOfDice();
Scanner scan = new Scanner(System.in);
int p1 = 33, p2 = 0, turnp1 = 0, turnp2 = 0, signal = 1;
while (p1 <= 100 || p2 >= 100)
int newp1total = p1;
turnp1 = 0;
while (turnp1 <= 20 && signal == 1)
System.out.println("Player 1s Turn!");
int die1 = player1.rollOne();
int die2 = player1.rollTwo();
int sumofdice = player1.sumOfRoll();
System.out.println("Player 1: First Die: " + die1 + " Second Die:" + die2 + " Sum of Roll: " + sumofdice);
if (sumofdice == 2)
p1 = 0;
turnp1 = 0;
signal = -1;
System.out.println("Player rolled a two 1s. All players points are forfeited. Next Players turn.");
System.out.println("Points this turn:" + turnp1);
System.out.println("Points this game: " + p1);
System.out.println();
else if (die1 == 1 || die2 == 1)
turnp1 = 0;
signal = -1;
p1 = newp1total;
System.out.println("Player rolled a 1. All points on this round are forfeited. Next Players turn.");
System.out.println("Points this turn:" + turnp1);
System.out.println("Points this game: " + p1);
System.out.println();
else
turnp1 += sumofdice;
p1 += sumofdice;
System.out.println("Points this turn:" + turnp1);
System.out.println("Points this game: " + p1);
System.out.println();
signal = 1;
signal = 1;
String yesno = "y";
int newp2total = p2;
while (yesno.toLowerCase().equals("y") && signal == 1)
System.out.println("Player 2s Turn!");
int die1 = player2.rollOne();
int die2 = player2.rollTwo();
int sumofdice = player2.sumOfRoll();
System.out.println("Player 2: First Die: " + die1 + " Second Die:" + die2 + " Sum of Roll: " + sumofdice);
if (sumofdice == 2)
p2 = 0;
turnp2 = 0;
signal = -1;
System.out.println("Player rolled a two 1s. All players points are forfeited. Next Players turn.");
System.out.println("Points this turn:" + turnp2);
System.out.println("Points this game: " + p2);
System.out.println();
else if (die1 == 1 || die2 == 1)
signal = -1;
turnp2 = 0;
p2 = newp2total;
System.out.println("Player rolled a 1. All points on this round are forfeited. Next Players turn.");
System.out.println("Points this turn:" + turnp2);
System.out.println("Points this game: " + p2);
System.out.println();
else
turnp2 += sumofdice;
p2 += sumofdice;
System.out.println("Points this turn:" + turnp2);
System.out.println("Points this game: " + p2);
System.out.println();
System.out.println("Try your luck? Y/N");
yesno = scan.next();
System.out.println();
signal = 1;
【问题讨论】:
How do I compare strings in Java?的可能重复 您正在使用==
来检查字符串是否为"y"
。大胖子不行。使用.equals()
。
过多的getter和setter有什么意义,为什么不把它返回给一个特定的变量,在调用它之后。阅读:javaworld.com/article/2073723/core-java/…
@Rich 有可能(基于 OP 如何编写“下一段代码是我自己的”)这些 getter/setter 作为分配的一部分给出。
第一堂课我没写,直接从课本上写的
【参考方案1】:
首先,这是一个重要的概念,比较字符串时总是使用 .equals,而不是 ==。例如
yesno.toLowerCase() == "y" && signal == 1
应该是
yesno.toLowerCase().equals("y") && signal.equals 1
这是因为 y 是一个字符串。如果 y 是 int y,那么您将使用 ==。如果您在比较 y 并且不断更改值,您将使用 =。下一件事;我知道使用 getter 和 setter 可能是您教科书中作业的一部分,但除非是这样;不要使用它们。
阅读此article。
这使得代码很难遵循。在你的代码中做得很好,我喜欢你尊重 java 代码约定!
此外,请确保对字符串使用 .equals,对整数使用 ==。如果您正在比较整数,我相信您是 int 变量,您需要使用 ==。另外,我认为您可能对 and or 概念感到困惑。如果您有一个 if 语句并且正在比较事物并且需要两个语句都为真,请使用“&&”如果您只需要一个语句为真,请使用 || (这个键是回车上面带shift的键)
【讨论】:
我已经更改了代码中的字符串比较,但是有什么理由使用 .equals 来检查 int 变量信号? 好问题,请确保使用 .equals 表示字符串,使用 == 表示整数。如果您要比较 integers 其中,我相信您是针对 int 变量的,您需要使用 ==。另外,我认为您可能对 and or 概念感到困惑。如果您有一个 if 语句并且正在比较事物并且需要两个语句都为真,请使用“&&”如果您只需要一个语句为真,请使用 || (这个键是回车上面的键,带一个shift) 信号是一个整数而不是一个字符串来使用等于 会 ||还是 ^ 在第一个 while 循环中更可取?据我了解 ^ 是一个排他性的,或者,这不是首选,因为我只希望一个超过 100 岁,因为那将是赢家。或者在这种情况下,这不是真的有必要,因为只有一个人会先达到 100? 我个人从来没有用过^,我一直用||。老实说,最好的检查方法是尝试。先用 || 运行程序,然后用 ^ 运行程序,看看哪个有效。如果 ||功能不正常,请告诉我,我很乐意为您提供帮助!【参考方案2】:您正在使用 ==
比较字符串,这会导致比较引用相等性:
替换
while (yesno.toLowerCase() == "y" && signal == 1)
与
while (yesno.toLowerCase().equals("y") && signal == 1)
或
while (yesno.equalsIgnoreCase("y") && signal == 1)
==
与equals()
:
==
测试引用相等性(即它们是否是相同的对象,即引用字符串池中的相同字符串)。
但是,.equals()
检查值是否相等(无论它们的内容实际上是否相同)。
但要小心null
字符串。 ==
可以很好地处理这些null
字符串,但是从null
字符串调用.equals()
会导致异常,因为该方法是使用null
对象调用的。
更多信息可以参考String Pools
替换语句:
while (p1 <= 100 ^ p2 >= 100)
与
while (p1 <= 100 || p2 >= 100)
考虑:
int p1=1;
int p2=2;
if( p1==1 ^ p2==2) // False here since it is TRUE^TRUE which is FALSE
System.out.println("Same");
if( p1==1 || p2==3) // TRUE if either one is TRUE
System.out.println("Same Again");
这只是打印
还是一样
这是因为^
是按位运算符XOR
,当且仅当两个操作数具有相同的真值时才为假。
用等效替换两个else if
else if ( die2 == 1 || die1 == 1 )
【讨论】:
谢谢,我已经实现了这些更改。并且运行得更好。.toLowerCase().equals
更易读为equalsIgnoreCase
。
使用 || 的结果有何不同?与while循环中的^相比?以上是关于Java中的循环和条件的主要内容,如果未能解决你的问题,请参考以下文章