"""
二年级下学期数学闯关游戏 - 精简版
每关随机1题，包含开放性问题
"""
import random

def level1_time():
    """第一关：认识时间（随机出题）"""
    questions = [
        {
            "question": "现在是3:00，再过45分钟是几时几分？",
            "answer": "3:45",
            "open": "说说你是怎么想的？",
            "check": lambda x: "3:45" in x.replace("：", ":").replace("点", ":")
        },
        {
            "question": "小明7:50出门，8:15到学校，路上用了多长时间？",
            "answer": "25分钟",
            "open": "你平时上学路上要花多长时间？",
            "check": lambda x: "25" in x
        },
        {
            "question": "时针从2走到5，走了几大格？是几小时？",
            "answer": "3大格，3小时",
            "open": "你能用手比划一下吗？",
            "check": lambda x: "3" in x
        },
        {
            "question": "分针从12走到6，走了多少分钟？",
            "answer": "30分钟",
            "open": "这正好是几小时的一半？",
            "check": lambda x: "30" in x
        },
        {
            "question": "钟表上，时针和分针都指向12，现在是几时？过1小时呢？",
            "answer": "12:00，过1小时是1:00",
            "open": "一天中时针和分针都指向12有几次？",
            "check": lambda x: "12" in x
        }
    ]
    return random.choice(questions)


def level2_numbers():
    """第二关：四位数的组成（随机生成）"""
    # 随机生成四位数（千位不能为0）
    thousands = random.randint(1, 9)
    hundreds = random.randint(0, 9)
    tens = random.randint(0, 9)
    ones = random.randint(0, 9)
    num = thousands * 1000 + hundreds * 100 + tens * 10 + ones
    
    questions = [
        {
            "question": f"数字 {num} 是由几个千、几个百、几个十和几个一组成的？",
            "answer": f"{thousands}个千、{hundreds}个百、{tens}个十、{ones}个一",
            "open": "你能用这个数编一道应用题吗？",
            "check": lambda x: str(thousands) in x and str(num)[-1] in x
        },
        {
            "question": f"{num} 这个数，哪个数位上的数字最大？是几？",
            "answer": f"千位上的{thousands}最大" if thousands >= max(hundreds, tens, ones) else "需要比较",
            "open": "你觉得哪个数位最重要？为什么？",
            "check": lambda x: True
        },
        {
            "question": f"把 {num} 各数位上的数字相加，和是多少？",
            "answer": str(thousands + hundreds + tens + ones),
            "open": "你能找到一个四位数，让它的数字和是20吗？",
            "check": lambda x: str(thousands + hundreds + tens + ones) in x
        },
        {
            "question": f"{num} 读作什么？",
            "answer": f"{thousands}千{hundreds}百{tens}十{ones}",
            "open": "你能写出3个比它大的四位数吗？",
            "check": lambda x: True
        },
        {
            "question": f"用 {thousands}、{hundreds}、{tens}、{ones} 这四个数字，能组成最大的四位数是多少？",
            "answer": "需要排序后组合",
            "open": "最小的四位数呢？你能发现什么规律？",
            "check": lambda x: True
        }
    ]
    return random.choice(questions)


def level3_measure():
    """第三关：选择合适的身体尺（随机出题）"""
    items = [
        ("铅笔", "一拃"),
        ("课桌高度", "3拃"),
        ("黑板长度", "一庹"),
        ("教室地面", "步"),
        ("文具盒", "一拃"),
        ("操场跑道", "步"),
        ("数学书封面", "一拃"),
        ("门的高度", "一庹")
    ]
    
    item, correct_tool = random.choice(items)
    
    questions = [
        {
            "question": f"要测量{item}的长度，你选择用什么身体尺？为什么？",
            "answer": f"用{correct_tool}",
            "open": "你还能想到什么物体用这个身体尺测量更合适？",
            "check": lambda x: correct_tool in x or "庹" in x or "拃" in x or "步" in x
        },
        {
            "question": f"小明用庹量了黑板，大约是4庹。你知道黑板大约多长吗？",
            "answer": "大约4米（一庹约1米）",
            "open": "你觉得用庹测量准确吗？有什么优缺点？",
            "check": lambda x: True
        }
    ]
    return random.choice(questions)


def level4_shapes():
    """第四关：图形分类（随机出题）"""
    shapes = ["长方形", "正方形", "平行四边形", "三角形", "梯形", "圆"]
    
    questions = [
        {
            "question": "长方形、正方形、平行四边形有什么相同点和不同点？",
            "answer": "都有4条边，正方形四边相等且有4个直角，长方形对边相等有4个直角，平行四边形对边平行",
            "open": "你能画出一个既是长方形又是正方形的图形吗？为什么？",
            "check": lambda x: True
        },
        {
            "question": "把下面的图形分类：长方形、三角形、圆、正方形、平行四边形。你有几种分法？",
            "answer": "按边数分：3条边（三角形）/4条边（长方形、正方形、平行四边形）/曲线（圆）",
            "open": "你觉得哪种分法最合理？说说你的理由。",
            "check": lambda x: True
        },
        {
            "question": "正方形和长方形都是四边形，梯形也是四边形吗？为什么？",
            "answer": "是，因为梯形也有4条边",
            "open": "你还能举出生活中的四边形吗？",
            "check": lambda x: True
        },
        {
            "question": "圆和上面学过的图形有什么不同？",
            "answer": "圆是曲线图形，其他是直线图形",
            "open": "生活中哪些东西是圆的？为什么要做成圆形？",
            "check": lambda x: True
        }
    ]
    return random.choice(questions)


def level5_problems():
    """第五关：看图提问题（开放性最强）"""
    scenarios = [
        {
            "question": "图片上有8只小鸡在吃米，后来又来了5只。你能提出什么数学问题？",
            "answer": "可以提加法、减法、乘法等多种问题",
            "open": "你最多能提出几个不同的问题？",
            "check": lambda x: True
        },
        {
            "question": "有24颗糖，要分给小朋友。你能提出不同的分法问题吗？",
            "answer": "每人分几个？可以分给几人？",
            "open": "你认为哪种分法最公平？为什么？",
            "check": lambda x: True
        },
        {
            "question": "小明有15元，一本书8元，一个本子3元。你能提出什么问题？",
            "answer": "可以提买书、买本子、一起买等问题",
            "open": "如果你有20元，你会怎么花？",
            "check": lambda x: True
        },
        {
            "question": "图片上有3排树，每排有7棵。你能提出什么数学问题？",
            "answer": "可以提乘法、加法、减法问题",
            "open": "如果要再种一排，总共会有多少棵？",
            "check": lambda x: True
        },
        {
            "question": "小华读一本书，第一天读了12页，第二天读了9页。你能提出什么问题？",
            "answer": "可以提一共读多少页、还剩多少页等问题",
            "open": "如果这本书有50页，你觉得几天能读完？",
            "check": lambda x: True
        }
    ]
    return random.choice(scenarios)


def run_game():
    print("=" * 50)
    print("🎮 数学闯关游戏")
    print("二年级下学期·闯关挑战")
    print("=" * 50)
    
    levels = [
        ("⏰ 第一关：认识时间", level1_time),
        ("🔢 第二关：四位数组成", level2_numbers),
        ("📏 第三关：选择身体尺", level3_measure),
        ("🔷 第四关：图形分类", level4_shapes),
        ("❓ 第五关：看图提问题", level5_problems),
    ]
    
    total_score = 0
    
    for level_num, (level_name, level_func) in enumerate(levels, 1):
        print(f"\n{'─' * 50}")
        print(f"{level_name}")
        print(f"{'─' * 50}")
        
        q = level_func()
        
        print(f"\n📝 {q['question']}")
        answer = input("\n你的答案：").strip()
        
        print(f"\n💡 参考答案：{q['answer']}")
        
        if q.get('check') and q['check'](answer):
            print("✅ 回答正确！")
            total_score += 1
        else:
            print("继续思考，你很棒！")
        
        print(f"\n🤔 开放思考：{q['open']}")
        open_answer = input("你的想法（可跳过按回车）：").strip()
        
        if open_answer:
            print("👍 太棒了，你的想法很有创意！")
            total_score += 1
    
    print(f"\n{'=' * 50}")
    print(f"🏆 闯关完成！")
    print(f"得分：{total_score}/{len(levels) * 2}")
    
    if total_score >= 9:
        print("🌟🌟🌟 数学小达人！")
    elif total_score >= 7:
        print("🌟🌟 非常棒！")
    elif total_score >= 5:
        print("🌟 继续加油！")
    else:
        print("💪 你很有潜力！")
    print("=" * 50)


if __name__ == "__main__":
    run_game()
