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

Я работаю над кодированием программы для броска костей. Я очень новичок в 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

person chemeketaStudent    schedule 03.02.2019    source источник
comment
Что делает метод roll, можете добавить реализацию? С текущим кодом неясно, зачем вам вообще нужен PairOfDice, вы можете бросать каждый кубик по отдельности, так как вы все равно вызываете roll дважды.   -  person Igor Nikolaev    schedule 03.02.2019
comment
Мой метод броска показывает номинал кости из значений от 1 до 6 с помощью генератора случайных чисел. пара игральных костей является частью моих рекомендаций по заданию для класса. цель состояла в том, чтобы создать пару игральных костей как один объект, я просто не уверен, как бросить кости и отобразить два значения - одно значение на кубик...   -  person chemeketaStudent    schedule 03.02.2019


Ответы (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");
            }

        }

    }
}
person fcracker79    schedule 03.02.2019
comment
Такой вид помогает. Таким образом, интересуясь обоими значениями по отдельности, использование метода roll с методом pairOfDice с двумя созданными экземплярами игральных костей не будет иметь никаких шансов получить два отдельных значения? - person chemeketaStudent; 03.02.2019
comment
Я думаю, что ваш метод roll должен возвращать экземпляр PairOfDice - ведь именно поэтому он так и называется. - person Igor Nikolaev; 03.02.2019
comment
Может быть, было бы лучше вернуть результат прокатки. По домену пара игральных костей... ну, пара игральных костей. Возвращая экземпляр PairOfDice, вы принимаете изменяемый объект. Просто создайте скользящий результат, совместимый с описанием вашего домена. Например. ваш Die может вернуть скользящий результат, а PairOfDice может вернуть пару бросков как java.util.Collection<Integer>. Здесь мы предполагаем, что ваши кубики неразличимы. - person fcracker79; 03.02.2019
comment
PairOfDice не обязательно должен быть изменяемым, можно возвращать новый экземпляр для каждого roll, но чтобы сделать его действительно неизменяемым, все поля экземпляра должны быть final. Вечером постараюсь написать еще. - person Igor Nikolaev; 03.02.2019
comment
@IgorNikolaev Я приложил фрагмент кода для описания предлагаемой реализации. Альтернативой может быть состояние броска кубика в экземплярах Dice, но это будет означать существование множества экземпляров Dice, когда существуют только кубики, независимо от того, сколько раз я хочу их бросить. - person fcracker79; 03.02.2019
comment
Это новое решение выглядит довольно хорошо, на мой взгляд! Я бы аккуратно выбрал CollectionOfDices, где вы должны скопировать массив dices, а не просто назначать его, поскольку массив все еще изменчив, если ссылка на него является общей. Вы, вероятно, можете подумать о том, как инкапсулировать логику, которая проверяет различные комбинации кубиков (змеиные глаза, товарный вагон и т. д.), чтобы вместо добавления дополнительных if вы просто поддерживали список проверок, выполняемых при каждом броске. - person Igor Nikolaev; 04.02.2019