为何函数内布尔变量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
相关产品推荐
相关产品推荐

