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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 01:48:02