Класс PairOfDice
не представляет вашу модель, которая является "парой кубиков".Если у вас есть пара костей, когда вы их бросаете, вы получаете два разных числа, например:
- Вы заинтересованы в обоих значениях по отдельности, поэтому метод
roll
должен возвращать два значения.Вы можете использовать bean-компонент RollResult
, содержащий два значения, например - . Вы НЕ заинтересованы в обоих значениях, а просто в сумме.Таким образом, метод
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");
}
}
}
}