Попытка сделать ролик для игры в кости, способный катить матрицу с определенным числом сторон определенное количество раз через один вход - PullRequest
0 голосов
/ 01 октября 2018

Пока что я использую .charAt (), чтобы различить первый и третий символы, скажем, «1d6», что означает бросок шестигранного кубика один раз.Для этого я создал цикл for, чтобы использовать случайный класс с диапазоном 1 и типом матрицы (в данном случае 6), и цикл должен выполнять его несколько раз, определяемый входом (в этом случае1).Проблема в том, что значения, которые я получаю, довольно случайны.

import java.util.Scanner;
import java.util.Random;
public class DiceRoller3 {
    public static void main(String[] args) {
    //Creates a new scanner object
    Scanner input = new Scanner(System.in);
    //Creates a new Random object
    Random random = new Random();

    //fluff text
    //System.out.println("What would you like to roll?");

    //Sets dieInput equal to the input the scanner reads.
    String dieInput = input.next();

    //sets noOfDice equal the the first character of the dieInput String
    int noOfDice = dieInput.charAt(0);

    //sets dieType equal to the 3rd character of the dieInput String
    int dieType = dieInput.charAt(2);

    //test to show the value of noOfDice and dieType
    System.out.println(dieInput);
    System.out.println(noOfDice);
    System.out.println(dieType);


    //Loop to roll the die type determined by the input, a number of times 
    that is also determined by the input
    for(int x = 1; x <= noOfDice; x++)
    {
        int roll = random.nextInt(dieType) + 1;

        System.out.println(roll);
    }

}

}

Когда я запускаю это, программа сообщает мне, что значения noOfDice и dieType равны 49 или 50 иликакое-то другое большое число, которое я не понимаю, почему это так.значение dieInput является правильным, но когда два символа считываются из dieInput, они становятся неправильными.есть мысли о том, почему это может быть?а также любые другие проблемы в моем коде.

Отказ от ответственности: я довольно новичок в кодировании, и я пытаюсь сделать это с тем, что я знаю (сканер и случайные, например), я думаю, что есть более эффективные способы сделать то, что я хочу, но я пытаюсь сделатьэто с инструментами, которые у меня есть.

Ответы [ 3 ]

0 голосов
/ 01 октября 2018

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

String[] numbers = dieInput.split("d"); // "1d6" split into "1" and "6"
int noOfDie = Integer.parseInt(numbers[0]);
int dieType = Integer.parseInt(numbers[1]);

Это позволит избежать проблемы, с которой вы сталкиваетесь, когда вы получаете значение ascii (которое также является целым числом) из значения char, которое вы получаетеВернемся к методу string.charAt().

Редактировать:

Массив numbers в моем фрагменте представляет результат разделения ввода.Исходя из ожидаемого ввода двух чисел, разделенных d, таких как 1d6 или 3d10, результатом будет массив с двумя элементами в нем, числом перед d и числом после него.Например, если вы вызвали метод split и входная строка содержала несколько символов d, вы получили бы больший массив.Например, 1d6d7 приведет к массиву с 3 элементами в нем, "1", "6" и "7".Несмотря на то, что содержимое имеет тип string, я контекстуально ожидаю, что его значения будут числами.Вот почему в следующих строках Integer.parseInt() используется для преобразования значения из String в int.Это работает только тогда, когда значение строки является допустимым int.

0 голосов
/ 01 октября 2018

Подумав оОП, я бы написал класс Dice.Например:

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class Dice {

    private static final Random RANDOM = new Random();

    private int sides;

    private Dice(){
        //no Dice constructor without the sides parameter
    }

    public Dice(int sides){
        if (sides <= 0){
            throw new RuntimeException();
        }
        else {
            this.sides = sides;
        }
    }

    public int getSides(){
        return this.sides;
    }

    private int rollMyDice(){
        return  1 + RANDOM.nextInt(this.sides);
    }

    public List<Integer> rollMyDiceManyTimes(int howManyRolling){
        List<Integer> result = new ArrayList<>();
        for (int i = 0; i < howManyRolling; i++){
            result.add(rollMyDice());
        }
        return result;
    }

}

Затем вы можете проверить его (и / или переписать код для достижения ваших целей):

public class Answer {

    public static void main(String[] args) {

        //test
        Dice dice = new Dice(9);
        System.out.println("I'm rolling the dice with "
                + dice.getSides()
                + " sides "
                + " ELEVEN TIMES "
                + dice.rollMyDiceManyTimes(11));

    }
}

Конечно, это всего лишь шаблон Iпытался предоставить вам ...

Некоторые выходные данные будут:

I'm rolling the dice with 9 sides  ELEVEN TIMES [9, 4, 5, 2, 8, 7, 3, 8, 2, 1, 4]
0 голосов
/ 01 октября 2018

Два вопроса с вашим кодом:

  1. Изменить

    // this gets the ASCII value which is why you are getting weird numbers 
    // ASCII value of 1 is 49
    int noOfDice = dieInput.charAt(0);  
    

    на

    // this gets numeric value of the character
    int noOfDice = Character.getNumericValue(dieInput.charAt(0));
    int dieType = Character.getNumericValue(dieInput.charAt(2));
    
  2. Используйте это длягенерировать случайные числа от 1 до dietype:

    int minVal = 1;
    int roll = (minVal + random.nextInt(dieType - minVal + 1);
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...