Java实现Matador骰子游戏无法正常结束,求do while循环逻辑修复方案
核心问题及修复方案
1. 循环条件逻辑错误(死循环核心原因)
你所有循环的终止条件都用了||(或)运算符,逻辑完全相反:
- 原主循环条件:
while (playerScore < 98 || computerScore < 98 || quit != 1)
这个条件代表只要任意一方得分小于99,或者quit不等于1,循环就继续,哪怕一方已经赢了,只要另一方得分没到99,循环永远不会停。 - 正确的循环继续条件应该是:双方得分都小于99,且没有触发quit标记,所以要把
||改成&&,同时把阈值改成99更直观:while (playerScore < 99 && computerScore < 99 && quit != 1)
2. 玩家回合内层循环条件完全错误
你写的while (turn < turn + 1 || quit != 1)中,turn < turn + 1是恒成立的表达式,只要quit没触发,这个循环永远不会退出。
结合业务逻辑:「如果掷出的骰子包含玩家选的数字就可以继续掷,否则换回合」,应该修改内层循环条件为:while (turn > 0 && playerScore < 99 && quit != 1)
同时注意turn = 0的赋值要放在循环外,不要每次循环内部都重置为0。
3. 冗余逻辑修正
- 电脑回合中存在两次重复的「双1判定」,第二个完全多余可以直接删除
- 你现在的cpu选号只在程序启动时生成一次,每轮对局都用同一个数字,建议把
cpu = randGen.nextInt(6) + 2;放到主循环内部,每轮重新生成电脑选号 - 每次得分更新后都要加判断,只要得分≥99就直接设置
quit=1跳出所有循环
4. 修正后的核心代码示例
package programming2; import java.util.Random; import java.util.Scanner; public class Matador { public static void main(String[] args) { Scanner scnr = new Scanner(System.in); Die matador = new Die(); int playerScore = 0; int computerScore = 0; int playerPick; int cpuPick; int turn; Random randGen = new Random(); int quit = 0; System.out.println("Welcome to el Matador!"); System.out.println("The winner of this game is the first to score 99 points"); // 主循环:双方都没到99且没触发退出就继续 do { System.out.println("Player 1 please pick your number"); playerPick = scnr.nextInt(); System.out.println("Player 1 you selected " + playerPick); // 每轮重新生成电脑选号 cpuPick = randGen.nextInt(6) + 2; System.out.println("Player 2 selects " + cpuPick); turn = 1; // 初始可以掷骰子 // 玩家1回合 do { if (playerScore >=99 || computerScore >=99 || quit ==1) break; System.out.println("Player 1 rolls dice"); matador.rollDieNow(); System.out.println("Values for 1st dice is: " + matador.getValueDie1() + " and " + matador.getValueDie2()); System.out.println("Combined values are " + matador.getValue()); // 双1判定 if (matador.getValueDie1() == 1 && matador.getValueDie2() == 1) { playerScore = Math.max(0, playerScore -25); // 避免负分可加这个判断 System.out.println("Rolled two 1s, lose 25 points, turn over"); turn = 0; break; } // 单1判定 if (matador.getValueDie1() == 1 || matador.getValueDie2() == 1) { System.out.println("Rolled a 1, turn over"); turn = 0; break; } // 加得分 playerScore += matador.getValue(); // 判断是否赢了 if (playerScore >=99) { quit =1; break; } // 判断是否匹配选号,匹配可以继续掷 if (playerPick == matador.getValueDie1() || playerPick == matador.getValueDie2()) { turn = 1; // 双匹配直接赢 if (playerPick == matador.getValueDie1() && playerPick == matador.getValueDie2()) { System.out.println("You are the winner player 1 you matched your numbers!!"); quit =1; break; } } else { turn =0; } System.out.println("Player 1 Score: " + playerScore); } while (turn ==1 && playerScore <99 && computerScore <99 && quit !=1); if (quit ==1) break; System.out.println("Score update! Player 1 score is: " + playerScore + " |-| player 2 score is " + computerScore); turn =1; // 电脑回合 do { if (playerScore >=99 || computerScore >=99 || quit ==1) break; System.out.println("Player 2 rolls dice"); matador.rollDieNow(); System.out.println("Values for 1st dice is: " + matador.getValueDie1() + " and " + matador.getValueDie2()); System.out.println("Combined values are " + matador.getValue()); // 双1判定 if (matador.getValueDie1() == 1 && matador.getValueDie2() == 1) { computerScore = Math.max(0, computerScore -25); System.out.println("Player2 rolled two 1s, lose 25 points, turn over"); turn =0; break; } // 单1判定 if (matador.getValueDie1() ==1 || matador.getValueDie2() ==1) { System.out.println("Player2 rolled a 1, turn over"); turn =0; break; } // 加得分 computerScore += matador.getValue(); if (computerScore >=99) { quit =1; break; } // 判断匹配选号 if (cpuPick == matador.getValueDie1() || cpuPick == matador.getValueDie2()) { turn =1; if (cpuPick == matador.getValueDie1() && cpuPick == matador.getValueDie2()) { System.out.println("You are the winner player 2 you matched your numbers!!"); quit =1; break; } } else { turn =0; } System.out.println("Player 2 Score: " + computerScore); } while (turn ==1 && playerScore <99 && computerScore <99 && quit !=1); } while (playerScore <99 && computerScore <99 && quit !=1); System.out.println("Player 1 final score is: " + playerScore + " |-| player 2 final score is " + computerScore); if (playerScore >=99) { System.out.println("Player 1 wins!"); } else { System.out.println("Player 2 wins!"); } scnr.close(); } }
内容的提问来源于stack exchange,提问作者Jake
相关产品推荐
相关产品推荐

