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

Zombie Dice游戏回合结束循环异常 无法切换至下一玩家

Zombie Dice 回合切换逻辑故障修复

核心错误排查

你的代码一共有6处直接影响流程的错误,按影响优先级排序:

  • 最外层游戏循环的break逻辑错误:当当前玩家攒够13个大脑、或者中3枪时,你直接跳出了最外层的整个游戏循环,没有做回合切换、重置当前玩家状态的操作,不管是谁触发这两个条件游戏都会直接终止。
  • 变量名大小写/拼写错误:你初始化的已抽骰子列表是dadosSorteados(S大写),但重置变量时写的是全小写的dadossorteados,赋值0或者空列表都不会修改真正的已抽骰子列表,导致每轮抽的骰子会不断累加,永远不会清空。
  • 玩家索引判断逻辑错误:Python列表索引从0开始计数,比如2个玩家对应的索引是0和1,当jogadorAtual等于玩家总数时就已经超出列表范围了,你写的判断条件jogadorAtual > numeroJogadores会晚一个索引触发,而且触发后没有做循环跳出或者轮次重置的操作,会直接报索引越界错误。
  • 骰子面匹配错误:你定义的骰子面字符串是"shot",但判定中枪时写的是匹配"tiro"(葡萄牙语“射击”),导致中枪计数永远无法正常累加,3枪淘汰的规则完全失效。
  • 初始化逻辑嵌套错误:你把录入玩家、定义骰子的全部逻辑都放在了「校验玩家数量≥2」的while循环内部,虽然输入正确时能运行,但属于错误的嵌套结构,后续加功能很容易出问题。
  • 骰子配置不符合规则:原Zombie Dice标准配置是6绿4黄3红共13个骰子,你当前的骰子列表多放了1个绿骰子、少放了1个红骰子,概率不对。

修复方案

针对上面的问题逐一修正:

  1. 把玩家录入、骰子定义的逻辑移到玩家数量校验循环的外面,避免不必要的嵌套。
  2. 修正骰子列表配置,改成6绿4黄3红的标准配置。
  3. 修正中枪判定的字符串,把"tiro"改成"shot",保证计数正常。
  4. 修正变量名拼写错误,重置回合状态时正确清空dadosSorteados列表,重置当前玩家的大脑、中枪、步数计数。
  5. 调整回合切换逻辑:当前玩家主动结束回合、或者被3枪淘汰时,不要直接跳出整个游戏循环,而是先切换到下一个玩家,重置单回合状态,再继续循环;只有当有玩家攒够13个大脑时才触发游戏结束跳出循环。
  6. 修正玩家索引判断:当jogadorAtual等于玩家总数时,说明所有玩家都完成了一轮,重置索引到0开启下一轮。

修正后的可运行代码

import random

print("========== ZOMBIE DICE (PROTÓTIPO SEMANA 4) ==========")
print("========= WELCOME TO THE ZOMBIE DICE GAME! ========")
numeroJogadores = 0
# 仅把玩家数量校验放在这个循环里
while numeroJogadores < 2:
    numeroJogadores = int(input("Enter the number of players: "))
    print(numeroJogadores)
    if numeroJogadores < 2:
        print("NOTICE: You must have at least 2 players to continue!")

# 把玩家录入、骰子定义移到校验循环外
listaJogadores = []
for i in range(numeroJogadores):
    nome = str(input("\nEnter player name: " + str(i+1) + ": "))
    listaJogadores.append(nome)
print(listaJogadores)

dadoVerde = ("brain", "steps", "brain", "shot", "steps", "brain")
dadoAmarelo = ("shot", "steps", "brain", "shot", "steps", "brain")
dadoVermelho = ("shot", "steps", "shot", "brain", "steps", "shot")
# 修正骰子配置:6绿4黄3红共13个
listaDados = [dadoVerde]*6 + [dadoAmarelo]*4 + [dadoVermelho]*3

print("\nSTARTING THE GAME...")

jogadorAtual = 0
dadosSorteados = []
tiros = 0
cerebros = 0
passos = 0
# 新增玩家总得分存储,记录每个玩家累计的大脑数
pontuacaoJogadores = [0]*numeroJogadores

while True:
    print("\n====================================")
    print("PLAYER TURN: ", listaJogadores[jogadorAtual])
    print("Total brains so far: ", pontuacaoJogadores[jogadorAtual])
    
    # 每轮抽3个骰子前先清空临时列表
    dadosSorteados = []
    for i in range (3):
        numeroSorteado = random.randint(0, len(listaDados)-1)
        dadoSorteado = listaDados[numeroSorteado]
        if dadoSorteado == dadoVerde:
            corDado = "Green"
        elif dadoSorteado == dadoAmarelo:
            corDado = "Yellow"
        else:
            corDado = "Red"
        print("Dice Drawn: ", corDado)
        dadosSorteados.append(dadoSorteado)

    print("\nThe faces drawn were: ")
    for dadoSorteado in dadosSorteados:
        numeroFaceDado = random.randint(0,5)
        face = dadoSorteado[numeroFaceDado]
        if face == "brain":
            print("- brain (you ate a brain)")
            cerebros += 1
        # 修正判定字符串,把tiro改成shot
        elif face == "shot":
            print("- shot (you got shot)")
            tiros += 1
        else:
            print("- steps (a victim escaped)")
            passos += 1

    print("\nCURRENT TURN SCORE: ")
    print("brains: ", cerebros)
    print("shots: ", tiros)

    # 判定胜利:累计大脑+本回合大脑≥13
    totalCerebros = pontuacaoJogadores[jogadorAtual] + cerebros
    if totalCerebros >= 13:
        print(f"Congratulations {listaJogadores[jogadorAtual]}, you've won the game with {totalCerebros} brains!")
        break
    elif tiros >= 3:
        print("You got 3 shots! Your turn ends, you gain no brains this round.")
        # 不跳出游戏,只重置状态切玩家
        tiros = 0
        cerebros = 0
        passos = 0
        jogadorAtual += 1
        # 修正索引判断:等于玩家数时回到第一个玩家
        if jogadorAtual >= numeroJogadores:
            jogadorAtual = 0
        continue
    else:
        continuarTurno = str(input("\nNOTICE: Do you want to continue playing dice? (y=yes / n=no)")).lower()
        if continuarTurno == "n":
            # 结算本回合大脑到总得分
            pontuacaoJogadores[jogadorAtual] += cerebros
            # 修正变量名,正确重置状态
            dadosSorteados = []
            tiros = 0
            cerebros = 0
            passos = 0
            jogadorAtual += 1
            # 修正索引越界判断
            if jogadorAtual >= numeroJogadores:
                jogadorAtual = 0
            print("Turn ended, switching to next player...")
        else:
            print("Starting another roll of the current turn")
            dadosSorteados = []

print("======================================================")
print("===================== END OF THE GAME ====================")
print("======================================================")

注:修复版本额外加了玩家累计得分的存储,符合Zombie Dice的基础规则:玩家主动结束回合时才能把本回合抽到的大脑计入总分,被3枪淘汰则本回合大脑清零。

内容的提问来源于stack exchange,提问作者Rodrigo Fiad Pasini

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 22:18:37