试图制作一个骰子辊,该骰子辊能够通过单个输入将特定数量的侧面滚动特定的次数

时间:2018-10-01 17:42:44

标签: java java.util.scanner dice java.util.random

到目前为止,我正在使用.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 :(得分:3)

您的代码有两个问题:

  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);
    

答案 1 :(得分:1)

经过一些OOP的思考,我将编写--stack-yaml类。例如:

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));

    }
}

答案 2 :(得分:0)

您想从字符串中获取整数,而不是char。这是许多方法之一

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

这将避免您遇到从char方法返回的string.charAt()值获取ascii值(也是int)的问题。

编辑:

我的代码段中的numbers数组表示拆分输入的结果。根据由d1d63d10分隔的两个数字的预期输入,结果将是其中包含2个项目的数组,即{{1}之前的数字}及其后面的数字。例如,如果您调用了split方法,并且输入字符串包含多个d字符,则会得到一个更大的数组。例如,d将导致其中包含3个项目的数组1d6d7"1""6"。即使内容是字符串类型,我在上下文中也希望它们的值是数字。这就是为什么在以下几行"7"中将值从String转换为int的原因。仅当字符串的值是有效的int时才有效。