终端小游戏
1、根据题库内容出单选题
2、提示作答,并给结果
思路
列表 保存题目
字典 保存题干,选项和答案
遍历 题目列表用于展示
input函数 等待用户输入
判断输入,并继续提示
计算正确率并打印
题库
{"name": "样例题库","question_list": [{"question": "生命、宇宙以及一切事物的终极答案是?","choices": ["42","43","44","45"],"answer": 0},{"question": "机器人 Marvin 今天高兴吗?","choices": ["没有理由不高兴","他今天一定很忧郁","取决于他接到的任务","一会儿高兴,一会儿不高兴"],"answer": 1}]
}
import json
import os
import sysdef read_question_file(filename):if not os.path.isfile(filename):return Nonewith open(filename, 'r', encoding='utf-8') as f:try:return json.load(f)except ValueError as e:print(e)print('加载题库错误。')return Nonedef to_letter(n):return chr(ord('A') + n)def to_answer(letter, c_len):letter = letter.upper()if len(letter) == 1 and 'A' <= letter <= 'Z':digit = ord(letter) - ord('A')if 0 <= digit < c_len:return digit, Trueelse:return None, Falseelse:return None, Falsedef ask_question(question, i):print('\n第 {0} 题:{1}'.format(i+1, question['question']))choices = question['choices']c_len = len(choices)for j in range(c_len):print('{0}:{1}'.format(to_letter(j), choices[j]))user_input = input('请输入答案:')user_answer, ok = to_answer(user_input, c_len)while not ok:user_input = input('输入错误,请输入选项前的单个字母做为答案:')user_answer, ok = to_answer(user_input, c_len)return user_answer == question['answer']def main(argv):if len(argv) != 2:print('请指定题库 JSON 文件')sys.exit(-1)filename = argv[1]# 读取题库列表,每道题目为一个字典question_json = read_question_file(filename)if not question_json:print('题库文件读取失败,请检查:{0}'.format(filename))sys.exit(-1)name = question_json['name']question_list = question_json['question_list']print('答题开始,当前题库为:{0}'.format(name))# 遍历题库列表q_len = len(question_list)correct_count = 0for i, q in enumerate(question_list):# 展示题目、提示用户输入、判断答案if ask_question(q, i):correct_count += 1# 计算并展示正确率print('\n答题完成,共 {0} 道题目,你答对了 {1} 题。正确率 {2:.2f}%。'.format(q_len, correct_count, correct_count/q_len*100))if __name__ == '__main__':main(sys.argv)