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

Blackjack游戏compare函数触发异常:仅在用户选择不抽卡时生效

二十一点游戏compare函数触发异常问题

我在做二十一点游戏的编码练习时,编写了用于判定胜负的compare()函数,但目前存在问题:只有当用户选择“不抽卡(n)”时,这个函数才会按预期触发结算。即便用户爆牌(总分>21)、拿到二十一点(总分=0,假设此处0代表Blackjack),或者庄家拿到二十一点,函数也不会立即触发,必须等用户选择不再抽卡才行。

原代码

def compare(user, computer):
    if user == computer:
      return "Draw"
    elif computer == 0:
      return "You lose"
    elif user == 0:
      return "Your win"
    elif user > 21:
      return "You lose"
    elif computer > 21:
      return "You win"
    elif computer > user:
      return "You lose"
    else:
      if user > computer:
        return "You win"


game_over = False
while not game_over:
  user_sum = calculate_score(user_cards)
  computer_sum = calculate_score(computer_cards)
  print(f"User cards: {user_cards}. Total: {user_sum}")
  print(f"Computer card: {computer_cards[0]}.")    
  
  if user_sum == 0 or computer_sum == 0 or user_sum > 21 :
    game_over = True
    
  draw = input("Do you want to draw another card? y or n: ").lower()
  if draw == 'y':
    game_over = False
    user_cards.append(deal_card())
  else:
    game_over = True

while computer_sum < 17:
    computer_cards.append(deal_card())
    computer_sum = calculate_score(computer_cards)
  
print(f"User final cards: {user_cards}. Total: {user_sum}")
print(f"Computer final cards: {computer_cards}. Total: {computer_sum}")
print(compare(user = user_sum, computer = computer_sum))

问题原因

核心逻辑漏洞在于主循环的执行顺序:

  • 当检测到用户爆牌、拿到Blackjack或庄家拿到Blackjack时,虽然设置了game_over=True,但代码依然会继续执行到input()语句,要求用户选择是否抽卡,没有直接进入结算流程。
  • 只有当用户选择n或者循环自然退出后,才会执行庄家补卡和compare()函数调用,导致满足结束条件时无法立即结算。

修复方案

调整主循环逻辑,一旦触发游戏结束条件,直接跳出循环,跳过用户输入步骤:

def compare(user, computer):
    if user == computer:
      return "Draw"
    elif computer == 0:
      return "You lose"
    elif user == 0:
      return "You win"  # 修正拼写错误
    elif user > 21:
      return "You lose"
    elif computer > 21:
      return "You win"
    elif computer > user:
      return "You lose"
    else:
      return "You win"  # 简化多余的判断分支


game_over = False
while not game_over:
  user_sum = calculate_score(user_cards)
  computer_sum = calculate_score(computer_cards)
  print(f"用户手牌: {user_cards}. 总分: {user_sum}")
  print(f"庄家手牌: {computer_cards[0]}.")    
  
  # 触发结束条件时直接跳出循环
  if user_sum == 0 or computer_sum == 0 or user_sum > 21 :
    game_over = True
    break
  
  draw = input("是否要再抽一张牌?y或n: ").lower()
  if draw == 'y':
    user_cards.append(deal_card())
  else:
    game_over = True

# 庄家自动补卡逻辑
while computer_sum < 17:
    computer_cards.append(deal_card())
    computer_sum = calculate_score(computer_cards)
  
print(f"用户最终手牌: {user_cards}. 总分: {user_sum}")
print(f"庄家最终手牌: {computer_cards}. 总分: {computer_sum}")
print(compare(user=user_sum, computer=computer_sum))

关键修改点

  1. 在检测到游戏结束条件后添加break语句,直接终止主循环,跳过后续的用户输入步骤,立即进入结算流程。
  2. 简化compare()函数的最后分支:原代码else块内的if user > computer判断多余,直接返回结果即可。
  3. 修正compare()函数中的拼写错误("Your win"改为"You win")。
  4. 将英文提示文本改为中文,提升可读性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 19:40:28