Почему while l oop продолжает цикл в java - PullRequest
0 голосов
/ 04 августа 2020

если я запускаю эту программу, иногда она продолжает работать после вывода «Player win» или «Player проигрывает», я могу понять, почему ..

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;

    }

}

Вот результат:

Player Roller 3 + 2 = 5

Очко 5

Ролик игрока 6 + 4 = 10

Ролик игрока 6 + 6 = 12

Ролик игрока 5 + 5 = 10

Ролик игрока 1 + 2 = 3

Ролик игрока 1 + 3 = 4

Победа игрока

Ролик игрока 4 + 6 = 10

Ролик игрока 4 + 1 = 5

УСПЕШНО СОЗДАТЬ (общее время: 0 секунд)

1 Ответ

0 голосов
/ 04 августа 2020

Как видно из предоставленных выходных данных, ваше приложение в основном работает нормально; это не «катится слишком часто»: он катится ровно так часто, как должен, а именно: пока игрок не выкинет либо 5 («точка» в этой игре), либо 7, что .. сделал; последнее, что он показывает, это рулон 4 + 1.

Фактическая «проблема» в том, что текст Player Win печатается «слишком рано».

На самом деле происходит то, что System.out и System.err - разные потоки, и нет никакой гарантии, что они синхронизируются; если вы напечатаете 'a' в System.out и сразу после 'b' в System.err, нет гарантии, что 'a' всегда будет отображаться перед 'b' - хотя эти два потока внутренне согласованы; если вы напечатаете «a» в System.out и сразу после этого «b» в System.out, вы гарантированно будете всегда печатать в этом порядке.

Таким образом, исправить довольно просто: выберите один; либо используйте только System.err, либо только System.out.

В качестве альтернативы, синхронизируйте с блокировкой в ​​любое время, когда вы печатаете, но это ... большие усилия для некоторых относительно продвинутых java.

NB: на подавляющем большинстве платформ System.out и System.err в конечном итоге синхронизируются или эффективно синхронизируются, вам понадобятся некоторые довольно конкретные c настройки, чтобы наблюдать за тем, что вы видите. Большинство людей не смогут воспроизвести это.

...