Java发牌程序中do-while循环条件不满足仍执行的问题修复
问题修复方案
你的代码核心问题在于内层的while(CardDealt <= numCards)循环会强制发完所有52张牌,不管用户输入的response是不是N。只要进入这个内层循环,它就会一直执行到CardDealt超过52,完全无视用户的终止请求,外层的do-while循环要等内层跑完才会检查条件,自然达不到用户输入N就停止的效果。
修复步骤:
- 移除内层的
while循环,将发牌逻辑直接放在外层do-while中,每次循环只发一张牌。 - 将
Scanner的初始化移到循环外部,避免重复创建对象造成资源浪费。 - 在发牌后先判断是否已经发完52张牌,若发完则直接终止循环。
- 兼容用户输入的大小写(比如
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
相关产品推荐
相关产品推荐

