正则表达式有助于Java骰子滚动程序

时间:2016-09-26 22:02:16

标签: java calculator dice

我整天都在这里,我不能为我的生活弄清楚我做错了什么。代码崩溃了我的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;
    }

2 个答案:

答案 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
  • 我省略了关于roll的元信息。如果需要,可以引入包含结果的类RollResult和一些关于骰子的额外信息。
  • 命名可能会更好
  • 静态方法roll需要&#39;家庭班&#39;。 Dice界面很好,但不是完美的地方。