如何实现支持随机选项且按答案类型计分的问答游戏
问答游戏计分逻辑优化方案
我是编程新手,想开发一款问答游戏,要求根据答案类型而非显示位置计算得分——哪怕打乱选项顺序,也能识别correct_choice、good_choice等类型并对应计分。
目前我通过索引判断的方式实现计分,这种方式要求选项必须固定顺序,无法支持随机排序。
当前实现代码(quiz_brain.py中QuizBrain类的check_answer方法)
def check_answer(self, user_answer): """Check the answer from the user and assign it the appropriate score""" points_awarded = 0 if user_answer == self.current_question.choices[0]: points_awarded = 4 elif user_answer == self.current_question.choices[1]: points_awarded = 3 elif user_answer == self.current_question.choices[2]: points_awarded = 2 elif user_answer == self.current_question.choices[3]: points_awarded = 1 self.score += points_awarded return points_awarded
问题数据结构
question_data = [ { "question": "Kada ugledaš djevojku, kako ćeš joj prići??", "choices": { "correct_choice": "Cititat ćeš joj omiljene stihove Zoke Bosanca.", "good_choice": "Mala, dobro izgledaš. Ajmo na sok.", "decent_choice": "Čija si ti, mala?", "fair_choice": "Želiš li možda da zajedno popijemo neko pićence?", } }, { "question": "Gdje ćeš izvesti djevojku na prvi spoj?", "choices": { "correct_choice": "U kvartovsku ćevabdžinicu, jest ću ćevape s lukom, kako i dolikuje.", "good_choice": "U ZOO, da posjeti svoju familiju.", "decent_choice": "Prošetat ćemo Maksimirom, možda se nešto i dogodi.", "fair_choice": "Izvest ću ju na kavu.", } }, # Add more questions here ]
优化方案
1. 定义得分映射表
先创建一个字典,把选项类型和对应的分数绑定,方便后续快速查找:
# 可放在QuizBrain类内作为类属性,或单独定义 SCORE_MAP = { "correct_choice": 4, "good_choice": 3, "decent_choice": 2, "fair_choice": 1 }
2. 修改Question类(保留类型与文本的映射)
让每个Question实例同时保存「类型-文本」的映射关系,以及随机排序的选项列表用于显示:
import random class Question: def __init__(self, question_dict): self.text = question_dict["question"] # 保存选项类型到文本的映射,用于后续匹配 self.choice_type_map = question_dict["choices"] # 提取所有选项文本,打乱顺序后作为显示用的选项列表 self.choices = list(self.choice_type_map.values()) random.shuffle(self.choices)
3. 重写check_answer方法
不再依赖选项索引,而是通过用户答案的文本反向查找对应的类型,再从得分映射表中获取分数:
def check_answer(self, user_answer): """检查用户答案并分配对应分数""" points_awarded = 0 # 遍历类型-文本映射,找到用户答案对应的类型 for choice_type, choice_text in self.current_question.choice_type_map.items(): if choice_text == user_answer: points_awarded = SCORE_MAP.get(choice_type, 0) break self.score += points_awarded return points_awarded
4. 效果验证
修改后,不管选项列表怎么随机打乱,只要用户选择的文本属于某个类型,就能正确匹配到对应的分数,完全摆脱了选项顺序的限制。
内容的提问来源于stack exchange,提问作者KooMar
相关产品推荐
相关产品推荐

