Как отобразить два кубика

Я работаю над кодированием программы для броска костей. Я очень новичок в java, так как я хожу в школу. Я использую несколько классов в разных пакетах для этой программы, и я пытаюсь понять, что в одном классе для моего пакета pairOfDice я создал объекты в классе pairOfDice, die1 и die2. Теперь у меня есть еще один пакет rollDice, и моя цель — использовать класс pairOfDice для броска двух кубиков и отображения бросков. с чем я борюсь, так это с тем, как именно это сделать. Когда я бросаю кубик, мои результаты отображаются так, как будто я бросаю только один кубик. Я внес изменения, чтобы отображать два кубика при каждом броске, хотя мне кажется, что я делаю это не более искусным способом.

package die;

import java.util.Scanner;

/**
 *
 * @author <a href= "mailto:[email protected]" >Aaron Davis</a>
 */
public class RollDice
{
    public static void main(String[] args)
    {


        Scanner scan = new Scanner(System.in);

        PairOfDice dice = new PairOfDice();

        // get amount of rolls from user
        System.out.print("How many rolls do you want? ");

        int numRolls = scan.nextInt();



        int diceOne, diceTwo;
        int boxCar, snakeEyes;
        int j = 0, k = 0;

        // rolls the dice the requested amount of times
        for (int i = 0; i < numRolls; i++)
        {
            // first die to roll
            diceOne = dice.roll();

            // second die to roll
            diceTwo = dice.roll();

            // display rolled dice
            System.out.println(diceOne + " " + diceTwo + "\n");

            // store and display pairs of 1 rolls
            if (diceOne == 1 && diceTwo == 1)
            {
                snakeEyes = ++j;

                System.out.println("\nThe number of snake eyes you have is: " 
                    + snakeEyes + "\n");
            }


            // store and display pairs of 6 rolls
            if (diceOne == 6 && diceTwo == 6)
            {
                boxCar = ++k;

                System.out.println("\nThe number of box cars you have is: " 
                    + boxCar + "\n");
            }



        }




    }    
}


******************************************************************************
/*
 the integers diceOne and diceTwo are my workarounds, my other package contains

public class PairOfDice extends Die
{
    Die die1, die2;

    public PairOfDice()
    {
        die1 = new Die();
        die2 = new Die();     
    }

    public PairOfDice(int face)
    {
        die1 = new Die(face);
        die2 = new Die(face);
    }
}

*/
******************************************************************************

// i am un-clear how to make "PairOfDice dice = new PairOfDice();" come out as two die

Что делает метод roll, можете ли вы добавить реализацию? С текущим кодом неясно, зачем вам вообще нужен PairOfDice, вы можете бросать каждый кубик по отдельности, так как вы все равно вызываете roll дважды.

Igor Nikolaev 03.02.2019 08:57

Мой метод броска показывает номинал кости из значений от 1 до 6 с помощью генератора случайных чисел. пара игральных костей является частью моих рекомендаций по заданию для класса. цель состояла в том, чтобы создать пару игральных костей как один объект, я просто не уверен, как бросить кости и отобразить два значения - одно значение на кубик...

chemeketaStudent 03.02.2019 09:03
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
255
1

Ответы 1

Класс PairOfDice не представляет вашу модель, которая представляет собой «пару игральных костей». Если у вас есть пара игральных костей, когда вы их бросаете, вы получаете два разных числа, таким образом, либо:

  1. Вас интересуют оба значения по отдельности, поэтому метод roll должен возвращать два значения. Например, вы можете использовать bean-компонент RollResult, содержащий два значения.
  2. Вас НЕ интересуют оба значения, а только сумма. Таким образом, метод roll может возвращать только целое число от 2 до 12, и вы можете размышлять о броске костей на основе их суммы: в вашем случае это всегда возможно, потому что вы получаете сумму 2 тогда и только тогда, когда ваши кости 1, 1; аналогично, если вы получите сумму 12 тогда и только тогда, когда ваши кости равны 6, 6. Например, это не сработает, если вы проверите условие «кости 1 = 3, кости 2 = 4», поскольку существует множество комбинаций бросков, возвращающих 3 + 4 = 7.

Надеюсь это поможет.

Основываясь на комментариях, мы должны перейти к первому решению. Вот пример, в котором реализованы неизменяемые объекты домена и функция домена roll, которые возвращают результат действия roll против игральной кости. Здесь в примере я показываю возможности наличия нескольких типов игральных костей.

import java.util.*;
import java.util.stream.Collectors;

public class RollingDices {
    private static final Random RND = new Random();
    private static interface Dice {
        public int roll();
    }
    private static class UniformDice implements Dice {
        public int roll() {
            return RND.nextInt(6) + 1;
        }
    }
    private static class TrickyDice implements Dice {
        private final int value;
        public TrickyDice(int value) {
            this.value = value;
        }
        public int roll() {
            return value;
        }
    }
    private static class ProbabilityTableDice implements Dice {
        private final Double[] probabilities;
        public ProbabilityTableDice(Double ... probabilities) {
            if (Arrays.stream(probabilities).mapToDouble(Double::doubleValue).sum() != 1.0) {
                throw new RuntimeException();
            }
            this.probabilities = probabilities;
        }

        public int roll() {
            final double randomValue = RND.nextDouble();
            double curValue = 0.0;
            for (int i = 0; i < this.probabilities.length; i++) {
                curValue += this.probabilities[i];
                if (curValue >= randomValue) {
                    return i + 1;
                }
            }
            throw new RuntimeException();
        }
    }
    private static class CollectionOfDices {
        private final Dice[] dices;

        public CollectionOfDices(Dice ... dices) {
            this.dices = dices;
        }

        public List<Integer> roll() {
            return Arrays.stream(dices).map(Dice::roll).collect(Collectors.toList());
        }
    }
    private static class DicesFactory {
        private static final DicesFactory INSTANCE = new DicesFactory();

        public static DicesFactory instance() {
            return INSTANCE;
        }

        private DicesFactory() {}

        private final Dice uniformDice = new UniformDice();
        public Dice createUniformDice() {
            return this.uniformDice;
        }
        public Dice createTrickyDice(int fixedValue) {
            return new TrickyDice(fixedValue);
        }
        public Dice createProbabilityTableDice(Double ... probabilities) {
            return new ProbabilityTableDice(probabilities);
        }
    }

    public static void main(String ... args) {
        final Scanner scan = new Scanner(System.in);

        final CollectionOfDices dice = new CollectionOfDices(
                DicesFactory.instance().createUniformDice(),
                DicesFactory.instance().createProbabilityTableDice(
                        0.15, 0.2, 0.3, 0.1, 0.25
                )
        );

        // get amount of rolls from user
        System.out.print("How many rolls do you want? ");

        int numRolls = scan.nextInt();



        int diceOne, diceTwo;
        int boxCar, snakeEyes;
        int j = 0, k = 0;

        // rolls the dice the requested amount of times
        for (int i = 0; i < numRolls; i++)
        {
            final List<Integer> rolls = dice.roll();
            // first die to roll
            diceOne = rolls.get(0);

            // second die to roll
            diceTwo = rolls.get(1);

            // display rolled dice
            System.out.println(diceOne + " " + diceTwo + "\n");

            // store and display pairs of 1 rolls
            if (diceOne == 1 && diceTwo == 1)
            {
                snakeEyes = ++j;

                System.out.println("\nThe number of snake eyes you have is: "
                        + snakeEyes + "\n");
            }


            // store and display pairs of 6 rolls
            if (diceOne == 6 && diceTwo == 6)
            {
                boxCar = ++k;

                System.out.println("\nThe number of box cars you have is: "
                        + boxCar + "\n");
            }

        }

    }
}

Такой вид помогает. Таким образом, интересуясь обоими значениями по отдельности, использование метода roll с методом pairOfDice с двумя созданными экземплярами игральных костей не будет иметь никаких шансов получить два отдельных значения?

chemeketaStudent 03.02.2019 09:44

Я думаю, что ваш метод roll должен возвращать экземпляр PairOfDice — ведь именно поэтому он так и называется.

Igor Nikolaev 03.02.2019 09:51

Может быть, было бы лучше вернуть результат прокатки. По домену пара игральных костей... ну, пара игральных костей. Возвращая экземпляр PairOfDice, вы принимаете изменяемый объект. Просто создайте скользящий результат, совместимый с описанием вашего домена. Например. ваш Die может вернуть скользящий результат, а PairOfDice может вернуть пару скользящих результатов как java.util.Collection<Integer>. Здесь мы предполагаем, что ваши кубики неразличимы.

fcracker79 03.02.2019 09:53
PairOfDice не обязательно должен быть изменяемым, можно возвращать новый экземпляр для каждого roll, но чтобы сделать его действительно неизменяемым, все поля экземпляра должны быть final. Вечером постараюсь написать еще.
Igor Nikolaev 03.02.2019 12:07

@IgorNikolaev Я приложил фрагмент кода для описания предлагаемой реализации. Альтернативой может быть состояние броска кубика в экземплярах Dice, но это будет означать существование множества экземпляров Dice, когда существуют только кубики, независимо от того, сколько раз я хочу их бросить.

fcracker79 03.02.2019 19:33

Это новое решение выглядит довольно хорошо, на мой взгляд! Я бы выбрал CollectionOfDices, где вы должны скопировать массив dices, а не просто назначать его, поскольку массив все еще изменчив, если ссылка на него является общей. Вы, вероятно, можете подумать о том, как инкапсулировать логику, которая проверяет различные комбинации игральных костей (змеиные глаза, товарный вагон и т. д.), чтобы вместо добавления дополнительных if вы просто поддерживали список проверок, выполняемых при каждом броске.

Igor Nikolaev 04.02.2019 21:51

Другие вопросы по теме