第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课:阶段项目-智能问答机器人 总结

🎯 本课学到的:

  1. ✅ 综合运用前19课的所有编程知识
  2. ✅ 创建复杂的类和方法结构
  3. ✅ 实现自然语言交互系统
  4. ✅ 添加记忆和学习功能
  5. ✅ 制作完整的对话机器人
  6. ✅ 处理多种类型的用户输入
  7. ✅ 实现文件存储和读取
  8. ✅ 添加游戏和娱乐功能
  9. ✅ 设计用户友好的界面
  10. ✅ 完成综合项目开发

🏆 项目特色:

  1. 模块化设计:易于扩展和维护
  2. 用户友好:清晰的界面和提示
  3. 功能丰富:问答、计算、游戏、学习
  4. 记忆功能:记住用户信息和学到的知识
  5. 错误处理:健壮的程序设计
  6. 可扩展性:方便添加新功能

💡 继续学习建议:

  1. 深入Python:学习更多高级特性
  2. 学习算法:提高问题解决能力
  3. 学习GUI:制作图形界面程序
  4. 学习Web开发:制作网站应用
  5. 学习数据科学:分析数据制作图表
  6. 学习人工智能:让机器人更智能

🌟 给家长的话:

亲爱的家长

恭喜!您的孩子已经完成了Python编程的入门学习,并成功制作了一个功能丰富的智能问答机器人!

这20节课的成就

  1. 从零开始掌握了Python编程基础
  2. 理解了计算机科学的基本概念
  3. 培养了逻辑思维和问题解决能力
  4. 完成了多个实际项目应用
  5. 展现了创造力和坚持精神

您可以这样做

  1. 庆祝成就:肯定孩子的努力和成果
  2. 展示作品:让孩子向家人朋友展示机器人
  3. 鼓励继续:支持孩子继续学习编程
  4. 实际应用:在生活中使用孩子制作的工具
  5. 寻找社区:加入编程学习社区交流

温馨提示

  • 编程是21世纪的重要技能
  • 兴趣是最好的老师,保护孩子的编程热情
  • 实践是最好的学习方法
  • 错误是学习的机会,不是失败
  • 编程能培养逻辑思维和创造力

🎉 最终成就

完成了整个课程的学习,你现在:

🤖 制作了智能问答机器人

💻 掌握了Python编程基础

🧠 培养了计算思维

💡 学会了解决问题

🚀 准备好继续编程之旅

你的编程之旅才刚刚开始!

继续探索,继续创造,用代码改变世界!


第20课结束。恭喜你完成了Python编程入门课程!

现在,你是一名真正的程序员了!

继续你的编程之旅,创造更多精彩!

🌟 编程之路,星辰大海! 🌟