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

为何函数内布尔变量game_on未修改成功?Blackjack游戏问题

问题原因
  • 你在turn函数里直接写game_on=False时,Python会把这个game_on当成局部变量,根本不会修改全局作用域里的那个game_on。所以外部while循环里的全局game_on始终是True,游戏自然停不下来。
  • 编辑器提示“局部变量未使用”,是因为你在函数里创建了这个局部game_on,但之后没在函数内部读取它的值,属于无效赋值。
解决方案

有两种常用修复方式:

方式一:用global声明全局变量

在turn函数开头加上global game_on,告诉Python这个变量是全局作用域的,这样函数内部的赋值就会直接修改全局变量:

def turn(x):
  global game_on  # 声明使用全局变量
  pick_card(x)
  if calculate_score(x) == 0:
    print("blackjack")
    game_on= False
  elif calculate_score(x) >21:
    print("You lost")
    game_on= False
  else:
    print(p1)

方式二:让函数返回游戏状态(更推荐)

避免依赖全局变量,让turn函数返回布尔值表示游戏是否继续,外部循环根据返回值更新game_on:

def turn(x):
  pick_card(x)
  if calculate_score(x) == 0:
    print("blackjack")
    return False  # 返回False表示游戏结束
  elif calculate_score(x) >21:
    print("You lost")
    return False
  else:
    print(p1)
    return True  # 返回True表示游戏继续

# 修改while循环部分:
while game_on:
  game_on = turn(p1)  # 接收函数返回的状态
  if game_on:  # 游戏还在继续时才询问是否续玩
    if input("continue?\n") != "y":
      game_on=False
额外优化提示
  • pick_card函数里return x.append(...)没必要,因为append方法返回None,直接写成def pick_card(x): x.append(random.choice(cards))即可。
  • calculate_score函数中,当前只替换一次11为1,如果替换后总和仍超过21(比如原手牌有两个11),可以考虑循环替换直到总和≤21或没有11为止。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 23:45:39