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个红骰子,概率不对。
修复方案
针对上面的问题逐一修正:
- 把玩家录入、骰子定义的逻辑移到玩家数量校验循环的外面,避免不必要的嵌套。
- 修正骰子列表配置,改成6绿4黄3红的标准配置。
- 修正中枪判定的字符串,把
"tiro"改成"shot",保证计数正常。 - 修正变量名拼写错误,重置回合状态时正确清空
dadosSorteados列表,重置当前玩家的大脑、中枪、步数计数。 - 调整回合切换逻辑:当前玩家主动结束回合、或者被3枪淘汰时,不要直接跳出整个游戏循环,而是先切换到下一个玩家,重置单回合状态,再继续循环;只有当有玩家攒够13个大脑时才触发游戏结束跳出循环。
- 修正玩家索引判断:当
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
相关产品推荐
相关产品推荐

