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中的循环和条件的主要内容,如果未能解决你的问题,请参考以下文章

Java中的“循环”是一种“条件语句”吗?

Java中的循环和条件

JAVA中的循环

JAVA中的循环

JAVA中的循环

第2篇 Java中的循环