import tkinter as tk
from tkinter import ttk, messagebox
import random
import threading
import time

class TurtleRabbitRace:
    def __init__(self, root):
        self.root = root
        self.root.title("🐢 龟兔赛跑 🐇")
        self.root.geometry("700x550")
        self.root.resizable(False, False)
        
        # 赛道参数
        self.TRACK_LENGTH = 800  # 像素宽度
        self.FINISH_LINE = 780   # 终点线位置
        
        # 比赛状态
        self.is_running = False
        self.turtle_pos = 30      # 起始X坐标
        self.rabbit_pos = 30
        self.turtle_speed = 0
        self.rabbit_speed = 0
        self.step_count = 0
        self.race_thread = None
        
        # 颜色主题
        self.bg_color = "#2b2b2b"
        self.track_color = "#3c3c3c"
        self.text_color = "#ffffff"
        
        self.setup_ui()
        
    def setup_ui(self):
        """创建界面组件"""
        # 主容器
        main_frame = tk.Frame(self.root, bg=self.bg_color)
        main_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
        
        # ===== 标题 =====
        title = tk.Label(
            main_frame, 
            text="🏁 龟兔赛跑模拟器 🏁", 
            font=("Arial", 24, "bold"),
            fg="#ffd700",
            bg=self.bg_color
        )
        title.pack(pady=(0, 10))
        
        # ===== 赛道画布 =====
        self.canvas = tk.Canvas(
            main_frame,
            width=820,
            height=250,
            bg=self.track_color,
            highlightthickness=2,
            highlightbackground="#555"
        )
        self.canvas.pack(pady=10)
        
        # 绘制赛道和起点线
        self.draw_track()
        
        # ===== 状态显示区 =====
        status_frame = tk.Frame(main_frame, bg=self.bg_color)
        status_frame.pack(fill=tk.X, pady=10)
        
        # 乌龟信息
        self.turtle_label = tk.Label(
            status_frame,
            text="🐢 乌龟: 0%",
            font=("Arial", 14, "bold"),
            fg="#4caf50",
            bg=self.bg_color
        )
        self.turtle_label.pack(side=tk.LEFT, padx=20)
        
        # 兔子信息
        self.rabbit_label = tk.Label(
            status_frame,
            text="🐇 兔子: 0%",
            font=("Arial", 14, "bold"),
            fg="#ff6b6b",
            bg=self.bg_color
        )
        self.rabbit_label.pack(side=tk.RIGHT, padx=20)
        
        # 步数显示（居中）
        self.step_label = tk.Label(
            status_frame,
            text="步数: 0",
            font=("Arial", 12),
            fg=self.text_color,
            bg=self.bg_color
        )
        self.step_label.pack(side=tk.LEFT, padx=50)
        
        # ===== 控制按钮 =====
        btn_frame = tk.Frame(main_frame, bg=self.bg_color)
        btn_frame.pack(pady=15)
        
        # 开始按钮
        self.start_btn = tk.Button(
            btn_frame,
            text="🏃 开始比赛",
            font=("Arial", 14, "bold"),
            bg="#4caf50",
            fg="white",
            padx=30,
            pady=8,
            cursor="hand2",
            command=self.start_race
        )
        self.start_btn.pack(side=tk.LEFT, padx=10)
        
        # 重置按钮
        self.reset_btn = tk.Button(
            btn_frame,
            text="🔄 重置",
            font=("Arial", 14, "bold"),
            bg="#ff9800",
            fg="white",
            padx=30,
            pady=8,
            cursor="hand2",
            command=self.reset_race,
            state=tk.DISABLED
        )
        self.reset_btn.pack(side=tk.LEFT, padx=10)
        
        # 速度控制
        speed_frame = tk.Frame(main_frame, bg=self.bg_color)
        speed_frame.pack()
        
        tk.Label(
            speed_frame,
            text="⏱️ 速度:",
            font=("Arial", 11),
            fg=self.text_color,
            bg=self.bg_color
        ).pack(side=tk.LEFT, padx=5)
        
        self.speed_var = tk.DoubleVar(value=0.5)
        self.speed_scale = ttk.Scale(
            speed_frame,
            from_=0.1,
            to=1.0,
            orient=tk.HORIZONTAL,
            variable=self.speed_var,
            length=150
        )
        self.speed_scale.pack(side=tk.LEFT, padx=5)
        
        tk.Label(
            speed_frame,
            text="慢 ← → 快",
            font=("Arial", 9),
            fg="#aaa",
            bg=self.bg_color
        ).pack(side=tk.LEFT, padx=5)
        
        # 兔子睡觉概率显示
        self.sleep_label = tk.Label(
            main_frame,
            text="💤 兔子睡觉概率: 30%",
            font=("Arial", 10),
            fg="#ff6b6b",
            bg=self.bg_color
        )
        self.sleep_label.pack(pady=5)
        
        # ===== 事件日志 =====
        self.log_text = tk.Text(
            main_frame,
            height=3,
            width=80,
            font=("Consolas", 10),
            bg="#1e1e1e",
            fg="#d4d4d4",
            state=tk.DISABLED
        )
        self.log_text.pack(pady=5, fill=tk.X)
        
    def draw_track(self):
        """绘制赛道"""
        # 绘制三条跑道
        track_y = [80, 140, 200]  # 三条线
        
        # 跑道背景
        for y in track_y:
            self.canvas.create_rectangle(
                20, y-20, 800, y+20,
                fill="#2a2a2a",
                outline="#444",
                width=2
            )
        
        # 跑道分隔线（虚线效果）
        for x in range(40, 800, 30):
            self.canvas.create_line(
                x, 60, x, 240,
                fill="#444",
                width=1,
                dash=(2, 4)
            )
        
        # 起点线
        self.canvas.create_line(
            30, 50, 30, 250,
            fill="#ffd700",
            width=3,
            dash=(5, 5)
        )
        self.canvas.create_text(
            30, 40,
            text="起点",
            fill="#ffd700",
            font=("Arial", 10, "bold")
        )
        
        # 终点线（黑白格子）
        for i in range(8):
            for j in range(4):
                x = 780 + i * 5
                y = 60 + j * 10
                color = "#fff" if (i + j) % 2 == 0 else "#000"
                self.canvas.create_rectangle(
                    x, y, x+5, y+10,
                    fill=color,
                    outline=""
                )
        
        self.canvas.create_text(
            780, 45,
            text="🏁 终点",
            fill="#ffd700",
            font=("Arial", 12, "bold")
        )
        
        # 创建乌龟和兔子（初始在起点）
        self.turtle = self.canvas.create_text(
            30, 100,
            text="🐢",
            font=("Arial", 40),
            tags="turtle"
        )
        
        self.rabbit = self.canvas.create_text(
            30, 160,
            text="🐇",
            font=("Arial", 40),
            tags="rabbit"
        )
        
        # 速度指示器
        self.turtle_speed_indicator = self.canvas.create_text(
            50, 250,
            text="",
            fill="#4caf50",
            font=("Arial", 9),
            tags="turtle_speed"
        )
        
        self.rabbit_speed_indicator = self.canvas.create_text(
            50, 270,
            text="",
            fill="#ff6b6b",
            font=("Arial", 9),
            tags="rabbit_speed"
        )
        
    def log_message(self, msg):
        """添加日志"""
        self.log_text.config(state=tk.NORMAL)
        self.log_text.insert(tk.END, msg + "\n")
        self.log_text.see(tk.END)
        self.log_text.config(state=tk.DISABLED)
        
    def update_positions(self):
        """更新位置显示"""
        # 更新乌龟位置
        self.canvas.coords(self.turtle, self.turtle_pos, 100)
        self.canvas.coords(self.turtle_speed_indicator, self.turtle_pos, 250)
        self.canvas.itemconfig(
            self.turtle_speed_indicator,
            text=f"+{self.turtle_speed}"
        )
        
        # 更新兔子位置
        self.canvas.coords(self.rabbit, self.rabbit_pos, 160)
        self.canvas.coords(self.rabbit_speed_indicator, self.rabbit_pos, 270)
        
        if self.rabbit_speed == 0:
            self.canvas.itemconfig(
                self.rabbit_speed_indicator,
                text="💤 睡觉",
                fill="#ff6b6b"
            )
        else:
            self.canvas.itemconfig(
                self.rabbit_speed_indicator,
                text=f"+{self.rabbit_speed}",
                fill="#4caf50"
            )
        
        # 计算进度百分比
        turtle_percent = int((self.turtle_pos - 30) / (self.FINISH_LINE - 30) * 100)
        rabbit_percent = int((self.rabbit_pos - 30) / (self.FINISH_LINE - 30) * 100)
        
        # 限制最大100%
        turtle_percent = min(turtle_percent, 100)
        rabbit_percent = min(rabbit_percent, 100)
        
        # 更新标签
        self.turtle_label.config(text=f"🐢 乌龟: {turtle_percent}%")
        self.rabbit_label.config(text=f"🐇 兔子: {rabbit_percent}%")
        self.step_label.config(text=f"步数: {self.step_count}")
        
        # 更新进度条（可选）
        self.root.update()
        
    def race_loop(self):
        """比赛主循环（在子线程中运行）"""
        while self.is_running:
            self.step_count += 1
            
            # ===== 乌龟移动 =====
            # 步长: 1~3
            self.turtle_speed = random.randint(1, 3)
            self.turtle_pos = min(
                self.turtle_pos + self.turtle_speed * 5,  # 乘以5让移动更明显
                self.FINISH_LINE
            )
            
            # ===== 兔子移动 =====
            # 30%概率睡觉
            if random.random() < 0.3:
                self.rabbit_speed = 0
                self.log_message(f"💤 第{self.step_count}步: 兔子睡着了！")
            else:
                # 步长: 1~6
                self.rabbit_speed = random.randint(1, 6)
                self.rabbit_pos = min(
                    self.rabbit_pos + self.rabbit_speed * 5,
                    self.FINISH_LINE
                )
                self.log_message(f"🏃 第{self.step_count}步: 兔子跑了 {self.rabbit_speed} 格")
            
            # 更新界面（必须在主线程执行）
            self.root.after(0, self.update_positions)
            
            # 检查是否有人到达终点
            if self.turtle_pos >= self.FINISH_LINE or self.rabbit_pos >= self.FINISH_LINE:
                self.is_running = False
                self.root.after(0, self.show_result)
                break
            
            # 控制速度
            time.sleep(self.speed_var.get() * 0.3)
        
        # 恢复按钮状态
        self.root.after(0, self.enable_buttons)
    
    def start_race(self):
        """开始比赛"""
        if self.is_running:
            return
        
        # 重置位置
        self.reset_race()
        
        # 清空日志
        self.log_text.config(state=tk.NORMAL)
        self.log_text.delete(1.0, tk.END)
        self.log_text.config(state=tk.DISABLED)
        
        self.is_running = True
        self.step_count = 0
        
        # 禁用按钮
        self.start_btn.config(state=tk.DISABLED)
        self.reset_btn.config(state=tk.DISABLED)
        self.speed_scale.config(state=tk.DISABLED)
        
        self.log_message("🏁 比赛开始！")
        self.log_message("🐢 乌龟稳步前进...")
        self.log_message("🐇 兔子快速奔跑（但有30%概率睡觉）")
        
        # 在新线程中运行比赛，避免阻塞界面
        self.race_thread = threading.Thread(target=self.race_loop, daemon=True)
        self.race_thread.start()
    
    def enable_buttons(self):
        """启用按钮"""
        self.start_btn.config(state=tk.NORMAL)
        self.reset_btn.config(state=tk.NORMAL)
        self.speed_scale.config(state=tk.NORMAL)
    
    def show_result(self):
        """显示比赛结果"""
        if self.turtle_pos >= self.FINISH_LINE and self.rabbit_pos >= self.FINISH_LINE:
            winner = "🤝 双方同时到达！平局！"
            icon = "🤝"
        elif self.turtle_pos >= self.FINISH_LINE:
            winner = "🐢 乌龟赢了！稳扎稳打，胜利属于坚持者！"
            icon = "🐢"
        else:
            winner = "🐇 兔子赢了！虽然中途睡了一觉，但实力依然强劲！"
            icon = "🐇"
        
        self.log_message("=" * 40)
        self.log_message(f"🏆 {winner}")
        self.log_message(f"📊 总步数: {self.step_count}")
        
        # 弹窗显示结果
        messagebox.showinfo(
            "比赛结果",
            f"{icon}\n\n{winner}\n\n总共用了 {self.step_count} 步"
        )
    
    def reset_race(self):
        """重置比赛"""
        self.is_running = False
        
        # 重置位置
        self.turtle_pos = 30
        self.rabbit_pos = 30
        self.turtle_speed = 0
        self.rabbit_speed = 0
        self.step_count = 0
        
        # 更新界面
        self.update_positions()
        
        # 重置速度标签
        self.canvas.itemconfig(self.turtle_speed_indicator, text="")
        self.canvas.itemconfig(self.rabbit_speed_indicator, text="")
        
        # 启用按钮
        self.start_btn.config(state=tk.NORMAL)
        self.reset_btn.config(state=tk.NORMAL)
        self.speed_scale.config(state=tk.NORMAL)
        
        # 清空日志（但保留提示）
        self.log_text.config(state=tk.NORMAL)
        self.log_text.delete(1.0, tk.END)
        self.log_text.insert(tk.END, "🔄 已重置，点击『开始比赛』重新开跑！\n")
        self.log_text.config(state=tk.DISABLED)

# 运行程序
if __name__ == "__main__":
    root = tk.Tk()
    app = TurtleRabbitRace(root)
    root.mainloop()