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
相关产品推荐
相关产品推荐

