第20课:阶段项目-智能问答机器人
🎯 本课目标
- 综合运用前19课的所有编程知识
- 制作能够理解和回答问题的智能机器人
- 实现自然语言交互和对话功能
- 添加记忆和学习能力
- 制作完整有趣的智能对话系统
🤖 项目引入:成为机器人"创造者"
想象一下:你创造了一个智能机器人助手,它能:
- 🧠 理解你问的各种问题
- 💬 和你进行自然对话
- 📚 回答数学、科学、生活问题
- 🎮 陪你玩游戏、讲故事
- 📅 帮你记录事情、安排计划
今天,让我们一起成为机器人创造者,制作属于自己的智能问答机器人!
🎨 第一部分:机器人基础框架
1.1 机器人核心类
# 智能问答机器人基础框架
print("🤖 欢迎来到智能问答机器人项目")
print("=" * 60)
import datetime
import random
import json
import os
class SmartBot:
"""智能问答机器人类"""
def __init__(self, name="小智"):
"""初始化机器人"""
self.name = name
self.creator = "编程小能手"
self.version = "1.0"
self.memory_file = "bot_memory.json"
# 机器人状态
self.mood = "开心" # 心情
self.energy = 100 # 能量
self.experience = 0 # 经验值
# 对话历史
self.conversation_history = []
# 知识库
self.knowledge_base = self.load_knowledge()
# 用户信息
self.user_info = {
"name": "朋友",
"age": None,
"hobby": None,
"last_visit": None
}
print(f"✨ 机器人 {self.name} 已启动!")
print(f"📅 时间:{datetime.datetime.now().strftime('%Y年%m月%d日 %H:%M')}")
def load_knowledge(self):
"""加载知识库"""
base_knowledge = {
"greetings": {
"你好": ["你好!", "嗨!", "你好呀!", "很高兴见到你!"],
"早上好": ["早上好!新的一天开始啦!", "早安!吃早餐了吗?"],
"晚上好": ["晚上好!今天过得怎么样?", "晚安前记得休息哦!"],
"再见": ["再见!下次再聊!", "拜拜!记得想我哦!", "期待下次见面!"]
},
"personal": {
"你叫什么名字": [f"我叫{self.name},是你的智能助手!", f"我是{self.name},很高兴为你服务!"],
"你多大了": ["我是人工智能,年龄对我来说没有意义!", "我永远年轻!"],
"谁创造了你": [f"我是由{self.creator}创造的!", f"我的创造者是{self.creator},他很厉害吧!"],
"你会做什么": ["我会回答问题、聊天、玩游戏、讲故事等等!", "我有很多功能,试试问我问题吧!"]
},
"math": {
"加法": "我可以帮你计算加法,比如:5+3=8",
"减法": "我可以帮你计算减法,比如:10-4=6",
"乘法": "我可以帮你计算乘法,比如:6×7=42",
"除法": "我可以帮你计算除法,比如:20÷5=4"
},
"jokes": [
"为什么数学书总是很伤心?因为它有太多问题!",
"为什么电脑不会感冒?因为它有Windows(窗户)!",
"为什么自行车不会自己站着?因为它两轮(two tired)了!",
"为什么海星不会玩捉迷藏?因为它总是被看到!"
],
"facts": [
"蜜蜂的翅膀每秒能拍动200次!",
"章鱼有三个心脏!",
"香蕉其实是浆果的一种!",
"人的眼睛可以分辨约1000万种不同的颜色!"
]
}
# 尝试从文件加载记忆
try:
if os.path.exists(self.memory_file):
with open(self.memory_file, 'r', encoding='utf-8') as f:
saved_memory = json.load(f)
# 合并记忆
if "learned_facts" in saved_memory:
base_knowledge["learned_facts"] = saved_memory["learned_facts"]
if "user_memory" in saved_memory:
self.user_info.update(saved_memory["user_memory"])
except:
pass
return base_knowledge
def save_memory(self):
"""保存记忆到文件"""
memory_data = {
"learned_facts": self.knowledge_base.get("learned_facts", []),
"user_memory": self.user_info,
"last_update": datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
}
try:
with open(self.memory_file, 'w', encoding='utf-8') as f:
json.dump(memory_data, f, ensure_ascii=False, indent=2)
return True
except:
return False
def process_input(self, user_input):
"""处理用户输入"""
# 记录对话
self.conversation_history.append({
"time": datetime.datetime.now().strftime("%H:%M:%S"),
"user": user_input
})
# 限制历史记录长度
if len(self.conversation_history) > 50:
self.conversation_history = self.conversation_history[-50:]
# 更新机器人状态
self.energy = max(0, self.energy - 1)
if self.energy < 30:
self.mood = "疲惫"
elif self.energy < 60:
self.mood = "一般"
else:
self.mood = "开心"
# 分析用户输入
response = self.analyze_input(user_input)
# 记录机器人的回应
self.conversation_history[-1]["bot"] = response
return response
def analyze_input(self, user_input):
"""分析用户输入并生成回应"""
input_lower = user_input.lower()
# 检查是否是问候
for greeting in self.knowledge_base["greetings"]:
if greeting in input_lower:
return random.choice(self.knowledge_base["greetings"][greeting])
# 检查个人信息问题
for question in self.knowledge_base["personal"]:
if question in input_lower:
return random.choice(self.knowledge_base["personal"][question])
# 检查是否要听笑话
if any(word in input_lower for word in ["笑话", "讲笑话", "搞笑"]):
return random.choice(self.knowledge_base["jokes"])
# 检查是否要听事实
if any(word in input_lower for word in ["事实", "冷知识", "你知道吗"]):
return random.choice(self.knowledge_base["facts"])
# 检查数学计算
if self.handle_math(input_lower):
return self.handle_math(input_lower)
# 检查是否在教机器人
if "记住" in input_lower or "知道" in input_lower and "吗?" in user_input:
return self.learn_new_fact(user_input)
# 检查用户信息
if self.handle_user_info(input_lower, user_input):
return self.handle_user_info(input_lower, user_input)
# 检查是否要玩猜数字游戏
if "猜数字" in input_lower or "玩游戏" in input_lower:
return self.play_guessing_game()
# 检查是否要听故事
if "故事" in input_lower and "讲" in input_lower:
return self.tell_story()
# 检查是否要计算单位转换
if any(word in input_lower for word in ["转换", "等于多少", "换算"]):
return self.handle_unit_conversion(user_input)
# 默认回应
return self.generate_default_response()
def handle_math(self, user_input):
"""处理数学计算"""
# 简单的数学表达式识别
if "+" in user_input:
parts = user_input.split("+")
if len(parts) == 2:
try:
num1 = float(parts[0].strip())
num2 = float(parts[1].strip())
result = num1 + num2
return f"{num1} + {num2} = {result}"
except:
pass
elif "-" in user_input:
parts = user_input.split("-")
if len(parts) == 2:
try:
num1 = float(parts[0].strip())
num2 = float(parts[1].strip())
result = num1 - num2
return f"{num1} - {num2} = {result}"
except:
pass
elif "×" in user_input or "*" in user_input or "x" in user_input.lower():
if "×" in user_input:
parts = user_input.split("×")
elif "*" in user_input:
parts = user_input.split("*")
else:
parts = user_input.split("x")
if len(parts) == 2:
try:
num1 = float(parts[0].strip())
num2 = float(parts[1].strip())
result = num1 * num2
return f"{num1} × {num2} = {result}"
except:
pass
elif "÷" in user_input or "/" in user_input:
if "÷" in user_input:
parts = user_input.split("÷")
else:
parts = user_input.split("/")
if len(parts) == 2:
try:
num1 = float(parts[0].strip())
num2 = float(parts[1].strip())
if num2 == 0:
return "除数不能为0哦!"
result = num1 / num2
return f"{num1} ÷ {num2} = {result:.2f}"
except:
pass
return None
def handle_user_info(self, input_lower, original_input):
"""处理用户个人信息"""
# 询问用户姓名
if "我叫" in original_input or "我的名字是" in original_input:
# 提取姓名
if "我叫" in original_input:
name_start = original_input.find("我叫") + 2
name = original_input[name_start:].strip()
elif "我的名字是" in original_input:
name_start = original_input.find("我的名字是") + 5
name = original_input[name_start:].strip()
if name and len(name) < 20: # 防止异常输入
self.user_info["name"] = name
self.user_info["last_visit"] = datetime.datetime.now().strftime("%Y-%m-%d %H:%M")
self.save_memory()
return f"你好,{name}!很高兴认识你!我会记住你的名字的。"
# 询问年龄
elif "我今年" in original_input or "我年龄" in original_input or "我岁" in original_input:
# 提取年龄
for word in original_input.split():
if word.isdigit() and 1 <= int(word) <= 120:
self.user_info["age"] = int(word)
self.save_memory()
return f"你今年{word}岁啊!真不错!"
# 询问爱好
elif "我喜欢" in original_input or "我的爱好" in original_input:
if "我喜欢" in original_input:
hobby_start = original_input.find("我喜欢") + 3
else:
hobby_start = original_input.find("我的爱好") + 4
hobby = original_input[hobby_start:].strip()
if hobby and len(hobby) < 50:
self.user_info["hobby"] = hobby
self.save_memory()
return f"{hobby}是个很好的爱好!我也喜欢!"
return None
def learn_new_fact(self, user_input):
"""学习新的事实"""
if "记住" in user_input:
# 提取要记住的内容
fact_start = user_input.find("记住") + 2
fact = user_input[fact_start:].strip()
if fact and len(fact) < 100:
if "learned_facts" not in self.knowledge_base:
self.knowledge_base["learned_facts"] = []
self.knowledge_base["learned_facts"].append(fact)
self.save_memory()
return f"好的,我记住了:{fact}"
elif "知道" in user_input and "吗?" in user_input:
# 提取问题
question = user_input.replace("你知道吗?", "").replace("你知道", "").strip()
if "learned_facts" in self.knowledge_base and self.knowledge_base["learned_facts"]:
# 从已学的事实中找相关答案
for fact in self.knowledge_base["learned_facts"]:
if any(keyword in fact for keyword in question.split()[:3]):
return f"我知道!{fact}"
return "抱歉,我还不了解这个。你可以教我,说'记住 [内容]'"
return None
def generate_default_response(self):
"""生成默认回应"""
default_responses = [
"这个问题很有趣,让我想想...",
"我不太确定,你能换个方式问吗?",
"这个我还需要学习,你可以教我吗?",
"让我查查我的知识库...",
"你的问题很有深度!",
"这个问题我需要更多时间思考。"
]
# 添加个性化回应
if self.user_info["name"] and self.user_info["name"] != "朋友":
personalized = [
f"{self.user_info['name']},我不太明白你的意思。",
f"{self.user_info['name']},你能再说清楚一点吗?"
]
default_responses.extend(personalized)
return random.choice(default_responses)
def show_status(self):
"""显示机器人状态"""
print(f"\n🤖 机器人状态:")
print(f" 名称:{self.name}")
print(f" 心情:{self.mood}")
print(f" 能量:{self.energy}/100")
print(f" 经验值:{self.experience}")
if self.user_info["name"] and self.user_info["name"] != "朋友":
print(f"\n👤 用户信息:")
print(f" 姓名:{self.user_info['name']}")
if self.user_info["age"]:
print(f" 年龄:{self.user_info['age']}岁")
if self.user_info["hobby"]:
print(f" 爱好:{self.user_info['hobby']}")
if self.user_info["last_visit"]:
print(f" 上次访问:{self.user_info['last_visit']}")
# 测试机器人
print("\n🔧 正在初始化智能机器人...")
bot = SmartBot("小智")
print("✅ 机器人初始化完成!")
# 简单测试
test_inputs = ["你好", "你叫什么名字", "1+1", "讲个笑话", "再见"]
print("\n🧪 简单功能测试:")
for test in test_inputs:
print(f"\n你:{test}")
response = bot.process_input(test)
print(f"{bot.name}:{response}")
input("\n按回车键开始正式对话...")
💬 第二部分:对话系统增强
2.1 增强对话功能
# 增强对话功能
print("💬 增强对话功能")
print("=" * 60)
class EnhancedBot(SmartBot):
"""增强版智能机器人"""
def __init__(self, name="小智增强版"):
super().__init__(name)
self.version = "2.0"
# 增强知识库
self.knowledge_base["education"] = {
"数学": [
"数学是研究数量、结构、空间和变化的科学。",
"加法是最基本的数学运算之一。",
"乘法是加法的快捷方式。"
],
"科学": [
"水在0°C结冰,在100°C沸腾。",
"植物通过光合作用制造食物。",
"地球围绕太阳转一圈需要365天。"
],
"语文": [
"汉字是世界上最古老的文字之一。",
"古诗是中华文化的瑰宝。",
"标点符号让文章更易读。"
]
}
# 游戏状态
self.game_active = False
self.game_data = {}
# 增强情感系统
self.mood_levels = {
"非常开心": 90,
"开心": 70,
"一般": 50,
"疲惫": 30,
"需要休息": 10
}
print(f"✨ 增强版机器人 {self.name} 已启动!")
def analyze_input(self, user_input):
"""增强版输入分析"""
input_lower = user_input.lower()
# 首先检查游戏状态
if self.game_active:
return self.handle_game_input(user_input)
# 调用父类的分析方法
response = super().analyze_input(user_input)
# 如果不是默认回应,直接返回
if not (response.startswith("这个问题") or response.startswith("我不太")):
return response
# 增强分析
# 检查是否在问学科问题
for subject in self.knowledge_base["education"]:
if subject in user_input:
facts = self.knowledge_base["education"][subject]
return f"关于{subject},我知道:{random.choice(facts)}"
# 检查时间相关
if any(word in input_lower for word in ["时间", "几点", "日期"]):
now = datetime.datetime.now()
return f"现在是{now.strftime('%Y年%m月%d日 %H:%M:%S')}"
# 检查天气相关(模拟)
if "天气" in input_lower:
weathers = ["晴天", "多云", "小雨", "晴朗", "阴天"]
temps = random.randint(15, 30)
return f"今天天气{random.choice(weathers)},气温大约{temps}°C"
# 检查计算相关
if "计算" in input_lower:
return "我可以帮你计算加减乘除,比如:5+3,10-4,6×7,20÷5"
# 检查是否要机器人唱歌
if "唱歌" in input_lower or "唱首歌" in input_lower:
songs = [
"🎵 一闪一闪亮晶晶,满天都是小星星...",
"🎶 两只老虎,两只老虎,跑得快...",
"🎼 小星星,小星星,你的眼睛亮晶晶...",
"🎤 我是小机器人,聪明又可爱..."
]
return random.choice(songs)
return response
def play_guessing_game(self):
"""玩猜数字游戏"""
self.game_active = True
self.game_data = {
"game": "guessing",
"number": random.randint(1, 100),
"attempts": 0,
"max_attempts": 10
}
return "🎮 我们来玩猜数字游戏吧!我想了一个1-100之间的数字,你有10次机会猜出来!"
def handle_game_input(self, user_input):
"""处理游戏输入"""
if self.game_data["game"] == "guessing":
return self.handle_guessing_game(user_input)
return "游戏状态异常,让我们重新开始吧。"
def handle_guessing_game(self, user_input):
"""处理猜数字游戏"""
if not self.game_active:
return "游戏还没有开始,说'猜数字'来开始游戏吧!"
# 检查是否要退出游戏
if any(word in user_input.lower() for word in ["退出", "结束", "不玩了"]):
self.game_active = False
number = self.game_data["number"]
return f"游戏结束!我想的数字是{number}。下次再来玩吧!"
# 尝试解析数字
try:
guess = int(user_input)
except ValueError:
return "请输入一个数字!"
# 增加尝试次数
self.game_data["attempts"] += 1
attempts = self.game_data["attempts"]
number = self.game_data["number"]
max_attempts = self.game_data["max_attempts"]
# 检查猜测
if guess < 1 or guess > 100:
return "请输入1-100之间的数字!"
if guess < number:
hint = "太小了!"
elif guess > number:
hint = "太大了!"
else:
self.game_active = False
self.experience += 10
return f"🎉 恭喜你!猜对了!数字就是{number}!你用了{attempts}次猜中。获得10经验值!"
# 检查是否用完尝试次数
remaining = max_attempts - attempts
if remaining <= 0:
self.game_active = False
return f"游戏结束!你想的数字是{number}。下次加油!"
# 给出提示
if attempts >= max_attempts - 2:
hint += f"只剩{remaining}次机会了!加油!"
else:
hint += f"还有{remaining}次机会。"
# 额外提示
if attempts == 3:
if number % 2 == 0:
hint += " 提示:这个数是偶数。"
else:
hint += " 提示:这个数是奇数。"
elif attempts == 6:
if number > 50:
hint += " 提示:这个数大于50。"
else:
hint += " 提示:这个数小于等于50。"
return hint
def tell_story(self):
"""讲故事"""
stories = [
"""
📖 故事1:小兔子的冒险
从前有一只勇敢的小兔子,它决定去森林深处探险。
路上遇到了会说话的大树、唱歌的小鸟和爱跳舞的小溪。
最后,小兔子找到了一个装满胡萝卜的宝箱,和大家分享了它的收获。
""",
"""
📖 故事2:星星的约定
每天晚上,最亮的那颗星星都会给小星星们讲故事。
有一天,一颗小星星迷路了,其他星星一起帮它找到了回家的路。
从此,每颗星星都知道,朋友就是最亮的灯塔。
""",
"""
📖 故事3:神奇的画笔
小明得到了一支神奇的画笔,画什么就会变成真的。
他画了会飞的房子、会说话的猫和能结糖果的树。
但最重要的是,他画了很多朋友,让世界充满了欢乐。
"""
]
return random.choice(stories)
def handle_unit_conversion(self, user_input):
"""处理单位转换"""
# 简单的单位转换识别
input_lower = user_input.lower()
# 长度转换
if "厘米" in user_input and ("米" in user_input or "cm" in input_lower and "m" in input_lower):
try:
# 提取数字
import re
numbers = re.findall(r"[-+]?\d*\.\d+|\d+", user_input)
if numbers:
value = float(numbers[0])
if "厘米" in user_input and "米" in user_input:
if "厘米转米" in user_input or "cm" in input_lower and "m" in input_lower:
result = value / 100
return f"{value}厘米 = {result}米"
else:
result = value * 100
return f"{value}米 = {result}厘米"
except:
pass
# 温度转换
elif "摄氏度" in user_input and "华氏度" in user_input:
try:
import re
numbers = re.findall(r"[-+]?\d*\.\d+|\d+", user_input)
if numbers:
value = float(numbers[0])
if "摄氏度转华氏度" in user_input or "c" in input_lower and "f" in input_lower:
result = value * 9/5 + 32
return f"{value}°C = {result:.1f}°F"
else:
result = (value - 32) * 5/9
return f"{value}°F = {result:.1f}°C"
except:
pass
# 重量转换
elif "千克" in user_input and "斤" in user_input:
try:
import re
numbers = re.findall(r"[-+]?\d*\.\d+|\d+", user_input)
if numbers:
value = float(numbers[0])
if "千克转斤" in user_input:
result = value * 2
return f"{value}千克 = {result}斤"
else:
result = value / 2
return f"{value}斤 = {result}千克"
except:
pass
return "我可以帮你做单位转换,比如:厘米转米、摄氏度转华氏度、千克转斤"
# 测试增强版机器人
print("\n🔧 正在启动增强版机器人...")
enhanced_bot = EnhancedBot("小智增强版")
print("✅ 增强版机器人启动完成!")
# 测试增强功能
test_inputs = [
"讲个故事",
"猜数字",
"50", # 猜数字游戏中的猜测
"25°C等于多少华氏度",
"今天天气怎么样",
"现在几点了"
]
print("\n🧪 增强功能测试:")
for test in test_inputs:
print(f"\n你:{test}")
response = enhanced_bot.process_input(test)
print(f"{enhanced_bot.name}:{response}")
🎮 第三部分:完整对话系统
3.1 完整对话界面
# 完整对话系统
print("🎮 智能问答机器人完整系统")
print("=" * 60)
def run_chat_system():
"""运行聊天系统"""
print("\n" + "🌟" * 30)
print("🤖 智能问答机器人 v2.0")
print("🌟" * 30)
print("\n请选择机器人版本:")
print("1. 基础版机器人")
print("2. 增强版机器人")
print("3. 自定义机器人")
choice = input("\n请选择 (1-3): ")
if choice == "1":
bot = SmartBot("小智")
elif choice == "2":
bot = EnhancedBot("小智增强版")
elif choice == "3":
name = input("请输入机器人的名字: ")
bot_type = input("选择类型 (1.基础 2.增强): ")
if bot_type == "1":
bot = SmartBot(name)
else:
bot = EnhancedBot(name)
else:
print("❌ 无效选择,使用基础版")
bot = SmartBot("小智")
print(f"\n✨ 欢迎使用{bot.name}!")
print("=" * 50)
print("💡 你可以问我:")
print(" • 数学问题(如:5+3,20÷4)")
print(" • 单位转换(如:100厘米转米)")
print(" • 讲笑话、讲故事")
print(" • 玩游戏(猜数字)")
print(" • 问时间、天气")
print(" • 告诉我你的信息(如:我叫小明)")
print(" • 说'再见'结束对话")
print(" • 说'状态'查看机器人状态")
print(" • 说'帮助'显示帮助信息")
print("=" * 50)
# 对话计数器
message_count = 0
while True:
try:
# 获取用户输入
if message_count == 0:
user_input = input(f"\n你(说'帮助'查看功能): ")
else:
user_input = input(f"\n你: ")
message_count += 1
# 检查特殊命令
if user_input.lower() in ['退出', '再见', '拜拜', 'exit', 'quit']:
print(f"\n{bot.name}:{random.choice(bot.knowledge_base['greetings']['再见'])}")
# 显示对话统计
print(f"\n📊 对话统计:")
print(f" 对话轮数:{message_count}")
print(f" 机器人心情:{bot.mood}")
print(f" 机器人经验值:{bot.experience}")
# 保存记忆
if bot.save_memory():
print(" 记忆已保存!")
print(f"\n🌟 感谢使用{bot.name}!下次再见!")
break
elif user_input.lower() in ['状态', 'status']:
bot.show_status()
continue
elif user_input.lower() in ['帮助', 'help', '功能']:
print(f"\n{bot.name}:我可以帮你做很多事情!")
print("=" * 40)
print("📚 学习功能:")
print(" • 问答:问我任何问题")
print(" • 计算:加减乘除运算")
print(" • 转换:单位转换")
print(" • 记忆:教我新知识")
print(" • 事实:分享有趣知识")
print("\n🎮 娱乐功能:")
print(" • 笑话:讲笑话逗你开心")
print(" • 故事:讲有趣的故事")
print(" • 游戏:猜数字游戏")
print(" • 唱歌:唱儿歌给你听")
print("\n🔧 工具功能:")
print(" • 时间:告诉你现在时间")
print(" • 天气:天气预报")
print(" • 状态:查看机器人状态")
print("\n👤 个人信息:")
print(" • 告诉我你的名字、年龄、爱好")
print(" • 我会记住你,下次还能认出你")
print("=" * 40)
continue
# 处理用户输入
response = bot.process_input(user_input)
# 显示回应
print(f"\n{bot.name}:{response}")
# 每5条消息恢复一点能量
if message_count % 5 == 0:
bot.energy = min(100, bot.energy + 5)
if bot.energy > 60 and bot.mood != "开心":
bot.mood = "开心"
# 每10条消息增加经验
if message_count % 10 == 0:
bot.experience += 1
print(f"✨ {bot.name}获得1点经验值!")
except KeyboardInterrupt:
print(f"\n\n{bot.name}:突然离开了吗?我会想你的!")
break
except Exception as e:
print(f"\n{bot.name}:出了点小问题... ({e})")
continue
# 运行聊天系统
run_chat_system()
3.2 扩展功能模块
# 扩展功能模块
print("\n🔧 扩展功能模块")
print("=" * 60)
class SuperBot(EnhancedBot):
"""超级机器人 - 包含所有扩展功能"""
def __init__(self, name="超级小智"):
super().__init__(name)
self.version = "3.0"
# 学习进度
self.learning_progress = {
"math": 0,
"science": 0,
"language": 0,
"programming": 0
}
# 任务列表
self.tasks = []
# 笑话和故事库扩展
self.knowledge_base["jokes"].extend([
"为什么程序员喜欢黑暗?因为光会吸引bug!",
"为什么计算机永远不会感冒?因为它有防病毒软件!",
"为什么数学老师总是很冷静?因为他们有很多解决方案!"
])
self.knowledge_base["facts"].extend([
"人的大脑每天产生约7万个想法!",
"蝴蝶用脚来品尝食物!",
"树懒一周只下树一次上厕所!"
])
print(f"✨ 超级机器人 {self.name} 已启动!版本 {self.version}")
def analyze_input(self, user_input):
"""超级版输入分析"""
input_lower = user_input.lower()
# 先调用父类的分析
response = super().analyze_input(user_input)
# 如果不是默认回应,直接返回
if not (response.startswith("这个问题") or response.startswith("我不太")):
return response
# 超级扩展分析
# 检查编程问题
if any(word in input_lower for word in ["编程", "代码", "python", "程序"]):
programming_facts = [
"Python是一种很受欢迎的编程语言,简单易学!",
"在Python中,用print()函数可以显示文字。",
"变量就像数据的盒子,可以存放数字、文字等。",
"if语句让程序可以根据条件做不同的事情。"
]
# 根据学习进度提供不同深度的答案
if self.learning_progress["programming"] > 5:
return random.choice(programming_facts[2:])
else:
return random.choice(programming_facts[:2])
# 检查学习进度
if "学习进度" in input_lower or "我会什么" in input_lower:
return self.show_learning_progress()
# 检查是否要添加任务
if "提醒我" in user_input or "记得" in user_input and "要做" in user_input:
return self.add_task(user_input)
# 检查是否要查看任务
if "任务" in input_lower and ("查看" in input_lower or "列表" in input_lower):
return self.show_tasks()
# 检查是否要学习新知识
if "教我" in user_input or "学习" in user_input and ("数学" in user_input or "科学" in user_input):
return self.start_learning(user_input)
return response
def show_learning_progress(self):
"""显示学习进度"""
progress_text = f"\n📚 {self.user_info.get('name', '朋友')}的学习进度:\n"
for subject, level in self.learning_progress.items():
progress_bar = "█" * (level // 2) + "░" * (10 - level // 2)
progress_text += f" {subject:12} [{progress_bar}] Lv.{level}\n"
if sum(self.learning_progress.values()) == 0:
progress_text += "\n💡 还没有开始学习,对我说'教我数学'或'教我科学'开始吧!"
return progress_text
def add_task(self, user_input):
"""添加任务"""
task = user_input.replace("提醒我", "").replace("记得", "").replace("要做", "").strip()
if task and len(task) < 100:
task_id = len(self.tasks) + 1
self.tasks.append({
"id": task_id,
"task": task,
"created": datetime.datetime.now().strftime("%Y-%m-%d %H:%M"),
"completed": False
})
return f"✅ 已添加任务{task_id}:{task}"
else:
return "请告诉我具体要提醒什么,比如:'提醒我下午3点做作业'"
def show_tasks(self):
"""显示任务列表"""
if not self.tasks:
return "📋 目前没有任务。可以说'提醒我[要做的事]'来添加任务。"
tasks_text = "\n📋 任务列表:\n"
tasks_text += "-" * 40 + "\n"
for task in self.tasks:
status = "✅" if task["completed"] else "⏳"
tasks_text += f"{status} 任务{task['id']}: {task['task']}\n"
tasks_text += f" 创建时间: {task['created']}\n"
tasks_text += "-" * 40
tasks_text += "\n💡 说'完成任务[编号]'来标记完成。"
return tasks_text
def start_learning(self, user_input):
"""开始学习"""
if "数学" in user_input:
subject = "math"
subject_name = "数学"
elif "科学" in user_input:
subject = "science"
subject_name = "科学"
elif "语文" in user_input or "语言" in user_input:
subject = "language"
subject_name = "语文"
elif "编程" in user_input:
subject = "programming"
subject_name = "编程"
else:
return "你想学习什么?可以说'教我数学'、'教我科学'、'教我语文'或'教我编程'"
# 增加学习进度
self.learning_progress[subject] += 1
# 根据等级提供不同内容
level = self.learning_progress[subject]
if subject == "math":
if level == 1:
lesson = "我们先学加法:1+1=2"
elif level == 2:
lesson = "现在学减法:5-3=2"
elif level == 3:
lesson = "乘法是加法的快捷方式:3×4=12"
else:
lesson = f"除法:12÷4=3,你已经学到第{level}课了!"
elif subject == "science":
lessons = [
"水有三种状态:固态、液态、气态",
"植物需要阳光、水和空气才能生长",
"地球是太阳系中唯一已知有生命的行星",
"重力让物体落向地面"
]
lesson = lessons[min(level-1, len(lessons)-1)]
elif subject == "language":
lessons = [
"汉字是表意文字,每个字都有意义",
"古诗讲究押韵和对仗",
"标点符号让句子意思更清楚",
"比喻让语言更生动形象"
]
lesson = lessons[min(level-1, len(lessons)-1)]
else: # programming
lessons = [
"Python用缩进来表示代码块",
"变量名要见名知意,比如age表示年龄",
"if语句让程序可以做决定",
"循环让程序可以重复做事情"
]
lesson = lessons[min(level-1, len(lessons)-1)]
return f"🎓 {subject_name}第{level}课:{lesson}"
# 测试超级机器人
print("\n🔧 正在启动超级机器人...")
super_bot = SuperBot("超级小智")
print("✅ 超级机器人启动完成!")
# 交互演示
demo_questions = [
"学习进度",
"教我数学",
"提醒我下午3点做作业",
"查看任务列表",
"教我编程"
]
print("\n🎬 超级机器人演示:")
for question in demo_questions:
print(f"\n你:{question}")
response = super_bot.process_input(question)
print(f"{super_bot.name}:{response}")
📁 第四部分:项目整合与优化
4.1 完整项目整合
# 完整智能问答机器人项目
print("🚀 完整智能问答机器人项目")
print("=" * 60)
def main():
"""主程序"""
print("\n" + "🤖" * 25)
print(" 智能问答机器人终极版")
print("🤖" * 25)
print("\n🎯 项目目标:")
print(" 创建一个能够理解、学习、互动的智能助手")
print(" 综合运用前19课的所有编程知识")
print(" 制作一个真正有用的工具")
print("\n🔧 技术支持:")
print(" • Python基础语法")
print(" • 数据类型和变量")
print(" • 条件判断和循环")
print(" • 函数和类")
print(" • 文件操作")
print(" • 字符串处理")
print(" • 数学计算")
print(" • 用户交互")
# 创建机器人
print("\n✨ 创建你的专属机器人...")
while True:
print("\n请选择机器人类型:")
print("1. 🤖 基础机器人 - 简单问答和计算")
print("2. 🚀 增强机器人 - 添加游戏和故事")
print("3. 🌟 超级机器人 - 完整学习系统")
print("4. 📊 查看项目报告")
print("5. 🚪 退出")
choice = input("\n请选择 (1-5): ")
if choice == "5":
print("👋 再见!期待你的下一个项目!")
break
elif choice == "4":
show_project_report()
continue
elif choice in ["1", "2", "3"]:
# 获取机器人名字
bot_name = input("给机器人起个名字(直接回车使用默认): ").strip()
if not bot_name:
if choice == "1":
bot_name = "小智"
elif choice == "2":
bot_name = "小智增强版"
else:
bot_name = "超级小智"
# 创建机器人
if choice == "1":
bot = SmartBot(bot_name)
elif choice == "2":
bot = EnhancedBot(bot_name)
else:
bot = SuperBot(bot_name)
# 运行对话系统
run_bot_session(bot)
else:
print("❌ 请选择1-5的数字!")
def run_bot_session(bot):
"""运行机器人会话"""
print(f"\n{'='*50}")
print(f"✨ 与{bot.name}的对话开始!")
print("💡 提示:说'菜单'返回主菜单,'再见'结束对话")
print("=" * 50)
session_messages = 0
while True:
try:
user_input = input(f"\n你对{bot.name}说: ").strip()
if not user_input:
continue
# 检查特殊命令
if user_input.lower() in ["菜单", "返回", "主菜单"]:
print(f"{bot.name}:好的,返回主菜单。")
break
elif user_input.lower() in ["再见", "拜拜", "退出"]:
print(f"{bot.name}:{random.choice(bot.knowledge_base['greetings']['再见'])}")
print(f"📊 本次对话:{session_messages}条消息")
print(f"✨ 感谢与{bot.name}对话!")
break
# 处理输入
response = bot.process_input(user_input)
session_messages += 1
# 显示回应
print(f"\n{bot.name}:{response}")
# 每10条消息显示一次状态
if session_messages % 10 == 0:
print(f"\n📈 对话进度:{session_messages}条消息")
if hasattr(bot, 'learning_progress'):
for subject, level in bot.learning_progress.items():
if level > 0:
print(f" {subject}等级:{level}")
except KeyboardInterrupt:
print(f"\n\n{bot.name}:突然中断了?我会想你的!")
break
except Exception as e:
print(f"\n{bot.name}:出了点问题... ({e})")
continue
# 保存记忆
if bot.save_memory():
print("💾 记忆已保存!")
def show_project_report():
"""显示项目报告"""
print("\n" + "📊" * 25)
print(" 项目学习报告")
print("📊" * 25)
print("\n🎯 本项目综合运用了以下知识点:")
knowledge_points = [
("第1-10课", "Python基础、变量、输入输出、条件循环"),
("第11课", "数据类型:整数、浮点数、字符串、布尔值"),
("第12课", "类型转换:int()、float()、str()"),
("第13课", "运算符:算术、比较、赋值运算符"),
("第14课", "逻辑运算符:and、or、not"),
("第15课", "格式化输出:f-string"),
("第16课", "注释:单行注释、多行注释"),
("第17课", "交互式故事和分支选择"),
("第18课", "成绩计算和格式化输出"),
("第19课", "单位转换器"),
("第20课", "综合项目:智能问答机器人")
]
for i, (lesson, content) in enumerate(knowledge_points, 1):
print(f"{i:2}. {lesson:8} - {content}")
print("\n🚀 你学会了:")
print(" ✅ 创建类和对象")
print(" ✅ 处理用户输入")
print(" ✅ 实现条件逻辑")
print(" ✅ 使用循环和函数")
print(" ✅ 文件读写操作")
print(" ✅ 字符串处理")
print(" ✅ 数据存储和读取")
print(" ✅ 错误处理")
print(" ✅ 模块化编程")
print("\n💡 下一步建议:")
print(" 1. 给你的机器人添加更多功能")
print(" 2. 改进对话的自然程度")
print(" 3. 添加图形界面")
print(" 4. 连接互联网获取实时信息")
print(" 5. 制作手机APP版本")
input("\n按回车键返回主菜单...")
# 检查是否有保存的记忆
def check_saved_memory():
"""检查保存的记忆"""
memory_file = "bot_memory.json"
if os.path.exists(memory_file):
try:
with open(memory_file, 'r', encoding='utf-8') as f:
memory = json.load(f)
if "user_memory" in memory and "name" in memory["user_memory"]:
name = memory["user_memory"]["name"]
last_visit = memory["user_memory"].get("last_visit", "未知时间")
print(f"\n👋 欢迎回来,{name}!")
print(f"📅 上次访问:{last_visit}")
return True
except:
pass
return False
# 运行主程序
if __name__ == "__main__":
print("🔍 检查记忆文件...")
if not check_saved_memory():
print("👋 欢迎新朋友!")
main()
4.2 扩展练习和挑战
# 扩展练习和挑战
print("\n🎯 扩展练习和挑战")
print("=" * 60)
def challenge_problems():
"""挑战题目"""
print("\n🧠 挑战题目:扩展你的机器人")
print("=" * 50)
challenges = [
{
"level": "初级",
"title": "添加更多笑话和故事",
"description": "让机器人有更多笑话和故事可以讲",
"hint": "扩展knowledge_base中的jokes和stories列表"
},
{
"level": "初级",
"title": "添加更多数学运算",
"description": "支持平方、立方、平方根等运算",
"hint": "在handle_math方法中添加新的运算识别"
},
{
"level": "中级",
"title": "添加天气查询功能",
"description": "连接网络API获取真实天气信息",
"hint": "使用requests库访问天气API"
},
{
"level": "中级",
"title": "添加语音功能",
"description": "让机器人可以说话和听声音",
"hint": "研究pyttsx3(文本转语音)和speech_recognition库"
},
{
"level": "高级",
"title": "添加机器学习能力",
"description": "让机器人可以从对话中学习新知识",
"hint": "使用简单的模式匹配或机器学习库"
},
{
"level": "高级",
"title": "制作图形界面",
"description": "用Tkinter或PyQt制作机器人窗口",
"hint": "学习GUI编程基础"
},
{
"level": "专家",
"title": "制作手机APP",
"description": "将机器人做成手机应用程序",
"hint": "研究Kivy或BeeWare框架"
},
{
"level": "专家",
"title": "连接到智能音箱",
"description": "让机器人可以通过智能音箱控制",
"hint": "研究物联网和语音助手开发"
}
]
print("\n选择你的挑战:")
for i, challenge in enumerate(challenges, 1):
print(f"{i}. [{challenge['level']}] {challenge['title']}")
while True:
try:
choice = int(input("\n选择挑战编号查看详情 (0退出): "))
if choice == 0:
break
elif 1 <= choice <= len(challenges):
challenge = challenges[choice-1]
print(f"\n🎯 挑战{choice}: {challenge['title']}")
print(f" 难度: {challenge['level']}")
print(f" 描述: {challenge['description']}")
print(f" 提示: {challenge['hint']}")
# 是否接受挑战
accept = input("\n接受这个挑战吗?(是/否): ")
if accept.lower() in ['是', 'yes', 'y']:
print("💪 加油!开始你的挑战吧!")
print("💡 记得:")
print(" 1. 先规划再编码")
print(" 2. 分步骤实现")
print(" 3. 测试每个小功能")
print(" 4. 遇到问题先自己尝试解决")
print(" 5. 完成后分享给朋友看看!")
else:
print("❌ 请选择有效的编号!")
except ValueError:
print("❌ 请输入数字!")
input("\n按回车键继续...")
def project_showcase():
"""项目展示"""
print("\n🏆 项目展示")
print("=" * 50)
print("""
恭喜你完成了智能问答机器人项目!
你已经创建了一个功能丰富的机器人,它可以:
1. 🤔 理解和回答问题
2. 🧮 进行数学计算
3. 🔄 做单位转换
4. 📖 讲笑话和故事
5. 🎮 陪你玩游戏
6. 💾 记住你的信息
7. 📚 教你学习知识
8. 📅 管理你的任务
这是一个真正的综合项目,展示了你的编程能力!
🎉 庆祝你的成就:
• 完成了20节编程课程
• 掌握了Python基础知识
• 制作了多个实际项目
• 培养了解决问题的能力
🌟 下一步:
1. 继续完善你的机器人
2. 学习更多Python高级知识
3. 开始新的项目
4. 分享你的成果
5. 教别人编程
记住:编程是创造的工具,用代码让世界更美好!
""")
# 生成成就证书
print("\n" + "🎓" * 25)
print(" 编程学习成就证书")
print("🎓" * 25)
print()
print(" 授予:")
print(" 编程小能手")
print()
print(" 在完成Python编程入门课程中")
print(" 表现出色,掌握了编程基础")
print(" 成功创建了智能问答机器人")
print(" 展现了出色的学习能力和创造力")
print()
print(f" 颁发日期:{datetime.datetime.now().strftime('%Y年%m月%d日')}")
print()
print("🎓" * 25)
# 运行挑战和展示
print("\n选择扩展活动:")
print("1. 🎯 挑战题目")
print("2. 🏆 项目展示")
print("3. 🔙 返回")
choice = input("请选择 (1-3): ")
if choice == "1":
challenge_problems()
elif choice == "2":
project_showcase()
📅 课程总结
第20课:阶段项目-智能问答机器人 总结
🎯 本课学到的:
- ✅ 综合运用前19课的所有编程知识
- ✅ 创建复杂的类和方法结构
- ✅ 实现自然语言交互系统
- ✅ 添加记忆和学习功能
- ✅ 制作完整的对话机器人
- ✅ 处理多种类型的用户输入
- ✅ 实现文件存储和读取
- ✅ 添加游戏和娱乐功能
- ✅ 设计用户友好的界面
- ✅ 完成综合项目开发
🏆 项目特色:
- 模块化设计:易于扩展和维护
- 用户友好:清晰的界面和提示
- 功能丰富:问答、计算、游戏、学习
- 记忆功能:记住用户信息和学到的知识
- 错误处理:健壮的程序设计
- 可扩展性:方便添加新功能
💡 继续学习建议:
- 深入Python:学习更多高级特性
- 学习算法:提高问题解决能力
- 学习GUI:制作图形界面程序
- 学习Web开发:制作网站应用
- 学习数据科学:分析数据制作图表
- 学习人工智能:让机器人更智能
🌟 给家长的话:
亲爱的家长:
恭喜!您的孩子已经完成了Python编程的入门学习,并成功制作了一个功能丰富的智能问答机器人!
这20节课的成就:
- 从零开始掌握了Python编程基础
- 理解了计算机科学的基本概念
- 培养了逻辑思维和问题解决能力
- 完成了多个实际项目应用
- 展现了创造力和坚持精神
您可以这样做:
- 庆祝成就:肯定孩子的努力和成果
- 展示作品:让孩子向家人朋友展示机器人
- 鼓励继续:支持孩子继续学习编程
- 实际应用:在生活中使用孩子制作的工具
- 寻找社区:加入编程学习社区交流
温馨提示:
- 编程是21世纪的重要技能
- 兴趣是最好的老师,保护孩子的编程热情
- 实践是最好的学习方法
- 错误是学习的机会,不是失败
- 编程能培养逻辑思维和创造力
🎉 最终成就
完成了整个课程的学习,你现在:
🤖 制作了智能问答机器人
💻 掌握了Python编程基础
🧠 培养了计算思维
💡 学会了解决问题
🚀 准备好继续编程之旅
你的编程之旅才刚刚开始!
继续探索,继续创造,用代码改变世界!
第20课结束。恭喜你完成了Python编程入门课程!
现在,你是一名真正的程序员了!
继续你的编程之旅,创造更多精彩!
🌟 编程之路,星辰大海! 🌟