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

Python开发UNO游戏遇This code is unreachable:138错误求修复

修复UNO游戏中的"This code is unreachable"错误

错误核心原因

提示的不可达代码位于第138行:index_card_bot += 1,它被写在continue语句之后。continue会直接跳转到while循环的下一次迭代,导致这行代码永远无法被执行。

分步修复方案

1. 修复不可达代码逻辑

调整BotUno函数中的循环结构,将索引递增操作移到不会被continue跳过的位置,同时优化出牌有效性判断逻辑:

def BotUno():
    lance_valido_bot = False
    global bot_cards

    index_card_bot = 0
    while index_card_bot < len(bot_cards):
        lance_bot = bot_cards[index_card_bot]
        lance_valido_bot = False

        # 处理特殊牌的响应规则
        if ultima_carta_jogada[0][0] in ["+2", "+4", "Block", "Reverse"]:
            if (ultima_carta_jogada[0][0] == "+2" and lance_bot[0] in ["+2", "+4"]) or \
               (ultima_carta_jogada[0][0] == "+4" and lance_bot[0] in ["+2", "+4"]) or \
               (ultima_carta_jogada[0][0] == "Block" and lance_bot[0] == "Block") or \
               (ultima_carta_jogada[0][0] == "Reverse" and lance_bot[0] == "Reverse"):
                lance_valido_bot = True
            else:
                index_card_bot += 1
                continue
        # 处理数字/颜色匹配规则
        elif ultima_carta_jogada[0][0] == lance_bot[0] or ultima_carta_jogada[0][1] == lance_bot[1]:
            lance_valido_bot = True
        else:
            index_card_bot += 1
            continue

        # 执行有效出牌操作
        if lance_valido_bot:
            bot_cards.remove(lance_bot)
            ultima_carta_jogada.pop()
            ultima_carta_jogada.append(lance_bot)
            print(f"\nUltima carta Jogada: {ultima_carta_jogada[0][0]} {ultima_carta_jogada[0][1]}")
            break  # Bot出一张牌后结束回合,符合UNO规则

        index_card_bot += 1

2. 修复其他潜在逻辑问题

  • 全局变量声明缺失:Jogar函数中修改全局变量sua_jogada和lance_valido时,需要添加全局声明,否则会创建局部变量导致逻辑错误:
    def Jogar():
        global sua_jogada, lance_valido
        qtd_cards = 7
        # 后续代码保持不变
    
  • 随机数索引越界:Iniciar函数中random.randint(1, len(cards)-1)会在cards长度为1时报错,改为从0开始的索引范围:
    your_cards.append(list(cards[random.randint(0, len(cards) - 1)]))
    bot_cards.append(list(cards[random.randint(0, len(cards) - 1)]))
    
  • 手牌数量跟踪错误:qtd_cards和qtd_cards_bot是固定值,改为用len(your_cards)和len(bot_cards)实时获取手牌数量,比如Jogar函数的循环条件改为:
    while len(your_cards) > 0:
    

完整修复后的代码

#UNO!
import random

cards = []
cards_number = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
cards_special = ["+2", "+4", "Block", "Reverse"]
cards_color = ["Azul", "Verde", "Vermelho", "Amarelo"]

your_cards = []
bot_cards = []
ultima_carta_jogada = []

def Organizar_Cards():
    print()
    print("UNO!")
    for index_organizar_cards_number in cards_number:
        for index_organizar_cards_colors in cards_color:
            juncao_number_with_color = index_organizar_cards_number, index_organizar_cards_colors
            cards.append(juncao_number_with_color)
            cards.append(juncao_number_with_color)

    for index_organizar_cards_special in cards_special:
        for index_organizar_cards_colors in cards_color:
            juncao_special_with_color = index_organizar_cards_special, index_organizar_cards_colors
            cards.append(juncao_special_with_color)
            cards.append(juncao_special_with_color)

    index = 0
    while index < len(cards):
        print(f"{cards[index][0]} {cards[index][1]}")
        index += 1

def Iniciar():
    iniciar_aleatorio = random.randint(0, len(cards)-1)
    ultima_carta_jogada.append(cards[iniciar_aleatorio])
    cards.remove(ultima_carta_jogada[0])
    print()
    print(f"Iniciou: {ultima_carta_jogada[0][0]} {ultima_carta_jogada[0][1]}")

    #Receber Cartas Jogador:
    index_receber_cards_player = 0
    while index_receber_cards_player < 7:
        your_cards.append(list(cards[random.randint(0, len(cards) - 1)]))
        index_receber_cards_player += 1

    #Receber Cartas Bot:
    index_receber_cards_bot = 0
    while index_receber_cards_bot < 7:
        bot_cards.append(list(cards[random.randint(0, len(cards) - 1)]))
        index_receber_cards_bot += 1

    print(bot_cards)

sua_jogada = ""
lance_valido = False
def Jogar():
    global sua_jogada, lance_valido
    while len(your_cards) > 0:
        print()
        print("Suas cartas:")
        index_receber_cards = 0

        while index_receber_cards < len(your_cards):
            print(f"{your_cards[index_receber_cards][0]} {your_cards[index_receber_cards][1]}")
            index_receber_cards += 1

        print()
        sua_jogada = input("Qual carta você vai jogar? ").split()

        #Verificador de Lance Válido:
        if sua_jogada not in your_cards:
            print("Você não possui esta carta, porfavor jogue novamente.")
            continue

        elif ultima_carta_jogada[0][0] == "+2" or ultima_carta_jogada[0][0] == "+4" and sua_jogada[0] == "+2" or sua_jogada[0] == "+4":
            lance_valido = True

        elif ultima_carta_jogada[0][0] == "Block" and sua_jogada[0] == "Block":
            lance_valido = True

        elif ultima_carta_jogada[0][0] == "Reverse" and sua_jogada[0] == "Reverse":
            lance_valido = True

        elif ultima_carta_jogada[0][0] == sua_jogada[0] or ultima_carta_jogada[0][1] == sua_jogada[1]:
            lance_valido = True

        else:
            lance_valido = False

        if lance_valido == True:
            your_cards.remove(sua_jogada)
            ultima_carta_jogada.pop()
            ultima_carta_jogada.append(sua_jogada)
            print()
            print(f"Ultima carta Jogada: {ultima_carta_jogada[0][0]} {ultima_carta_jogada[0][1]}")
            BotUno()
            continue
        else:
            print("Lance inválido, porfavor jogue novamente.")
            continue

def BotUno():
    lance_valido_bot = False
    global bot_cards

    index_card_bot = 0
    while index_card_bot < len(bot_cards):
        lance_bot = bot_cards[index_card_bot]
        lance_valido_bot = False

        if ultima_carta_jogada[0][0] in ["+2", "+4", "Block", "Reverse"]:
            if (ultima_carta_jogada[0][0] == "+2" and lance_bot[0] in ["+2", "+4"]) or \
               (ultima_carta_jogada[0][0] == "+4" and lance_bot[0] in ["+2", "+4"]) or \
               (ultima_carta_jogada[0][0] == "Block" and lance_bot[0] == "Block") or \
               (ultima_carta_jogada[0][0] == "Reverse" and lance_bot[0] == "Reverse"):
                lance_valido_bot = True
            else:
                index_card_bot += 1
                continue
        elif ultima_carta_jogada[0][0] == lance_bot[0] or ultima_carta_jogada[0][1] == lance_bot[1]:
            lance_valido_bot = True
        else:
            index_card_bot += 1
            continue

        if lance_valido_bot:
            bot_cards.remove(lance_bot)
            ultima_carta_jogada.pop()
            ultima_carta_jogada.append(lance_bot)
            print(f"\nUltima carta Jogada: {ultima_carta_jogada[0][0]} {ultima_carta_jogada[0][1]}")
            break

        index_card_bot += 1

Organizar_Cards()
Iniciar()
Jogar()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 12:15:38