品牌:梅雅达编程笔记 · Scratch 转 Python 系列
摘要
本篇是 Scratch 转 Python 系列的第 10 天,我们来做一件超酷的事------亲手打造一个问答闯关游戏!🎮
游戏里用到的核心知识全部来自前面学过的内容:Day 9 的字典 用来存每道题的题目、选项和答案;Day 6 的列表 用来把多道题装进题库;Day 2 的分支判断 用来校验答案对错;Day 3 的循环 用来遍历每一关。最后,我们还会用 random.choice 模拟"AI 随机出题",并给出真正对接 AI 大模型生成题目的伪代码------让你离 AI 编程实战只差一步!🚀
1. 本节课学习目标
- ✅ 掌握用字典存储单道题目(题目+选项+答案),理解字典在游戏数据管理中的作用
- ✅ 掌握用列表 管理多道题目(题库),学会
random.choice随机抽题 - ✅ 综合运用分支判断 和循环,实现答题校验、计分、闯关逻辑
- ✅ AI 应用场景 :理解 AI 题库管理的原理,用
random模拟 AI 出题,掌握对接 AI 大模型动态生成题目的伪代码框架
2. 专业名词通俗释义
| 名词 | 通俗解释 | 生活类比 |
|---|---|---|
| 题库 | 存放很多道题目的"仓库",随时可以取出来用 | 🗄️ 就像一个题卡盒,里面装了好多张题卡 |
| 字典 | 把一道题的题目、选项、答案"打包"在一起的数据结构 | 📇 就像一张题卡,正面写题目,背面写答案,侧面写选项 |
| 列表 | 按顺序存放多个数据的容器,可以存放多个字典(题目) | 📦 就像一个抽屉柜,每个抽屉里放一张题卡 |
| 随机抽题 | 从题库中随机选一道题,让每次答题都不一样 | 🎲 就像蒙着眼睛从题卡盒里随机抽一张卡 |
| 关卡 | 游戏中的"一道门",每过一关题目难度或数量可能增加 | 🚪 就像闯关游戏里的每一层楼,越往上越难 |
| 生命值(HP) | 答错会扣血,血量为零就 Game Over |
❤️ 就像游戏角色的血条,挨打就掉血 |
| AI出题 | 调用 AI 大模型,自动生成新的题目 | 🤖 就像请了一个AI老师,随时帮你出无限的新题 |
3. 分模块双向对照知识点
模块1:用字典存储单道题(题目、选项、答案)
🟡 Scratch 积木逻辑
在 Scratch 中,如果要存一道题的信息,你可能会这样做:
- 建变量
题目内容,设置为 "Python中哪个函数获取用户输入?" - 建列表
选项列表,依次添加 "A. print()"、"B. input()"、"C. len()"、"D. range()" - 建变量
正确答案,设置为 "B"

这样一道题就需要 3 个变量/列表来管理,很零散。
🐍 Python 源码
python
# 【Scratch积木】建立变量 [question] 并设置为字典
# 在 Scratch 中,可以用多个列表分别存题目、选项A、选项B...
# 在 Python 中,用字典把一道题的所有信息"打包"在一起
question = {
"question": "Python中哪个函数获取用户输入?",
"options": ["A. print()", "B. input()", "C. len()", "D. range()"],
"answer": "B"
}
# 【Scratch积木】说出 [question] 的值
print(f"题目:{question['question']}")
print("选项:")
for option in question["options"]:
print(f" {option}")
print(f"正确答案:{question['answer']}")
▶️ 运行结果
题目:Python中哪个函数获取用户输入?
选项:
A. print()
B. input()
C. len()
D. range()
正确答案:B
⚠️ 核心易错说明
- 字典的键要用引号 :
question["answer"]中的"answer"是字符串,不能写成question[answer](除非answer是变量) - 字典用花括号
{}:别和列表的[]搞混了!Day 9 学过,字典用{},列表用[] - 访问字典值用方括号 :
question["question"]获取题目内容,键名要和定义时完全一致
模块2:用列表存储多道题(题库)
🟡 Scratch 积木逻辑
在 Scratch 中,你可以建一个列表 question_bank,但列表里只能存文本 ,无法直接存"一道完整题目"。
所以 Scratch 中需要建多个列表:题目列表、选项A列表、选项B列表......管理起来很麻烦。
而在 Python 中,列表里可以放字典 !每道题就是一个字典,多道题放进列表里,就是一个完整的题库。

🐍 Python 源码
python
# 【Scratch积木】建立列表 [question_bank] 并添加项目
question_bank = []
# 【Scratch积木】将 {题目字典} 加入列表 [question_bank]
question_bank.append({
"question": "Python中哪个函数获取用户输入?",
"options": ["A. print()", "B. input()", "C. len()", "D. range()"],
"answer": "B"
})
# 【Scratch积木】将 {题目字典} 加入列表 [question_bank]
question_bank.append({
"question": "Python中哪个关键字定义函数?",
"options": ["A. func", "B. define", "C. def", "D. function"],
"answer": "C"
})
# 【Scratch积木】将 {题目字典} 加入列表 [question_bank]
question_bank.append({
"question": "Python中列表用什么符号包裹?",
"options": ["A. ()", "B. []", "C. {}", "D. <>"],
"answer": "B"
})
# 【Scratch积木】说出 [question_bank] 的长度
print(f"题库中共有 {len(question_bank)} 道题\n")
# 【Scratch积木】对于 [question_bank] 中的每个项目
for i, q in enumerate(question_bank):
print(f"第{i + 1}题:{q['question']}")
print(f" 答案:{q['answer']}")
print()
▶️ 运行结果
题库中共有 3 道题
第1题:Python中哪个函数获取用户输入?
答案:B
第2题:Python中哪个关键字定义函数?
答案:C
第3题:Python中列表用什么符号包裹?
答案:B
⚠️ 核心易错说明
append()添加的是整个字典 :question_bank.append({...})是把一整道题加到列表末尾,不是只加题目文本enumerate()同时获取序号和内容 :for i, q in enumerate(question_bank)中i是序号(从 0 开始),q是每道题的字典- 列表可以存放字典:这是 Python 比 Scratch 方便的地方------列表里的每个元素可以是任意类型,包括字典!
模块3:随机抽题(random.choice 从题库抽题)
🟡 Scratch 积木逻辑
在 Scratch 中,要从列表中随机取一项,你需要:
- 用
在 1 到 [列表长度] 之间取随机数得到一个随机索引 - 用
列表 [question_bank] 的第 [随机数] 项取出对应题目

在 Python 中,random.choice(列表) 一步搞定!
🐍 Python 源码
python
import random
# 【Scratch积木】建立列表 [question_bank] 并添加项目
question_bank = [
{
"question": "Python中哪个函数获取用户输入?",
"options": ["A. print()", "B. input()", "C. len()", "D. range()"],
"answer": "B"
},
{
"question": "Python中哪个关键字定义函数?",
"options": ["A. func", "B. define", "C. def", "D. function"],
"answer": "C"
},
{
"question": "Python中列表用什么符号包裹?",
"options": ["A. ()", "B. []", "C. {}", "D. <>"],
"answer": "B"
},
{
"question": "Python中字典用什么符号包裹?",
"options": ["A. ()", "B. []", "C. {}", "D. <>"],
"answer": "C"
},
{
"question": "Python中哪个函数获取列表长度?",
"options": ["A. size()", "B. length()", "C. len()", "D. count()"],
"answer": "C"
}
]
# 【Scratch积木】在 1 到 [题库长度] 之间取随机数 → 对应 Python 的 random.choice
# Scratch 中没有直接"随机选列表项"的积木,通常用随机索引实现
picked = random.choice(question_bank)
print("🎲 随机抽到的题目:")
print(f"题目:{picked['question']}")
print("选项:")
for option in picked["options"]:
print(f" {option}")
print(f"答案:{picked['answer']}")
▶️ 运行结果(每次运行结果不同)
🎲 随机抽到的题目:
题目:Python中哪个关键字定义函数?
选项:
A. func
B. define
C. def
D. function
答案:C
⚠️ 核心易错说明
- 别忘了
import random:使用random.choice()之前,必须在文件开头导入random模块 random.choice()直接返回元素本身:不需要再用索引去取,返回的就是字典本身- 每次运行结果不同:这是随机的特点!多次运行可能抽到不同的题目
模块4:答题校验+计分
🟡 Scratch 积木逻辑
- 建变量
score设为 0,建变量hp设为 3 询问 [请输入你的答案] 并等待如果 <[回答] = [answer]> 那么→将 [score] 增加 10→否则→将 [hp] 增加 -1

这就是 Day 2 学过的分支判断 + Day 6 学过的变量操作!
🐍 Python 源码
python
# 【Scratch积木】建立变量 [score] 并设置为 0
score = 0
# 【Scratch积木】建立变量 [hp] 并设置为 3
hp = 3
# 准备一道题
question = {
"question": "Python中哪个函数获取用户输入?",
"options": ["A. print()", "B. input()", "C. len()", "D. range()"],
"answer": "B"
}
# 【Scratch积木】说出 [题目]
print(f"题目:{question['question']}")
print("选项:")
for option in question["options"]:
print(f" {option}")
# 【Scratch积木】询问 [请输入你的答案] 并等待
user_answer = input("\n请输入你的答案(A/B/C/D):").strip().upper()
# 【Scratch积木】如果 <[user_answer] = [answer]> 那么
if user_answer == question["answer"]:
# 【Scratch积木】将 [score] 增加 10
score += 10
print(f"✅ 回答正确!得分 +10,当前总分:{score}")
else:
# 【Scratch积木】将 [hp] 增加 -1
hp -= 1
print(f"❌ 回答错误!正确答案是 {question['answer']},剩余生命值:{hp}")
print(f"\n📊 当前状态 → 分数:{score},生命值:{hp}")
▶️ 运行结果
题目:Python中哪个函数获取用户输入?
选项:
A. print()
B. input()
C. len()
D. range()
请输入你的答案(A/B/C/D):B
✅ 回答正确!得分 +10,当前总分:10
📊 当前状态 → 分数:10,生命值:3
⚠️ 核心易错说明
input()返回的是字符串 :用户输入的B是字符串"B",和question["answer"]的"B"类型一致才能比较.strip().upper()很重要 :用户可能输入" b "(带空格和小写),.strip()去空格,.upper()转大写,保证比对正确==不是=:==是比较是否相等,=是赋值!Day 2 的经典易错点
4. 综合实战项目:问答闯关完整游戏
把前面 4 个模块串起来,我们就得到了一个完整的问答闯关游戏!🎉
游戏设计:
- 📋 题库 7 道题(字典存储 + 列表管理)
- 🚪 共 3 关,每关 2 道题(随机抽取,不重复)
- ✅ 答对 +10 分,❌ 答错 -1 生命值(初始 3 血)
- 🏆 通关后根据分数给出评价
- 🤖 附带 AI 出题伪代码,展示如何真正对接 AI
python
import random
# ==================== 题库初始化 ====================
# 【Scratch积木】建立列表 [question_bank] 并添加项目
question_bank = []
# 【Scratch积木】将 {题目字典} 加入列表 [question_bank]
question_bank.append({
"question": "Python中哪个函数获取用户输入?",
"options": ["A. print()", "B. input()", "C. len()", "D. range()"],
"answer": "B"
})
# 【Scratch积木】将 {题目字典} 加入列表 [question_bank]
question_bank.append({
"question": "Python中哪个关键字定义函数?",
"options": ["A. func", "B. define", "C. def", "D. function"],
"answer": "C"
})
# 【Scratch积木】将 {题目字典} 加入列表 [question_bank]
question_bank.append({
"question": "Python中列表用什么符号包裹?",
"options": ["A. ()", "B. []", "C. {}", "D. <>"],
"answer": "B"
})
# 【Scratch积木】将 {题目字典} 加入列表 [question_bank]
question_bank.append({
"question": "Python中字典用什么符号包裹?",
"options": ["A. ()", "B. []", "C. {}", "D. <>"],
"answer": "C"
})
# 【Scratch积木】将 {题目字典} 加入列表 [question_bank]
question_bank.append({
"question": "Python中哪个函数获取列表长度?",
"options": ["A. size()", "B. length()", "C. len()", "D. count()"],
"answer": "C"
})
# 【Scratch积木】将 {题目字典} 加入列表 [question_bank]
question_bank.append({
"question": "Python中哪个模块可以生成随机数?",
"options": ["A. math", "B. random", "C. time", "D. sys"],
"answer": "B"
})
# 【Scratch积木】将 {题目字典} 加入列表 [question_bank]
question_bank.append({
"question": "Python中用什么符号给变量赋值?",
"options": ["A. ==", "B. =>", "C. =", "D. :="],
"answer": "C"
})
# ==================== AI题库管理(伪代码展示) ====================
# 🔌 AI出题伪代码(本游戏使用本地题库模拟,真正对接AI的伪代码如下):
#
# import requests
#
# def ai_generate_question(topic):
# """调用AI大模型自动生成一道题目"""
# response = requests.post(
# "https://api.ai-model.com/v1/chat",
# headers={"Authorization": "Bearer YOUR_API_KEY"},
# json={
# "messages": [
# {"role": "system", "content": "你是一个Python编程出题老师"},
# {"role": "user", "content": f"请出一道关于{topic}的Python选择题,包含4个选项和正确答案"}
# ]
# }
# )
# result = response.json()
# # AI返回的题目解析为字典格式
# return {
# "question": result["question"],
# "options": result["options"],
# "answer": result["answer"]
# }
#
# # 调用AI生成题目并加入题库
# new_question = ai_generate_question("循环")
# question_bank.append(new_question)
#
# 💡 实际项目中,可以调用AI接口动态生成无限题目,实现真正的"AI出题"!
# ==================== 游戏初始化 ====================
# 【Scratch积木】建立变量 [score] 并设置为 0
score = 0
# 【Scratch积木】建立变量 [hp] 并设置为 3
hp = 3
# 【Scratch积木】建立变量 [level] 并设置为 1
level = 1
# 每关需要回答的题目数
questions_per_level = 2
# 总关卡数
total_levels = 3
# 记录已用过的题目索引,避免重复
used_indices = []
print("🏰 欢迎来到「Python问答闯关」!")
print(f"📋 题库已加载 {len(question_bank)} 道题")
print(f"❤️ 初始生命值:{hp} | 📊 初始分数:{score}")
print(f"🏆 共 {total_levels} 关,每关 {questions_per_level} 道题")
print("✅ 答对 +10 分 | ❌ 答错 -1 生命值")
print("-" * 60)
# ==================== 闯关主循环 ====================
# 【Scratch积木】重复执行直到 <[level] > [total_levels]> 或 <[hp] <= 0>
while level <= total_levels and hp > 0:
print(f"\n🚪 ===== 第 {level} 关 =====")
print(f"❤️ 生命值:{hp} | 📊 分数:{score}")
# 【Scratch积木】重复执行 [questions_per_level] 次
for q_num in range(questions_per_level):
if hp <= 0:
break
# 从未用过的题目中随机抽题
available_indices = [i for i in range(len(question_bank)) if i not in used_indices]
if not available_indices:
# 题目用完了,重置已用列表
used_indices = []
available_indices = list(range(len(question_bank)))
# 【Scratch积木】在 1 到 [题库长度] 之间取随机数
picked_index = random.choice(available_indices)
used_indices.append(picked_index)
current_question = question_bank[picked_index]
# 【Scratch积木】说出 [题目]
print(f"\n📝 第 {level}-{q_num + 1} 题:")
print(f" {current_question['question']}")
print(" 选项:")
for option in current_question["options"]:
print(f" {option}")
# 【Scratch积木】询问 [请输入你的答案] 并等待
user_answer = input(" 你的答案(A/B/C/D):").strip().upper()
# 【Scratch积木】如果 <[user_answer] = [answer]> 那么
if user_answer == current_question["answer"]:
# 【Scratch积木】将 [score] 增加 10
score += 10
print(f" ✅ 太棒了!答对了!+10分 📊 当前分数:{score}")
# 【Scratch积木】否则
else:
# 【Scratch积木】将 [hp] 增加 -1
hp -= 1
print(f" ❌ 答错了!正确答案是 {current_question['answer']}")
print(f" ❤️ 生命值 -1,剩余:{hp}")
if hp <= 0:
print("\n💀 生命值耗尽!游戏结束...")
break
# 关卡通过判断
if hp > 0:
print(f"\n🎉 恭喜通过第 {level} 关!")
if level < total_levels:
print(f" 下一关:第 {level + 1} 关,继续加油!")
# 【Scratch积木】将 [level] 增加 1
level += 1
# ==================== 通关评价 ====================
print("\n" + "=" * 60)
print("📊 ===== 游戏结束 =====")
print(f" 📊 最终分数:{score}")
print(f" ❤️ 剩余生命:{hp}")
# 【Scratch积木】如果 <[score] >= 50> 那么
if score >= 50:
print(" 🏆 评价:完美通关!你是Python问答大师!")
# 【Scratch积木】如果 <[score] >= 30> 那么
elif score >= 30:
print(" 🥈 评价:表现不错!再练练就更厉害了!")
# 【Scratch积木】如果 <[score] >= 10> 那么
elif score >= 10:
print(" 🥉 评价:及格了!继续加油学习吧~")
# 【Scratch积木】否则
else:
print(" 💪 评价:别灰心!多复习前面的知识,下次一定行!")
print("=" * 60)
🎮 游戏运行示例
🏰 欢迎来到「Python问答闯关」!
📋 题库已加载 7 道题
❤️ 初始生命值:3 | 📊 初始分数:0
🏆 共 3 关,每关 2 道题
✅ 答对 +10 分 | ❌ 答错 -1 生命值
------------------------------------------------------------
🚪 ===== 第 1 关 =====
❤️ 生命值:3 | 📊 分数:0
📝 第 1-1 题:
Python中哪个函数获取用户输入?
选项:
A. print()
B. input()
C. len()
D. range()
你的答案(A/B/C/D):B
✅ 太棒了!答对了!+10分 📊 当前分数:10
📝 第 1-2 题:
Python中列表用什么符号包裹?
选项:
A. ()
B. []
C. {}
D. <>
你的答案(A/B/C/D):B
✅ 太棒了!答对了!+10分 📊 当前分数:20
🎉 恭喜通过第 1 关!
下一关:第 2 关,继续加油!
...(后续关卡类似)
📊 ===== 游戏结束 =====
📊 最终分数:60
❤️ 剩余生命:3
🏆 评价:完美通关!你是Python问答大师!
🤖 AI 出题说明
上面的游戏使用本地题库 + random.choice 模拟 AI 随机出题的效果。
在真正的 AI 项目中,你可以调用 AI 大模型的 API,让它动态生成新的题目:
用户输入主题 → AI 大模型生成题目 → 解析为字典格式 → 加入题库 → 随机出题
伪代码已在代码注释中展示(ai_generate_question 函数),实际项目只需:
- 替换为真实的 AI API 地址和密钥
- 解析 AI 返回的 JSON 数据为字典格式
- 把生成的新题目
append到题库中
这样就能实现无限题库,让每次游戏都有新鲜感!🌟
5. 高频易错点总结
-
字典和列表的符号搞混 🔄
- 字典用
{}(花括号),列表用[](方括号) - 记忆口诀:花括号包字典,方括号包列表
- 字典用
-
忘记
import random📦- 使用
random.choice()、random.shuffle()之前,必须在文件开头写import random - 否则会报
NameError: name 'random' is not defined
- 使用
-
input()返回的是字符串 🔤input()永远返回字符串类型,即使用户输入数字- 比较答案时确保两边都是字符串:
user_answer == question["answer"] - 记得用
.strip().upper()处理用户输入,避免空格和大小写问题
-
==和=搞混 ❗==是比较是否相等(if 判断用)=是赋值(给变量设值用)- Day 2 就讲过的经典坑,千万别再踩!
-
while循环条件设置不当 🔄while level <= total_levels and hp > 0两个条件缺一不可- 只判断关卡不判断血量 → 血量为零还在答题
- 只判断血量不判断关卡 → 永远停不下来
6. 💡 学习提示
💡 学习提示
为鼓励大家动手练习、吃透编程逻辑,本篇不提供Scratch成品源码,请对照截图亲手搭建积木完成复刻!
配套Python代码可直接复制运行学习。
7. 往期历史笔记
-
编程启蒙|Scratch 转 Python 系列第 3 天:循环重复积木双向对照(AI 批量循环处理,已收录 AI Agent 技术社区)
-
编程启蒙|Scratch 转 Python 系列第 5 天:自定义积木 / 函数双向对照(AI 工具封装、重复指令简化实战)
-
编程启蒙|Scratch 转 Python 系列第 6 天:列表、数组积木双向对照(AI 底层语法 / AI 批量数据处理实战)
-
编程启蒙|Scratch 转 Python 系列第 7 天:猜数字大挑战·升级版实战(AI 出题 + 二分查找最优解 + 完整命令行游戏)
📚 知识串联地图
本篇是综合实战篇,串联了前面多天的核心知识:
- 🔗 Day 9 字典 → 每道题用字典存储(题目、选项、答案)
- 🔗 Day 6 列表 → 题库用列表存储多道题
- 🔗 Day 2 分支判断 → 答案校验(if-else 判断对错)
- 🔗 Day 3 循环 → 遍历题目、闯关循环(while/for)
- 🔗 Day 7 函数 → 代码模块化封装
把这些知识"拼"在一起,就做出了一个完整的问答闯关游戏!这就是编程的魅力------学过的知识不会浪费,它们会组合成越来越强大的作品。✨
9. 下一章预告
Day 11:文件读写积木双向对照------AI训练数据存取实战
本篇的题库是"写死"在代码里的,每次运行都是同样的题目。那如果想让玩家自己出的题保存下来,下次还能用呢?🤔
Day 11 我们将学习 Python 的文件读写:
- 📄 如何把题库保存到文件中
- 📖 如何从文件读取题库数据
- 🤖 AI 训练数据是怎么存储和读取的
- 🎮 让问答游戏的题库持久化,关掉程序也不丢失
Scratch 中有"读写文件"积木,Python 中有 open() 函数,两者怎么对照?Day 11 见!👋
10. 原创声明
本文为梅雅达编程笔记原创内容,Scratch 转 Python 系列持续更新中。
🚫 未经授权,禁止搬运、转载、抄袭或用于任何商业用途。
如需引用请注明出处:梅雅达编程笔记 · Scratch 转 Python 系列
© 梅雅达编程笔记 · All Rights Reserved
跟着梅雅达,编程不迷路!我们 Day 11 见! 🚀