【问题标题】:Different methods of printing returning different values for the same variables?打印返回相同变量的不同值的不同方法?
【发布时间】:2019-01-04 04:42:30
【问题描述】:

我编写了一个简单的程序来模拟掷骰子游戏,一切似乎都运行良好,除了我注意到我的“记分板”会根据我用来打印它的方法返回不同的值。

使用 print 语句打印“wins”变量会返回正确的结果 但是通过另一个格式化字符串“status”打印“wins”变量会返回较低的值。我知道我在这里遗漏了一些东西,因为我已经很久没有编程了,但我很困惑这怎么会发生。非常感谢任何反馈。

public class RandomSumGame {

    public static void main(String[] args) {
        // TODO Auto-generated method stub\
        RandomSumGame test = new RandomSumGame();
        test.play();
       }


    boolean start;
    int d1;
    int d2;
    int sum;
    int valuePoint;
    int wins;
    int loss;
    String status;

    public void play(int d1, int d2) 
    {
        status= String.format("printing through variable - wins : %d | loss : %d \n", wins, loss );

        if (sum == 11 || sum == 7) 
        {
            System.out.println("Natural - You Win!");
            wins = wins + 1;
        }

    else if (sum == 2 || sum == 3 || sum == 12) {
        System.out.println("Craps! - You lose!");
        loss = loss + 1;

    }

    else {
        valuePoint = sum;

        System.out.printf("You set the value point of %d = %d + %d \n", valuePoint, d1, d2);
        while (true) {
            rollDice();
            if (sum == valuePoint) {
                System.out.println("YOU WIN!");
                wins = wins + 1;

                break;
            }

            else if (sum == 7) {
                System.out.println("YOU LOSE!");
                loss = loss + 1;

                break;

            }

            else {
                System.out.println("ROLLING DICE AGAIN!");
                continue;
            }

        }
    }

    System.out.printf("Straight up printing - wins : %d | loss : %d \n", wins, loss );
    System.out.println(status);

}

public void play() {
    int round = 1;
    start = true;

    while (start == true){
        System.out.println("Round : " + round);
        round +=1;

        rollDice();

        play(d1, d2);
        //System.out.println(status);
        if (round >3) {
            start = false;
        }
    }


}

public void rollDice() {
    d1 = (int) (Math.random() * 6 + 1);
    d2 = (int) (Math.random() * 6 + 1);
    sum = d1 + d2;
    System.out.printf("YOU ROLL THE DICE! - sum is: %d , Dice 1: %d , Dice 2: %d\n", sum, d1, d2);

}

}

这是控制台中的示例输出,您可以看到它们返回不同的结果。

回合:1

你掷骰子! - 总和为:7,骰子 1:3,骰子 2:4

自然 - 你赢了!

直接打印 - 获胜:1 |损失:0

通过变量打印 - 获胜:0 |损失:0

回合:2

你掷骰子! - 总和是:11,骰子 1:5,骰子 2:6

自然 - 你赢了!

直接打印 - 获胜:2 |损失:0

通过变量打印 - 获胜:1 |损失:0

回合:3

你掷骰子! - 总和是:10,骰子 1:4,骰子 2:6

你设置的值点为 10 = 4 + 6

你掷骰子! - 总和是:6,骰子 1:1,骰子 2:5

再次掷骰子!

你掷骰子! - 总和是: 8 ,骰子 1:6 ,骰子 2:2

再次掷骰子!

你掷骰子! - 总和为:4,骰子 1:2,骰子 2:2

再次掷骰子!

你掷骰子! - 总和是:10,骰子 1:6,骰子 2:4

你赢了!

直接打印 - 获胜 : 3 |损失:0

通过变量打印 - 获胜:2 |损失:0

【问题讨论】:

    标签: java


    【解决方案1】:

    字符串在 Java 中是不可变的。一旦你创建了一个字符串,它的值就永远不能改变。

    因此,您在此处创建 status 字符串,其值为 winsloss

    status = String.format("printing through variable - wins : %d | loss : %d \n", 
            wins, loss );
    

    然后您更改wins 值。现在,您不能指望status 字符串 反映winsloss 的当前值。

    您必须使用最新值创建一个新字符串。

    【讨论】:

      【解决方案2】:

      在打印之前将此行移动到函数的末尾。 status= String.format("printing through variable - wins : %d | loss : %d \n", wins, loss ); 您正在创建具有预处理值的赢、输值的字符串。

      【讨论】:

        【解决方案3】:

        您在掷骰子之前将字符串值分配给status 变量。那么在status 字符串中将不会更新输赢次数。 为了纠正在System.out.println(status);行之前移动status= String.format("printing through variable - wins : %d | loss : %d \n", wins, loss );,如下所示

        【讨论】:

          猜你喜欢
          • 2020-01-29
          • 1970-01-01
          • 2019-06-09
          • 1970-01-01
          • 2018-10-06
          • 1970-01-01
          • 1970-01-01
          • 2013-10-08
          • 1970-01-01
          相关资源
          最近更新 更多