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

编写Blackjack模拟器时遇'return outside of function'错误求助

解决Blackjack模拟器的'return outside of function'错误

核心问题梳理

  1. return语句越界:Python中return只能在函数内部使用,你的代码里多处return直接写在全局代码中(比如开头的循环、create_blackjack_game函数外的游戏逻辑),这是触发错误的直接原因。
  2. 代码缩进混乱:多个函数(如remove_suit_from_deck、remove_number_from_deck)的核心逻辑被写在了函数定义外部,导致函数体为空,逻辑跑到全局作用域。
  3. 依赖缺失:未导入itertools.product、random.seed/random.choice,也未定义suits、numbers变量,代码无法正常运行。
  4. 逻辑错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 15:20:32