import tkinter as tk
from tkinter import messagebox
import random
import math

class LuckyWheel:
    def __init__(self, root):
        self.root = root
        self.root.title("🎰 转盘抽奖")
        self.root.geometry("500x600")
        self.root.resizable(False, False)
        self.root.configure(bg="#2c3e50")
        
        # 转盘参数
        self.center_x, self.center_y = 200, 200
        self.radius = 180
        
        # 奖项配置（名称, 颜色）
        self.prizes = [
            ("一等奖 🎁", "#e74c3c"),
            ("谢谢参与 😅", "#95a5a6"),
            ("二等奖 🎉", "#f39c12"),
            ("再来一次 🔄", "#3498db"),
            ("三等奖 🏆", "#9b59b6"),
            ("谢谢参与 😅", "#95a5a6"),
            ("特等奖 💎", "#e67e22"),
            ("幸运奖 🍀", "#2ecc71"),
        ]
        
        self.num_prizes = len(self.prizes)
        self.angle_per_prize = 360 / self.num_prizes
        
        # 当前旋转角度
        self.current_angle = 0
        self.is_spinning = False
        
        self.create_widgets()

    def create_widgets(self):
        # 标题
        title_label = tk.Label(
            self.root,
            text="🎰 幸运大转盘",
            font=("微软雅黑", 20, "bold"),
            fg="white",
            bg="#2c3e50"
        )
        title_label.pack(pady=15)

        # 转盘画布
        self.canvas = tk.Canvas(
            self.root,
            width=400,
            height=400,
            bg="#2c3e50",
            highlightthickness=0
        )
        self.canvas.pack(pady=10)
        
        # 绘制转盘
        self.draw_wheel()
        
        # 绘制指针
        self.draw_pointer()
        
        # 抽奖按钮
        self.spin_btn = tk.Button(
            self.root,
            text="🎯 开始抽奖",
            font=("微软雅黑", 14, "bold"),
            bg="#e74c3c",
            fg="white",
            width=15,
            height=2,
            cursor="hand2",
            command=self.start_spin
        )
        self.spin_btn.pack(pady=20)
        
        # 结果显示
        self.result_label = tk.Label(
            self.root,
            text="点击按钮开始抽奖吧！",
            font=("微软雅黑", 12),
            fg="#ecf0f1",
            bg="#2c3e50",
            wraplength=400
        )
        self.result_label.pack(pady=10)

    def draw_wheel(self):
        """绘制转盘"""
        self.canvas.delete("wheel")
        
        for i, (prize, color) in enumerate(self.prizes):
            # 计算扇形的起始和结束角度（考虑当前旋转角度）
            start_angle = i * self.angle_per_prize + self.current_angle
            end_angle = start_angle + self.angle_per_prize
            
            # 转换为弧度
            start_rad = math.radians(start_angle)
            end_rad = math.radians(end_angle)
            
            # 计算扇形的三个点
            points = [self.center_x, self.center_y]
            # 弧线上的点
            num_points = 20
            for j in range(num_points + 1):
                angle = start_rad + (end_rad - start_rad) * j / num_points
                x = self.center_x + self.radius * math.cos(angle)
                y = self.center_y + self.radius * math.sin(angle)
                points.extend([x, y])
            
            # 绘制扇形
            self.canvas.create_polygon(
                points,
                fill=color,
                outline="white",
                width=2,
                tags="wheel"
            )
            
            # 绘制文字
            text_angle = start_angle + self.angle_per_prize / 2
            text_rad = math.radians(text_angle)
            text_x = self.center_x + (self.radius * 0.65) * math.cos(text_rad)
            text_y = self.center_y + (self.radius * 0.65) * math.sin(text_rad)
            
            # 文字旋转角度
            text_display_angle = text_angle % 360
            if 90 < text_display_angle < 270:
                text_display_angle += 180
            
            self.canvas.create_text(
                text_x, text_y,
                text=prize,
                fill="white",
                font=("微软雅黑", 9, "bold"),
                angle=text_display_angle,
                tags="wheel"
            )
        
        # 绘制中心圆
        self.canvas.create_oval(
            self.center_x - 30, self.center_y - 30,
            self.center_x + 30, self.center_y + 30,
            fill="#34495e",
            outline="white",
            width=3,
            tags="wheel"
        )
        
        # 中心文字
        self.canvas.create_text(
            self.center_x, self.center_y,
            text="LUCKY",
            fill="white",
            font=("微软雅黑", 8, "bold"),
            tags="wheel"
        )

    def draw_pointer(self):
        """绘制指针"""
        self.canvas.delete("pointer")
        pointer_size = 25
        
        # 指针三角形（指向顶部）
        self.canvas.create_polygon(
            self.center_x - pointer_size, self.center_y - self.radius - 10,
            self.center_x + pointer_size, self.center_y - self.radius - 10,
            self.center_x, self.center_y - self.radius + 10,
            fill="#e74c3c",
            outline="white",
            width=2,
            tags="pointer"
        )

    def start_spin(self):
        """开始旋转"""
        if self.is_spinning:
            return
        
        self.is_spinning = True
        self.spin_btn.config(state="disabled")
        self.result_label.config(text="🎡 转盘旋转中...")
        
        # 随机选择奖项
        self.winning_index = random.randint(0, self.num_prizes - 1)
        
        # 计算目标角度（让指针指向选中的奖项）
        target_prize_center_angle = self.winning_index * self.angle_per_prize + self.angle_per_prize / 2
        target_angle = 270 - target_prize_center_angle
        
        # 加上若干圈旋转（3-5圈）
        rotations = random.randint(3, 5) * 360
        self.target_angle = self.current_angle + rotations + target_angle
        
        # 确保是正向旋转
        while self.target_angle < self.current_angle:
            self.target_angle += 360
        
        self.spin_animation()

    def spin_animation(self):
        """旋转动画"""
        if self.current_angle >= self.target_angle:
            self.current_angle = self.target_angle
            self.draw_wheel()
            self.spin_complete()
            return
        
        # 缓动函数：开始快，逐渐变慢
        progress = (self.current_angle - (self.target_angle - 360 * 5)) / (360 * 5)
        if progress < 0:
            progress = 0
        
        # 速度曲线
        speed = max(5, 30 * (1 - progress) ** 2)
        
        self.current_angle += speed
        if self.current_angle > self.target_angle:
            self.current_angle = self.target_angle
        
        self.draw_wheel()
        self.draw_pointer()
        
        # 继续动画
        delay = max(10, int(50 * (1 - progress)))
        self.root.after(delay, self.spin_animation)

    def spin_complete(self):
        """旋转完成"""
        self.is_spinning = False
        self.spin_btn.config(state="normal")
        
        prize_name = self.prizes[self.winning_index][0]
        
        if "谢谢" in prize_name:
            self.result_label.config(text=f"😢 很遗憾，{prize_name}", fg="#e74c3c")
        elif "特等奖" in prize_name:
            self.result_label.config(text=f"🎊 恭喜！获得{prize_name}！", fg="#f1c40f")
            messagebox.showinfo("🎊 恭喜！", f"你获得了{prize_name}！")
        else:
            self.result_label.config(text=f"🎉 恭喜！获得{prize_name}！", fg="#2ecc71")


if __name__ == "__main__":
    root = tk.Tk()
    app = LuckyWheel(root)
    root.mainloop()