Python开发Blackjack程序时while循环输入's'无法正常退出问题
21点程序停牌后循环异常修复
编辑说明:我已精简本条目内容,删除冗长解释和冗余修改记录,目前已将问题定位到唯一核心点。
问题背景
- 开发场景:编写Blackjack(21点)小游戏程序
- 异常表现:用户输入
s选择stand(停牌)时,程序仍会回到输入环节持续循环,即使手动赋值hit_me = False也无法终止内层循环 - 运行环境:Replit平台
- 前置说明:当前仅解决循环逻辑异常问题,暂不调整不符合21点正式规则的业务逻辑,后续再做优化
问题根因
内层要牌循环的判断条件逻辑运算符使用错误:
原内层循环条件为 while hit_me == True or player_total < 21:
逻辑或(or)的判定规则是任意一个条件为真,整个表达式就为真,循环就会继续执行。当用户输入s选择停牌时,虽然hit_me被赋值为False,但只要玩家手牌总点数还小于21,第二个条件player_total < 21就始终成立,循环永远不会终止。
修复方法
将内层循环的逻辑运算符从or替换为and即可:只有当「玩家选择继续要牌」同时「玩家手牌点数小于21」两个条件都满足时,才继续执行要牌流程。任意一个条件不满足(玩家选停牌/点数达到或超过21),就会退出内层要牌循环。
另外顺带优化了不规范写法:将draw_card函数定义移到游戏循环外部,删除了无意义的空抽卡调用,避免每局游戏重复定义函数、做无效运算。
修复后可运行代码
import random def draw_card(deck): card = random.choice(deck) return int(card) game_over = False while not game_over: deck = [2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10, 11] ### 首次发牌 dealer_card = draw_card(deck) dealer_total = dealer_card player_card = draw_card(deck) player_card2 = draw_card(deck) player_total = player_card + player_card2 print(f"The dealer gets: {dealer_card} \n") print(f"Your cards are: {player_card} and {player_card2} \nYour total is: {player_total} \n") if player_total == 21: print("Blackjack!") game_over = True elif player_total > 21: print("Bust!") game_over = True elif player_total < 21: hit_me = True # 核心修复:将or替换为and,修正循环判定逻辑 while hit_me and player_total < 21: hit = input("Would you like to hit or stand? Press 'h' to hit or 's' to stand: ") if hit == 's': hit_me = False print("Stand test") elif hit == 'h': new_card = draw_card(deck) player_total += new_card print(f"Your new total is: {player_total}") if player_total > 21: hit_me = False game_over = True print("Bust!") elif player_total == 21: hit_me = False game_over = True print("Blackjack!")
内容的提问来源于stack exchange,提问作者Bruce
相关产品推荐
相关产品推荐

