当前位置: 首页 > 知识库问答 >
问题:

为什么在java中同时循环

岳宣
2023-03-14

如果我有时运行这些程序,它会在打印“玩家赢”或“玩家输”后继续运行,我可以找到原因。。

import java.security.SecureRandom;

public class craps {

    //create secure randowm number generator for use in method rolldice
    private static final SecureRandom RANDOMNUMBERS = new SecureRandom();

    // enum type with constants that represnet the game status
    private enum Status {
        CONTINUE, WON, LOST
    }

    // constanst that represent common rolls of the dice
    private static final int SNAKE_EYES = 2;
    private static final int TREY = 3;
    private static final int SEVEN = 7;
    private static final int YO_LEVEN = 11;
    private static final int BOS_CARS = 12;

    public static void main(String[] args) {

        int myPoint = 0;
        Status gameStatus;

        int sumOfDice = rollDice();

        switch (sumOfDice) {

            case SEVEN:
            case YO_LEVEN:
                gameStatus = Status.WON;
                break;
            case SNAKE_EYES:
            case TREY:
            case BOS_CARS:
                gameStatus = Status.LOST;
                break;
            default:
                gameStatus = Status.CONTINUE;
                myPoint = sumOfDice;
                System.err.printf("Point is %d\n", myPoint);
                break;
        }
        
        while (gameStatus == Status.CONTINUE){

             sumOfDice = rollDice();
        
             if(sumOfDice == myPoint)
                   gameStatus = Status.WON;
             else 
                 if (sumOfDice == SEVEN) 
                 gameStatus = Status.LOST;                 
        }
        
        if (gameStatus == Status.WON)
             System.err.println("Player Win ");
        else 
            System.err.println("Player Loses ");

        
        

    }

    public static int rollDice() {

        int dice1 = 1 + RANDOMNUMBERS.nextInt(6);
        int dice2 = 1 + RANDOMNUMBERS.nextInt(6);

        int sum = dice1 + dice2; // sum of die values

        //display results of this roll
        System.out.printf("Player roller %d  + %d = %d\n", dice1, dice2, sum);

        return sum;

    }

}

这里的输出:

球员滚轴3 2=5

分数是5

玩家滚轮6 4=10

游戏者滚轴6=12

玩家滚轮5 5=10

球员滚轴12=3

球员滚轴1 3=4

球员获胜

球员滚轴4 6=10

球员滚轴4 1=5

构建成功(总时间:0秒)

共有1个答案

梅飞龙
2023-03-14

从提供的输出可以看出,你的应用程序基本上运行良好;它不是“滚得太频繁”:它滚得和它应该滚的一样频繁,也就是说:直到玩家滚5(本游戏的“点”)或7,这。。的确如此;最后显示的是4-1卷。

实际的“问题”是Player Win文本被“过早”打印出来。

实际上发生的是系统。退出系统。err是不同的流,不能保证这些流是同步的;如果将“a”打印到系统。退出,然后立即“b”切换到系统。err不能保证“a”总是显示在“b”之前——尽管这两个流在内部是一致的;如果将“a”打印到系统。退出,然后立即将“b”切换到系统。输出,您可以保证它们始终按该顺序打印。

因此,修复非常简单:选择一个;要么只使用System.err,要么只使用System.out

或者,在你打印的任何时候都在锁上同步,但那是...一些相对高级的java的大量努力。

注意:在绝大多数平台上,系统。退出系统。错误如果最终被同步或有效同步,你需要一些相当具体的设置来见证你所看到的。大多数人将无法复制这种情况。

 类似资料:
  • <代码>car\U gear字段在数据库中填写为“stick”(斗杆)。在图像标记后,输出更改为“自动” 为什么结果是$car\u result1-

  • 问题内容: 我对Java真的很陌生,我读到Java 非常昂贵。我只想知道什么是昂贵的,它又如何昂贵? 谢谢。 问题答案: 也许还没有你想的那么糟 它曾经是可怕的(这可能就是您读到它“非常昂贵”的原因)。这些模因可能需要很长时间才能消失 由于涉及缓存刷新和失效的规则,因此Java语言中的同步块通常比许多平台提供的关键部分功能更为昂贵,而这些平台通常使用原子的“测试并设置位”机器指令来实现。即使程序仅

  • 我试图通过将ajax请求中的for循环的值发送到php文件来检查数据库中的值,“each value in request”,然后文件返回变量“avl”,如果不是,则不可用。 问题是,我检查了一个值流,它们都必须返回才能继续我的过程,但条件不会等到for循环结束才进行检查。它在for循环启动之前检查条件,即使代码也不是那样的。例如:在for循环在第50行结束之前,它在第100行执行条件。 它总是通

  • 问题内容: 我一直在使用“ if”来测试自己的版本,并且一切似乎都正常。当然,如果使用signalAll()而不是signal(),这将导致严重崩溃,但是如果一次仅通知一个线程,这怎么会出错? 他们的代码在这里 -检查put()和take()方法;在Condition的JavaDoc顶部可以看到一个更简单,更重点的实现。 下面是我实施的相关部分。 PS我知道,通常,尤其是在这样的lib类中,应该让

  • 问题内容: 我正在用Java编写电台代码,并且正在使用一个线程来当然播放流。我在线程的run方法中有一个while循环,该循环检查名为ShouldPlay的变量是否为true,以及是否运行该变量。播放器。然后,我有一个pause()方法,将变量设置为false,并且自然希望它在变量为false时不运行播放器。我创建了一个小示例,说明如何在下面进行设置: 我想发生的事情是,当线程首次运行时,它应该打

  • } 链接:https://www.hackerrank.com/challenges/java-string-compare/problem