到目前为止,我正在使用.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读取两个字符时,它们将变得不正确。有什么想法为什么呢?以及我代码中的其他任何问题。
免责声明:我对编码来说还很陌生,我想用我所知道的(例如扫描仪和随机)来做到这一点,我想有更有效的方式来做我想做的事,但是我想用我拥有的工具。
答案 0 :(得分:3)
您的代码有两个问题:
更改
// 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));
使用它来生成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
数组表示拆分输入的结果。根据由d
或1d6
等3d10
分隔的两个数字的预期输入,结果将是其中包含2个项目的数组,即{{1}之前的数字}及其后面的数字。例如,如果您调用了split方法,并且输入字符串包含多个d
字符,则会得到一个更大的数组。例如,d
将导致其中包含3个项目的数组1d6d7
,"1"
和"6"
。即使内容是字符串类型,我在上下文中也希望它们的值是数字。这就是为什么在以下几行"7"
中将值从String转换为int的原因。仅当字符串的值是有效的int时才有效。