我整天都在这里,我不能为我的生活弄清楚我做错了什么。代码崩溃了我的Android模拟器。我试图做的是写一个骰子滚动程序,我让它作为单个实体滚动骰子,但我正在尝试处理像3d6或5d4骰子卷。对singleRoll的调用一次滚动一个模具,我试图将更长的等式分解为更简单的位......“3d4 + 5-13d6 + 7d8 + 9”
bbs.randInt返回[0,diceSize)。
public int multiPartRoll(String roll) {
String[] parts = roll.split("(?=[+-])"); //split by +-, keeping them
int total = 0;
// TODO: Replace 5d4 with d4+d4+d4+d4+d4
for (String partOfRoll : parts) { //roll each dice specified
if (partOfRoll.matches("\\d+d\\d+")) {
String[] splitString = (partOfRoll.split("d"));
int times = Integer.getInteger(splitString[0]);
int die = Integer.getInteger(splitString[1]);
int i;
for (i = 0; i < times; i++) {
String rollStr = "d" + die;
total += singleRoll(rollStr);
}
}
else {
total += singleRoll(partOfRoll);
}
}
return total;
}
public int singleRoll(String roll) {
int di = roll.indexOf('d');
if (di == -1) //case where has no 'd'
return Integer.parseInt(roll);
int diceSize = Integer.parseInt(roll.substring(di + 1)); //value of string after 'd'
int result = bbs.randInt(diceSize) + 1; //roll the dice
if (roll.startsWith("-")) //negate if nessasary
result = -result;
return result;
}
答案 0 :(得分:0)
问题在于使用了错误的Integer解析方法。
尝试替换所有出现的
"yyyy MM dd"
与
Integer.getInteger
您使用的方法不会将String转换为整数:http://docs.oracle.com/javase/6/docs/api/java/lang/Integer.html#getInteger%28java.lang.String%29
最好的问候。
答案 1 :(得分:0)
让我们介绍Dice
界面:
interface Dice {
int roll();
}
两个类NDice
是正常骰子&#39;:
class NDice implements Dice {
private final int nb;
private final int sides;
private Random r = new Random();
NDice(String[] desc) {
this.nb = Integer.parseInt(desc[0]);
this.sides = Integer.parseInt(desc[1]);
}
@Override
public int roll() {
return nb < 0 ? -1 : 1 * IntStream.generate(() -> r.nextInt(sides) + 1).limit(Math.abs(nb)).sum();
}
}
而且CDice
是&#39;常数骰子&#39;:
class CDice implements Dice {
private int constant;
public CDice(int constant) {
this.constant = constant;
}
@Override
public int roll() {
return constant;
}
}
然后我们可以引入方法将rollDescription
解析成骰子集合并滚动这个骰子:
static int roll(String rollDescription) {
String[] parts = rollDescription.split("(?=[+-])");
return Arrays.stream(parts)
.map(s -> {
if (s.contains("d")) {
return new NDice(s.split("d"));
}
return new CDice(Integer.parseInt(s));
}).map(Dice::roll).reduce(0, (a, b) -> a + b);
}
现在简短说明:
CDice
我们只需要整合界面nb < 0 ? -1 : 1 * ... Math.abs(nb)
中的-
)之前支持nb
。 RollResult
和一些关于骰子的额外信息。roll
需要&#39;家庭班&#39;。 Dice
界面很好,但不是完美的地方。