"""
石头剪刀布 · 终极版
纯 Tkinter 实现，无需任何外部依赖
"""

import tkinter as tk
from tkinter import ttk, messagebox
import random
from collections import Counter
import time

# ── 全局配置 ──
config = {
    "difficulty": "medium",
    "max_rounds": 5,
    "time_limit": 30,
    "combo_bonus": True,
    "theme": "dark"
}

# ── 颜色主题 ──
THEMES = {
    "dark": {
        "bg": "#2d2d37",
        "fg": "#f0f2fc",
        "accent": "#ffc34a",
        "card_bg": "#3a3a48",
        "btn_bg": "#4a4a5a",
        "highlight": "#5a5a6a"
    },
    "light": {
        "bg": "#ebedf5",
        "fg": "#1e1e2a",
        "accent": "#3366cc",
        "card_bg": "#ffffff",
        "btn_bg": "#d8dbe8",
        "highlight": "#c5c8d8"
    }
}


class RPSGame:
    def __init__(self):
        self.root = tk.Tk()
        self.root.title("🪨 ✂️ 📄 石头剪刀布 · 终极版")
        self.root.geometry("800x680")
        self.root.resizable(False, False)
        self.root.protocol("WM_DELETE_WINDOW", self.on_close)

        # 游戏状态
        self.mode = "normal"
        self.player_score = 0
        self.computer_score = 0
        self.round = 0
        self.combo = 0
        self.best_combo = 0
        self.history = []
        self.player_choice = None
        self.computer_choice = None
        self.timer_running = False
        self.timer_start = 0
        self.timer_id = None

        self.choices = ["石头", "剪刀", "布"]
        self.emojis = {"石头": "🪨", "剪刀": "✂️", "布": "📄"}
        self.win_rules = {("石头", "剪刀"), ("剪刀", "布"), ("布", "石头")}

        self.current_theme = "dark"
        self.colors = THEMES[self.current_theme]

        self.build_main_menu()

    # ══════════════════════════════════════
    #  工具方法
    # ══════════════════════════════════════

    def get_colors(self):
        return THEMES[config["theme"]]

    def clear_window(self):
        for widget in self.root.winfo_children():
            widget.destroy()

    def create_styled_button(self, parent, text, command, width=18, height=2, 
                              bg=None, fg=None, font_size=12):
        colors = self.get_colors()
        if bg is None:
            bg = colors["btn_bg"]
        if fg is None:
            fg = colors["fg"]
        return tk.Button(
            parent, text=text, command=command,
            width=width, height=height,
            bg=bg, fg=fg,
            font=("Microsoft YaHei", font_size, "bold"),
            relief="flat", bd=0,
            activebackground=colors["highlight"],
            activeforeground=fg,
            cursor="hand2"
        )

    def create_card(self, parent, text, bg=None, fg=None, font_size=14, width=30, height=3):
        colors = self.get_colors()
        if bg is None:
            bg = colors["card_bg"]
        if fg is None:
            fg = colors["fg"]
        return tk.Label(
            parent, text=text,
            bg=bg, fg=fg,
            font=("Microsoft YaHei", font_size),
            width=width, height=height,
            relief="ridge", bd=2
        )

    # ══════════════════════════════════════
    #  AI 逻辑
    # ══════════════════════════════════════

    def ai_pick(self):
        difficulty = config["difficulty"]
        if difficulty == "easy":
            return random.choice(self.choices)
        elif difficulty == "hard" and len(self.history) >= 3:
            recent = [h[0] for h in self.history[-3:]]
            guess = Counter(recent).most_common(1)[0][0]
            return {"石头": "布", "剪刀": "石头", "布": "剪刀"}[guess]
        else:
            if self.history and random.random() < 0.4:
                last = self.history[-1][0]
                return {"石头": "布", "剪刀": "石头", "布": "剪刀"}[last]
            return random.choice(self.choices)

    def judge(self, player, computer):
        if player == computer:
            return "平局"
        if (player, computer) in self.win_rules:
            return "玩家胜"
        return "电脑胜"

    def make_choice(self, choice):
        self.player_choice = choice
        self.computer_choice = self.ai_pick()
        result = self.judge(choice, self.computer_choice)
        self.round += 1
        self.history.append((choice, self.computer_choice, result))

        if result == "玩家胜":
            bonus = self.combo if config["combo_bonus"] else 0
            self.player_score += 1 + bonus
            self.combo += 1
            self.best_combo = max(self.best_combo, self.combo)
            result_msg = f"🎉 你赢了！"
            if self.combo >= 2:
                result_msg += f" 连击 x{self.combo} 🔥"
        elif result == "电脑胜":
            self.computer_score += 1
            self.combo = 0
            result_msg = "💻 电脑赢了"
        else:
            result_msg = "🤝 平局"

        self.show_result(result_msg)

    def show_result(self, msg):
        self.clear_window()
        colors = self.get_colors()
        self.root.configure(bg=colors["bg"])

        # 标题
        tk.Label(self.root, text="结果", font=("Microsoft YaHei", 22, "bold"),
                 bg=colors["bg"], fg=colors["accent"]).pack(pady=20)

        # 结果消息
        tk.Label(self.root, text=msg, font=("Microsoft YaHei", 18),
                 bg=colors["bg"], fg=colors["fg"]).pack(pady=10)

        # 双方出拳
        frame = tk.Frame(self.root, bg=colors["bg"])
        frame.pack(pady=15)
        
        player_text = f"你: {self.emojis[self.player_choice]} {self.player_choice}"
        computer_text = f"电脑: {self.emojis[self.computer_choice]} {self.computer_choice}"
        
        tk.Label(frame, text=player_text, font=("Microsoft YaHei", 16),
                 bg=colors["bg"], fg=colors["fg"]).pack(pady=5)
        tk.Label(frame, text=computer_text, font=("Microsoft YaHei", 16),
                 bg=colors["bg"], fg=colors["fg"]).pack(pady=5)

        # 比分
        score_text = f"比分: 你 {self.player_score} : {self.computer_score} 电脑"
        tk.Label(self.root, text=score_text, font=("Microsoft YaHei", 16),
                 bg=colors["bg"], fg=colors["fg"]).pack(pady=10)

        # 检查比赛是否结束
        if self.check_match_over():
            self.show_match_over()
        else:
            btn_frame = tk.Frame(self.root, bg=colors["bg"])
            btn_frame.pack(pady=20)
            self.create_styled_button(btn_frame, "▶️ 继续", self.play_round,
                                      width=12, bg="#44aa66").pack(side="left", padx=10)
            self.create_styled_button(btn_frame, "🏠 菜单", self.back_to_menu,
                                      width=12, bg="#bb4444").pack(side="left", padx=10)

    def check_match_over(self):
        if self.mode == "normal":
            return True
        elif self.mode == "best_of":
            need = config["max_rounds"] // 2 + 1
            return self.player_score >= need or self.computer_score >= need
        elif self.mode == "time_attack":
            if self.timer_running:
                elapsed = time.time() - self.timer_start
                return elapsed >= config["time_limit"]
        return False

    def show_match_over(self):
        colors = self.get_colors()
        self.clear_window()
        self.root.configure(bg=colors["bg"])

        tk.Label(self.root, text="🏆 比赛结束 🏆", font=("Microsoft YaHei", 24, "bold"),
                 bg=colors["bg"], fg=colors["accent"]).pack(pady=30)

        if self.player_score > self.computer_score:
            msg = "🎊 恭喜你赢得比赛！"
        elif self.player_score < self.computer_score:
            msg = "😅 电脑获胜，再接再厉！"
        else:
            msg = "🤝 平局！"
        
        tk.Label(self.root, text=msg, font=("Microsoft YaHei", 18),
                 bg=colors["bg"], fg=colors["fg"]).pack(pady=10)

        score_text = f"最终比分: {self.player_score} : {self.computer_score}"
        tk.Label(self.root, text=score_text, font=("Microsoft YaHei", 16),
                 bg=colors["bg"], fg=colors["fg"]).pack(pady=10)

        if self.best_combo >= 2:
            tk.Label(self.root, text=f"🔥 最高连击: x{self.best_combo}",
                     font=("Microsoft YaHei", 14),
                     bg=colors["bg"], fg="#ffcc00").pack(pady=5)

        btn_frame = tk.Frame(self.root, bg=colors["bg"])
        btn_frame.pack(pady=25)
        self.create_styled_button(btn_frame, "🔄 再来一局", lambda: self.start_mode(self.mode),
                                  width=14, bg="#44aa66").pack(side="left", padx=10)
        self.create_styled_button(btn_frame, "🏠 菜单", self.back_to_menu,
                                  width=14, bg="#4477cc").pack(side="left", padx=10)
        self.create_styled_button(btn_frame, "📊 战绩", self.show_stats,
                                  width=14, bg="#cc8833").pack(side="left", padx=10)

    # ══════════════════════════════════════
    #  主菜单
    # ══════════════════════════════════════

    def build_main_menu(self):
        self.clear_window()
        colors = self.get_colors()
        self.root.configure(bg=colors["bg"])

        # 标题
        tk.Label(self.root, text="🪨 ✂️ 📄", font=("Microsoft YaHei", 40),
                 bg=colors["bg"], fg=colors["accent"]).pack(pady=(30, 5))
        tk.Label(self.root, text="石头剪刀布 · 终极版", font=("Microsoft YaHei", 22, "bold"),
                 bg=colors["bg"], fg=colors["fg"]).pack(pady=5)

        # 菜单按钮
        btn_frame = tk.Frame(self.root, bg=colors["bg"])
        btn_frame.pack(pady=30)

        menu_items = [
            ("🎯 普通模式 (1局)", lambda: self.start_mode("normal"), "#55aa66"),
            ("🏆 五局三胜", lambda: self.start_mode("best_of"), "#5588cc"),
            ("♾️ 无限对战", lambda: self.start_mode("endless"), "#9955bb"),
            ("⏱️ 限时挑战", lambda: self.start_mode("time_attack"), "#cc5544"),
        ]

        for text, cmd, color in menu_items:
            self.create_styled_button(btn_frame, text, cmd, width=22, height=1,
                                      bg=color, font_size=14).pack(pady=8)

        # 底部功能按钮
        bottom_frame = tk.Frame(self.root, bg=colors["bg"])
        bottom_frame.pack(pady=20)

        self.create_styled_button(bottom_frame, "⚙️ 设置", self.open_settings,
                                  width=10, bg="#888899").pack(side="left", padx=8)
        self.create_styled_button(bottom_frame, "📊 战绩", self.show_stats,
                                  width=10, bg="#888899").pack(side="left", padx=8)
        self.create_styled_button(bottom_frame, "🚪 退出", self.on_close,
                                  width=10, bg="#666677").pack(side="left", padx=8)

    # ══════════════════════════════════════
    #  开始模式
    # ══════════════════════════════════════

    def start_mode(self, mode):
        self.mode = mode
        self.player_score = 0
        self.computer_score = 0
        self.round = 0
        self.combo = 0
        self.history = []

        if mode == "time_attack":
            self.timer_running = True
            self.timer_start = time.time()
            self.play_time_attack()
        else:
            self.play_round()

    def play_round(self):
        self.clear_window()
        colors = self.get_colors()
        self.root.configure(bg=colors["bg"])

        # 顶部信息
        info_frame = tk.Frame(self.root, bg=colors["bg"])
        info_frame.pack(fill="x", padx=20, pady=10)

        mode_names = {"normal": "普通模式", "best_of": "五局三胜",
                      "endless": "无限对战", "time_attack": "限时挑战"}
        mode_text = f"模式: {mode_names[self.mode]}"
        if self.mode == "best_of":
            mode_text += f" (第 {self.round + 1} 局)"
        
        tk.Label(info_frame, text=mode_text, font=("Microsoft YaHei", 12),
                 bg=colors["bg"], fg=colors["accent"]).pack(anchor="w")

        # 比分
        score_text = f"你 {self.player_score}  :  {self.computer_score} 电脑"
        tk.Label(self.root, text=score_text, font=("Microsoft YaHei", 16, "bold"),
                 bg=colors["bg"], fg=colors["fg"]).pack(pady=5)

        # 连击
        if self.combo >= 2:
            tk.Label(self.root, text=f"🔥 连击 x{self.combo}",
                     font=("Microsoft YaHei", 14),
                     bg=colors["bg"], fg="#ffcc00").pack()

        # 提示
        tk.Label(self.root, text="请选择你的出拳 👇", font=("Microsoft YaHei", 14),
                 bg=colors["bg"], fg=colors["fg"]).pack(pady=15)

        # 三个选择按钮
        btn_frame = tk.Frame(self.root, bg=colors["bg"])
        btn_frame.pack(pady=10)

        choice_colors = [("#cc5555", "🪨"), ("#55aa55", "✂️"), ("#5577cc", "📄")]
        for i, (color, emoji) in enumerate(choice_colors):
            choice = self.choices[i]
            btn = tk.Button(
                btn_frame, text=f"{emoji}\n{choice}",
                command=lambda c=choice: self.make_choice(c),
                width=8, height=3,
                bg=color, fg="white",
                font=("Microsoft YaHei", 16, "bold"),
                relief="flat", bd=0,
                cursor="hand2"
            )
            btn.pack(side="left", padx=15)

        # 底部按钮
        bottom_frame = tk.Frame(self.root, bg=colors["bg"])
        bottom_frame.pack(side="bottom", pady=15)
        self.create_styled_button(bottom_frame, "🏠 菜单", self.back_to_menu,
                                  width=10, bg="#bb4444").pack(side="left", padx=8)
        self.create_styled_button(bottom_frame, "🔄 重开", lambda: self.start_mode(self.mode),
                                  width=10, bg="#8844aa").pack(side="left", padx=8)

    def play_time_attack(self):
        self.clear_window()
        colors = self.get_colors()
        self.root.configure(bg=colors["bg"])

        # 倒计时
        self.timer_label = tk.Label(self.root, text="", font=("Microsoft YaHei", 28, "bold"),
                                    bg=colors["bg"], fg="#ff4444")
        self.timer_label.pack(pady=10)

        # 比分
        self.score_label = tk.Label(self.root, text=f"你 0  :  0 电脑",
                                    font=("Microsoft YaHei", 16, "bold"),
                                    bg=colors["bg"], fg=colors["fg"])
        self.score_label.pack(pady=5)

        # 提示
        tk.Label(self.root, text="快速出拳！⏱️", font=("Microsoft YaHei", 14),
                 bg=colors["bg"], fg=colors["fg"]).pack(pady=10)

        # 选择按钮
        btn_frame = tk.Frame(self.root, bg=colors["bg"])
        btn_frame.pack(pady=15)

        choice_colors = [("#cc5555", "🪨"), ("#55aa55", "✂️"), ("#5577cc", "📄")]
        for i, (color, emoji) in enumerate(choice_colors):
            choice = self.choices[i]
            btn = tk.Button(
                btn_frame, text=f"{emoji}\n{choice}",
                command=lambda c=choice: self.time_attack_choice(c),
                width=8, height=3,
                bg=color, fg="white",
                font=("Microsoft YaHei", 16, "bold"),
                relief="flat", bd=0,
                cursor="hand2"
            )
            btn.pack(side="left", padx=15)

        # 更新倒计时
        self.update_timer()

    def update_timer(self):
        if not self.timer_running:
            return

        elapsed = time.time() - self.timer_start
        remaining = max(0, config["time_limit"] - int(elapsed))

        if remaining <= 0:
            self.timer_running = False
            self.show_match_over()
            return

        colors = self.get_colors()
        timer_color = "#ff4444" if remaining <= 10 else colors["accent"]
        self.timer_label.config(text=f"⏱️ {remaining}s", fg=timer_color)
        self.score_label.config(text=f"你 {self.player_score}  :  {self.computer_score} 电脑")

        self.timer_id = self.root.after(1000, self.update_timer)

    def time_attack_choice(self, choice):
        if not self.timer_running:
            return
        self.player_choice = choice
        self.computer_choice = self.ai_pick()
        result = self.judge(choice, self.computer_choice)
        self.round += 1
        self.history.append((choice, self.computer_choice, result))

        if result == "玩家胜":
            bonus = self.combo if config["combo_bonus"] else 0
            self.player_score += 1 + bonus
            self.combo += 1
            self.best_combo = max(self.best_combo, self.combo)
        elif result == "电脑胜":
            self.computer_score += 1
            self.combo = 0

        # 直接更新界面，不跳转结果页（节省时间）
        self.score_label.config(text=f"你 {self.player_score}  :  {self.computer_score} 电脑")

    # ══════════════════════════════════════
    #  设置界面
    # ══════════════════════════════════════

    def open_settings(self):
        settings_window = tk.Toplevel(self.root)
        settings_window.title("⚙️ 设置")
        settings_window.geometry("450x520")
        settings_window.resizable(False, False)
        settings_window.configure(bg="#2d2d37")

        main_frame = tk.Frame(settings_window, bg="#2d2d37", padx=25, pady=20)
        main_frame.pack(fill="both", expand=True)

        tk.Label(main_frame, text="⚙️ 游戏设置", font=("Microsoft YaHei", 18, "bold"),
                 bg="#2d2d37", fg="#ffc34a").pack(pady=(0, 15))

        # 难度
        tk.Label(main_frame, text="难度", font=("Microsoft YaHei", 12),
                 bg="#2d2d37", fg="white").pack(anchor="w")
        diff_frame = tk.Frame(main_frame, bg="#2d2d37")
        diff_frame.pack(fill="x", pady=5)
        
        diff_var = tk.StringVar(value=config["difficulty"])
        for text, value in [("简单", "easy"), ("中等", "medium"), ("困难", "hard")]:
            tk.Radiobutton(diff_frame, text=text, variable=diff_var, value=value,
                           bg="#2d2d37", fg="white", selectcolor="#444455",
                           font=("Microsoft YaHei", 11)).pack(side="left", padx=10)

        # 轮数
        tk.Label(main_frame, text="五局三胜轮数", font=("Microsoft YaHei", 12),
                 bg="#2d2d37", fg="white").pack(anchor="w", pady=(10, 0))
        round_frame = tk.Frame(main_frame, bg="#2d2d37")
        round_frame.pack(fill="x", pady=5)
        
        round_var = tk.IntVar(value=config["max_rounds"])
        round_scale = tk.Scale(round_frame, from_=3, to=15, orient="horizontal",
                               variable=round_var, bg="#3a3a48", fg="white",
                               troughcolor="#555566", highlightthickness=0,
                               length=250)
        round_scale.pack(side="left")
        round_value = tk.Label(round_frame, text=str(round_var.get()),
                               bg="#2d2d37", fg="white", font=("Microsoft YaHei", 12))
        round_value.pack(side="left", padx=10)
        def update_round(*_):
            v = round_var.get()
            if v % 2 == 0:
                v += 1
                round_var.set(v)
            round_value.config(text=str(v))
        round_var.trace("w", update_round)

        # 限时
        tk.Label(main_frame, text="限时 (秒)", font=("Microsoft YaHei", 12),
                 bg="#2d2d37", fg="white").pack(anchor="w", pady=(10, 0))
        time_frame = tk.Frame(main_frame, bg="#2d2d37")
        time_frame.pack(fill="x", pady=5)
        
        time_var = tk.IntVar(value=config["time_limit"])
        time_scale = tk.Scale(time_frame, from_=10, to=60, orient="horizontal",
                              variable=time_var, bg="#3a3a48", fg="white",
                              troughcolor="#555566", highlightthickness=0,
                              length=250)
        time_scale.pack(side="left")
        time_value = tk.Label(time_frame, text=str(time_var.get()),
                              bg="#2d2d37", fg="white", font=("Microsoft YaHei", 12))
        time_value.pack(side="left", padx=10)
        time_var.trace("w", lambda *_: time_value.config(text=str(time_var.get())))

        # 连击加分
        combo_var = tk.BooleanVar(value=config["combo_bonus"])
        tk.Checkbutton(main_frame, text="连击加分奖励", variable=combo_var,
                       bg="#2d2d37", fg="white", selectcolor="#444455",
                       font=("Microsoft YaHei", 12)).pack(anchor="w", pady=10)

        # 按钮
        btn_frame = tk.Frame(main_frame, bg="#2d2d37")
        btn_frame.pack(pady=20)

        def save_settings():
            config["difficulty"] = diff_var.get()
            config["max_rounds"] = round_var.get()
            config["time_limit"] = time_var.get()
            config["combo_bonus"] = combo_var.get()
            messagebox.showinfo("已保存", "设置已生效 ✅")
            settings_window.destroy()

        tk.Button(btn_frame, text="💾 保存", command=save_settings,
                  bg="#44aa66", fg="white", font=("Microsoft YaHei", 12, "bold"),
                  width=10, relief="flat", cursor="hand2").pack(side="left", padx=8)
        tk.Button(btn_frame, text="❌ 取消", command=settings_window.destroy,
                  bg="#bb4444", fg="white", font=("Microsoft YaHei", 12, "bold"),
                  width=10, relief="flat", cursor="hand2").pack(side="left", padx=8)

    # ══════════════════════════════════════
    #  战绩统计
    # ══════════════════════════════════════

    def show_stats(self):
        stats_window = tk.Toplevel(self.root)
        stats_window.title("📊 战绩统计")
        stats_window.geometry("400x380")
        stats_window.resizable(False, False)
        stats_window.configure(bg="#2d2d37")

        main_frame = tk.Frame(stats_window, bg="#2d2d37", padx=25, pady=20)
        main_frame.pack(fill="both", expand=True)

        tk.Label(main_frame, text="📊 对战统计", font=("Microsoft YaHei", 18, "bold"),
                 bg="#2d2d37", fg="#ffc34a").pack(pady=(0, 15))

        total = len(self.history)
        win = sum(1 for _, _, r in self.history if r == "玩家胜")
        lose = sum(1 for _, _, r in self.history if r == "电脑胜")
        draw = sum(1 for _, _, r in self.history if r == "平局")
        win_rate = (win / total * 100) if total > 0 else 0

        stats_text = (
            f"总对局: {total}\n\n"
            f"胜利: {win}    失败: {lose}    平局: {draw}\n\n"
            f"胜率: {win_rate:.1f}%\n\n"
            f"当前比分: {self.player_score} : {self.computer_score}\n\n"
            f"最高连击: x{self.best_combo}"
        )

        tk.Label(main_frame, text=stats_text, font=("Microsoft YaHei", 13),
                 bg="#2d2d37", fg="white", justify="left").pack(pady=10)

        # 出拳偏好
        if self.history:
            player_choices = [h[0] for h in self.history]
            freq = Counter(player_choices)
            most = freq.most_common(1)[0]
            tk.Label(main_frame, text=f"最常出: {most[0]} ({most[1]}次)",
                     font=("Microsoft YaHei", 12),
                     bg="#2d2d37", fg="#ffc34a").pack(pady=5)

        tk.Button(main_frame, text="关闭", command=stats_window.destroy,
                  bg="#555566", fg="white", font=("Microsoft YaHei", 12),
                  width=12, relief="flat", cursor="hand2").pack(pady=15)

    # ══════════════════════════════════════
    #  导航
    # ══════════════════════════════════════

    def back_to_menu(self):
        if self.timer_running:
            self.timer_running = False
            if self.timer_id:
                self.root.after_cancel(self.timer_id)
        self.build_main_menu()

    def on_close(self):
        if self.timer_running:
            self.timer_running = False
            if self.timer_id:
                self.root.after_cancel(self.timer_id)
        self.root.destroy()

    def run(self):
        self.root.mainloop()


if __name__ == "__main__":
    game = RPSGame()
    game.run()