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

Java发牌程序中do-while循环条件不满足仍执行的问题修复

问题修复方案

你的代码核心问题在于内层的while(CardDealt <= numCards)循环会强制发完所有52张牌,不管用户输入的response是不是N。只要进入这个内层循环,它就会一直执行到CardDealt超过52,完全无视用户的终止请求,外层的do-while循环要等内层跑完才会检查条件,自然达不到用户输入N就停止的效果。

修复步骤:

  1. 移除内层的while循环,将发牌逻辑直接放在外层do-while中,每次循环只发一张牌。
  2. 将Scanner的初始化移到循环外部,避免重复创建对象造成资源浪费。
  3. 在发牌后先判断是否已经发完52张牌,若发完则直接终止循环。
  4. 兼容用户输入的大小写(比如y或Y都视为同意继续),提升交互友好性。

修改后的完整代码:

import java.util.Scanner;

public class DealCardsGNN {
    public static void main(String[] args) {
        int numCards = 52;
        int cardDealt = 0;
        String cardName = "";
        String suitName = "";
        char response = ' ';
        
        // 只初始化一次Scanner
        Scanner scan = new Scanner(System.in);

        do {
            // 先检查是否还有牌可发
            if (cardDealt >= numCards) {
                System.out.println("所有牌已发完!");
                break;
            }

            int card = (int)(Math.random() * 13) + 1;
            int suit = (int)(Math.random() * 4) + 1;

            switch(card) {
                case 1: cardName = "Ace"; break;
                case 2: cardName = "2"; break;
                case 3: cardName = "3"; break;
                case 4: cardName = "4"; break;
                case 5: cardName = "5"; break;
                case 6: cardName = "6"; break;
                case 7: cardName = "7"; break;
                case 8: cardName = "8"; break;
                case 9: cardName = "9"; break;
                case 10: cardName = "10"; break;
                case 11: cardName = "Jack"; break;
                case 12: cardName = "Queen"; break;
                case 13: cardName = "King"; break;
            }

            switch(suit) {
                case 1: suitName = "Diamonds"; break;
                case 2: suitName = "Clubs"; break;
                case 3: suitName = "Hearts"; break;
                case 4: suitName = "Spades"; break;
            }
            
            System.out.println("The card is " + cardName + " of " + suitName);
            cardDealt++;

            // 只有还有牌的时候才询问是否继续
            if (cardDealt < numCards) {
                System.out.println("Do you want another card? (Enter Y or N)");
                response = scan.next().toUpperCase().charAt(0);
            } else {
                // 没有牌了,直接设置为N终止循环
                response = 'N';
            }

        } while(response == 'Y');
        
        // 关闭Scanner
        scan.close();
    }
}

关键改动说明:

  • 移除内层循环后,每次do-while循环只处理一张牌,用户输入N后会直接终止外层循环,停止发牌。
  • Scanner只初始化一次,避免重复创建对象,最后记得关闭资源。
  • 增加了牌数检查,发完52张后自动终止,不再询问用户。
  • 使用toUpperCase()统一转换用户输入为大写,兼容小写y的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 23:30:26