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




Класс 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");
}
}
}
}
Такой вид помогает. Таким образом, интересуясь обоими значениями по отдельности, использование метода roll с методом pairOfDice с двумя созданными экземплярами игральных костей не будет иметь никаких шансов получить два отдельных значения?
Я думаю, что ваш метод roll должен возвращать экземпляр PairOfDice — ведь именно поэтому он так и называется.
Может быть, было бы лучше вернуть результат прокатки. По домену пара игральных костей... ну, пара игральных костей. Возвращая экземпляр PairOfDice, вы принимаете изменяемый объект. Просто создайте скользящий результат, совместимый с описанием вашего домена. Например. ваш Die может вернуть скользящий результат, а PairOfDice может вернуть пару скользящих результатов как java.util.Collection<Integer>. Здесь мы предполагаем, что ваши кубики неразличимы.
PairOfDice не обязательно должен быть изменяемым, можно возвращать новый экземпляр для каждого roll, но чтобы сделать его действительно неизменяемым, все поля экземпляра должны быть final. Вечером постараюсь написать еще.
@IgorNikolaev Я приложил фрагмент кода для описания предлагаемой реализации. Альтернативой может быть состояние броска кубика в экземплярах Dice, но это будет означать существование множества экземпляров Dice, когда существуют только кубики, независимо от того, сколько раз я хочу их бросить.
Это новое решение выглядит довольно хорошо, на мой взгляд! Я бы выбрал CollectionOfDices, где вы должны скопировать массив dices, а не просто назначать его, поскольку массив все еще изменчив, если ссылка на него является общей. Вы, вероятно, можете подумать о том, как инкапсулировать логику, которая проверяет различные комбинации игральных костей (змеиные глаза, товарный вагон и т. д.), чтобы вместо добавления дополнительных if вы просто поддерживали список проверок, выполняемых при каждом броске.
Что делает метод
roll, можете ли вы добавить реализацию? С текущим кодом неясно, зачем вам вообще нуженPairOfDice, вы можете бросать каждый кубик по отдельности, так как вы все равно вызываетеrollдважды.