编写Blackjack模拟器时遇'return outside of function'错误求助
解决Blackjack模拟器的'return outside of function'错误
核心问题梳理
return语句越界:Python中return只能在函数内部使用,你的代码里多处return直接写在全局代码中(比如开头的循环、create_blackjack_game函数外的游戏逻辑),这是触发错误的直接原因。- 代码缩进混乱:多个函数(如
remove_suit_from_deck、remove_number_from_deck)的核心逻辑被写在了函数定义外部,导致函数体为空,逻辑跑到全局作用域。 - 依赖缺失:未导入
itertools.product、random.seed/random.choice,也未定义suits、numbers变量,代码无法正常运行。 - 逻辑错误:
get_count函数的return缩进错误,导致只计算第一张牌的点数;部分函数的条件判断、参数传递存在错误。
修正后的完整代码
import itertools from random import seed, choice # 定义牌组的花色和点数 suits = ('♠', '♥', '♦', '♣') numbers = (2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14) # 14代表A def create_standard_deck(): deck = list(itertools.product(suits, numbers)) return sorted(deck) def get_all_cards(deck): return sorted([i for i in deck]) def get_all_twos(deck): return sorted([i for i in deck if i[1]==2]) def get_all_aces(deck): return sorted([i for i in deck if i[1]==14]) def get_card_number(deck, card_number): return sorted([i for i in deck if i[1]==card_number]) def get_card_suit(deck, suit): return sorted([i for i in deck if i[0]==suit]) def get_number_and_suit(deck, num, suit): return sorted([i for i in deck if i[0]==suit and i[1]==num]) def remove_card_from_deck(deck, suit, num): deck.remove((suit, num)) return get_all_cards(deck) def remove_suit_from_deck(deck, suit): deck_copy = list(deck) for i in deck_copy: if i[0]==suit: deck.remove((suit, i[1])) return sorted(deck) def remove_number_from_deck(deck, number): deck_copy = list(deck) for i in deck_copy: if i[1]==number: deck.remove((i[0], number)) return sorted(deck) def add_card_to_deck(deck, suit, num): if suit in suits and num in numbers: deck.append((suit, num)) return sorted(deck) def add_suit_to_deck(deck, suit): if suit in suits: additional_cards = list(itertools.product([suit], numbers)) deck.extend(additional_cards) return sorted(deck) def add_number_to_deck(deck, number): if number in numbers: additional_cards = list(itertools.product(suits, [number])) deck.extend(additional_cards) return sorted(deck) def draw_card(deck): card = choice(deck) remove_card_from_deck(deck, *card) return card def display_dealer(opponent, start=False): print('Dealer:') if start: the_output = [opponent[0], ('?', '?')] print(the_output) else: print(opponent) def display_player(player): print('Player:') print(player) def get_count(player): count = 0 ace_count = 0 for cards in player: if cards[1] == 14: count += 11 ace_count += 1 elif cards[1] >= 10: count += 10 else: count += cards[1] # 处理A的点数调整(超过21时把11改成1) while count > 21 and ace_count > 0: count -= 10 ace_count -= 1 return count def check_cards(player): count = get_count(player) if count == 21: return 'WIN' elif count > 21: return 'BUST' else: return 'OK' def create_blackjack_game(user_input=None): opponent = [] player = [] # 初始化随机种子 seed(551) deck = create_standard_deck() # 发初始牌 opponent.append(draw_card(deck)) opponent.append(draw_card(deck)) player.append(draw_card(deck)) player.append(draw_card(deck)) display_dealer(opponent, start=True) display_player(player) player_action = None # 获取玩家操作 if not user_input: while player_action not in ('s', 'h', 'q'): player_action = input('press h to hit,s to stand,q to quit.').lower().strip() else: player_action = user_input.pop(0) if player_action == 'q': print('游戏退出') return 0 # 玩家回合 while player_action != 's' and player_action != 'q': if player_action == 'h': player.append(draw_card(deck)) display_dealer(opponent, start=True) display_player(player) player_result = check_cards(player) if player_result == 'WIN': print('You Win!') return 1 elif player_result == 'BUST': print('You Bust, dealer wins.') return -1 # 再次获取操作 if not user_input: player_action = input('press h to hit,s to stand,q to quit.').lower().strip() else: player_action = user_input.pop(0) if player_action == 'q': print('游戏退出') return 0 # 庄家回合 print('Dealer turns over their card:') display_dealer(opponent) while get_count(opponent) < 17: print('Dealer Hits!') opponent.append(draw_card(deck)) display_dealer(opponent) display_player(player) dealer_result = check_cards(opponent) if dealer_result == 'BUST': print('Dealer Busts, you win.') return 1 # 最终点数对比 player_count = get_count(player) dealer_count = get_count(opponent) print(f'Player: {player_count}, Dealer: {dealer_count}') if player_count > dealer_count: print('You Win!') return 1 elif player_count < dealer_count: print('Dealer Wins') return -1 else: print('Push! 平局') return 0 if __name__ == "__main__": create_blackjack_game()
关键修正说明
- 导入了
itertools和random模块的必要方法,定义了suits和numbers变量。 - 将所有全局的
return语句和游戏逻辑移入create_blackjack_game函数内部。 - 修复了
remove_suit_from_deck、remove_number_from_deck的缩进问题,确保逻辑在函数体内。 - 修正了
get_count函数的逻辑,增加了A的点数调整(超过21时将11改为1),并把return移到循环外,确保计算所有牌的点数。 - 修复了
add_suit_to_deck、add_number_to_deck中product的参数错误,传入单元素列表确保生成正确的牌组。 - 修正了大小写错误(
Print改为print)和字符串拼接错误(('?''?')改为('?', '?'))。 - 完善了游戏流程,增加了平局判断,优化了玩家操作的输入逻辑。
内容的提问来源于stack exchange,提问作者bobbysmith
相关产品推荐
相关产品推荐

