Python实现双人Family Feud小游戏及死循环与玩家切换问题修复
双人对战Python问答小游戏(类Family Feud玩法)问题排查与修复
游戏核心逻辑
每道题目对应多个可选答案,每个答案绑定对应分值,玩家猜测的答案存在于可选答案列表中即可获得对应分值。玩家可持续答题,直到用尽错误机会(strike)或猜完所有可选答案;每次猜对得分,猜重复答案或错误答案扣1次strike。
question = "Name something James Bond eats everyday" possible_answers = [("LEMON/CITRUS", 25), ("KETCHUP/MUSTARD", 25), ("TOOTHPASTE", 19), ("ZIT/BLACKHEAD", 14), ("GLUE", 6), ("MY POOPER", 3), ("LOTION BOTTLE", 2), ("LIQUID SOAP/SHAMPOO", 2)] # 测试用例1 # player answer: mustard # 返回 25 # 测试用例2 # player answer: mayonnaise # 返回 0
游戏规则
- 玩家1始终拥有首次答题权:首次答对则获得本局回合控制权,否则回合控制权归玩家2;
- 持有控制权的玩家可持续答题累积积分,若猜完所有答案,回合结束,当前回合累积积分直接存入该玩家账户;
- 若控制权持有玩家在猜完所有答案前用尽所有strike,另一方获得一次偷分机会:偷分方猜对任意剩余答案即可获得控制权持有方当前回合所有累积积分,猜错则积分仍归控制权持有方,回合直接结束;偷分方猜对不会额外获得该答案对应分值,仅获取控制权持有方的回合累积积分。
示例场景
question = "Name something a baby does that would be unacceptable in a roommate." possible_answers = [("CRY/AT 3 A.M.", 39), ("POO/WET SELF", 28), ("PUKE/ON ME", 9), ("BURP", 8), ("MAKE MESS/TOSS FOOD", 5), ("FART", 4), ("PEE IN MY FACE", 3), ("NURSE/ON MY NIPS", 2)] # 测试用例1 - 玩家1持有控制权,获得84分后用尽3次strike,玩家2偷分失败,玩家1赢下本局 # player 1 answer: cry # player 1 answer: poo # player 1 answer: puke # player 1 answer: burp # player 1 answer: cry # player 1 answer: cry # player 1 answer: cry # player 2 answer: cry # 输出 player 1 score: 84, player 1 strikes left: 0, player 2 score: 0, player 2 strikes left: 3 # 测试用例2 - 玩家1持有控制权,获得84分后用尽3次strike,玩家2偷分成功,玩家2赢下本局
问题定位
代码出现无限循环、玩家用完strike后不切换的核心原因如下:
- 最外层循环条件错误:
while player_1_score < 0初始玩家1得分为0,除非得分变为负数否则永远不会进入循环,首次答题后直接跳到最终打印逻辑 - 变量名拼写错误:首次答题玩家1答错的分支里,写的是
cplayer_1_control = False,多打了首字母c属于无效赋值,玩家1答错后player_1_control还是初始值None,控制权判断逻辑完全失效 - 规则逻辑缺失:完全没有实现偷分逻辑,当前代码会让玩家2用完3次strike后再切回玩家1,和规则要求的「用完strike后对方只有一次偷分机会」不符
- 遍历逻辑错误:
for item in possible_answers遍历的时候直接remove元素,会导致部分元素被跳过,匹配答案的时候会出现漏判
修复后完整代码
question = "Name something a baby does that would be unacceptable in a roommate." possible_answers = [("CRY/AT 3 A.M.", 39), ("POO/WET SELF", 28), ("PUKE/ON ME", 9), ("BURP", 8), ("MAKE MESS/TOSS FOOD", 5), ("FART", 4), ("PEE IN MY FACE", 3), ("NURSE/ON MY NIPS", 2)] player_1_strikes_left = 3 player_2_strikes_left = 3 player_1_score = 0 player_2_score = 0 round_score = 0 # 存储当前回合控制权持有者的累积积分 player_1_control = None game_end = False # 首次答题:玩家1先答 player_1_answer = input("玩家1首次答题,请输入答案:").upper() match = False # 遍历拷贝后的列表,避免修改原列表导致遍历漏项 for item in possible_answers.copy(): answer, score = item if player_1_answer in answer: match = True player_1_control = True round_score += score possible_answers.remove(item) break if not match: player_1_control = False player_1_strikes_left -= 1 # 主游戏循环 while not game_end and len(possible_answers) > 0: if player_1_control: # 玩家1持有控制权答题 while player_1_strikes_left > 0 and len(possible_answers) > 0: ans = input("玩家1请答题:").upper() match = False for item in possible_answers.copy(): answer, score = item if ans in answer: match = True round_score += score possible_answers.remove(item) break if not match: player_1_strikes_left -= 1 # 退出循环要么是答案猜完,要么是strike用完 if len(possible_answers) == 0: player_1_score += round_score game_end = True else: # strike用完,玩家2偷分机会 print("玩家1用完错误机会,玩家2获得一次偷分机会") steal_ans = input("玩家2请输入偷分答案:").upper() steal_success = False for item in possible_answers: if steal_ans in item[0]: steal_success = True break if steal_success: player_2_score += round_score else: player_1_score += round_score game_end = True else: # 玩家2持有控制权答题 while player_2_strikes_left > 0 and len(possible_answers) > 0: ans = input("玩家2请答题:").upper() match = False for item in possible_answers.copy(): answer, score = item if ans in answer: match = True round_score += score possible_answers.remove(item) break if not match: player_2_strikes_left -= 1 # 退出循环要么是答案猜完,要么是strike用完 if len(possible_answers) == 0: player_2_score += round_score game_end = True else: # strike用完,玩家1偷分机会 print("玩家2用完错误机会,玩家1获得一次偷分机会") steal_ans = input("玩家1请输入偷分答案:").upper() steal_success = False for item in possible_answers: if steal_ans in item[0]: steal_success = True break if steal_success: player_1_score += round_score else: player_2_score += round_score game_end = True print(f'player 1 score: {player_1_score}, player 1 strikes left: {player_1_strikes_left}, player 2 score: {player_2_score}, player 2 strikes left: {player_2_strikes_left}')
内容的提问来源于stack exchange,提问作者mighty_cheetah43
相关产品推荐
相关产品推荐

