Python二十一点模拟器循环逻辑异常:手牌判断与遍历问题求助
二十一点模拟器代码问题排查
问题背景
我是Python新手,正在运行从网上找到的二十一点模拟器,但部分代码逻辑未达预期,尝试多种写法仍未解决。
相关代码
# deal player to 12 or higher while sum(player_cards) <= 12: exit = False player_cards.append(deck.pop(0)) # check for limit if sum(player_cards) > 21: print("--players_cards >21") exit = True # check for an ace and convert to 1 if found for i, card in enumerate(player_cards): print("--card " + str(card)) if card == 11: player_cards[i] = 1 exit = False else: return -1 if exit: break # deal dealer on soft 17 while sum(dealer_cards) <= 16: exit = False dealer_cards.append(deck.pop(0)) # check for limit if sum(dealer_cards) > 21: exit = True # check for an ace and convert to 1 if found for i, card in enumerate(dealer_cards): if card == 11: dealer_cards[i] = 1 exit = False if exit: break p_sum = sum(player_cards) d_sum = sum(dealer_cards) print("player " + str(player_cards) ) print("dealer " + str(dealer_cards) )
异常输出
player [10, 10] dealer [5, 6, 10] --players_cards >21 --card 3 player [10, 10] dealer [10, 9] --players_cards >21 --card 3 player [7, 10] dealer [5, 10, 5]
存在的问题
- 仅当
sum(player_cards) >21时才应打印"--players_cards >21",但实际在手牌和为20[10,10]、17[7,10]时触发该打印; - for循环应遍历打印玩家手牌的所有数值,却输出了3。尝试改用
range(len())写法后结果类似。
问题分析与修复
核心问题根源
玩家手牌处理逻辑中的else: return -1是错误的:只要遍历到非11的牌就直接终止函数,导致后续流程被打断,手牌状态混乱,同时循环只执行一次就退出。
修复后的玩家发牌逻辑
# deal player to 12 or higher while sum(player_cards) <= 12: exit = False player_cards.append(deck.pop(0)) current_sum = sum(player_cards) if current_sum > 21: print("--players_cards >21") exit = True # 遍历手牌,将A(11)转换为1 for i, card in enumerate(player_cards): print("--card " + str(card)) if card == 11: player_cards[i] = 1 exit = False # 转换后已无需继续遍历,跳出循环 break if exit: break
修复后的庄家发牌逻辑(可选优化)
# deal dealer on soft 17 while sum(dealer_cards) <= 16: exit = False dealer_cards.append(deck.pop(0)) current_sum = sum(dealer_cards) if current_sum > 21: exit = True # 遍历手牌,将A(11)转换为1 for i, card in enumerate(dealer_cards): if card == 11: dealer_cards[i] = 1 exit = False break if exit: break
修复说明
- 删除了错误的
else: return -1,避免函数提前退出,保证循环能正常遍历所有手牌; - 转换A后添加
break,避免不必要的遍历,提升效率; - 增加
current_sum变量缓存手牌和,避免重复调用sum()函数,优化性能; - 修复后,只有当玩家手牌和真正超过21时才会打印"--players_cards >21",且for循环会遍历打印所有手牌。
内容的提问来源于stack exchange,提问作者Lalo Fuentes
相关产品推荐
相关产品推荐

