You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java实现craps游戏中调用getResults的do-while循环无限循环问题

问题根因

你的getResults()方法仅会读取两个骰子当前已有的面数值计算结果,不会主动触发骰子重新投掷,这是核心问题:

  • 单次运行测试方法1时,你每次都会新建类实例,实例初始化阶段会掷一次骰子,所以每次运行返回的结果是随机的
  • 同一个实例内多次调用getResults()时,骰子的面数值从未更新,所以每次返回的结果完全一致,一旦首次结果命中"Throw again",循环条件就会永远成立,直接进入死循环

另外你原来的循环逻辑里多调用了一次无意义的getResults(),属于冗余代码,但不是死循环的核心诱因。

修复方案

方案1:在循环内先掷骰子再获取结果

直接在playCraps()的循环体里补充掷骰子的逻辑即可(骰子类一般默认会提供roll()这类重置随机面值的方法,直接调用即可):

public String playCraps() {
    String results;
    do {
        // 每次循环先投掷两个骰子更新面值
        dice1.roll();
        dice2.roll();
        results = getResults();
        System.out.println(results + "\n*************");
    } while (results.contains("Throw again"));
    return "\n*********";
}

方案2:把掷骰子逻辑封装到getResults内部

如果你希望每次调用getResults()都自动返回新投掷的结果,可以把掷骰子的逻辑直接移到getResults()里:

public String getResults() {
    // 每次调用自动先掷骰子
    dice1.roll();
    dice2.roll();
    String die1 = "Dice 1 is " + dice1.getFaceValue();
    String die2 = "Dice 2 is " + dice2.getFaceValue();
    String total = "Total is: " + addUpScore();
    String result = "Result is " + decideOutcome(addUpScore());
    String message = die1 +"\n" +die2+"\n"+total+"\n"+result;
    return message;
}

修改后playCraps()只需要删掉冗余的getResults()调用即可正常运行:

public String playCraps() {
    String results;
    do {
        results = getResults();
        System.out.println(results + "\n*************");
    } while (results.contains("Throw again"));
    return "\n*********";
}

内容的提问来源于stack exchange,提问作者MatWDS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 17:15:05