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

class RPSGame:
    def __init__(self, root):
        self.root = root
        self.root.title("024. 石头剪子布")
        self.root.geometry("520x460")
        self.root.resizable(False, False)

        # ===== 数据 =====
        self.choices = ["石头", "剪刀", "布"]
        self.emojis = {"石头": "✊", "剪刀": "✌️", "布": "✋"}
        self.player_wins = 0
        self.computer_wins = 0
        self.draws = 0
        self.streak = 0
        self.max_streak = 0
        self.history = []  # 玩家出招历史

        self.build_ui()

    # ========== UI ==========
    def build_ui(self):
        # 标题
        tk.Label(
            self.root, text="✊ 石头 ✋ 剪子 ✌️ 布",
            font=("微软雅黑", 18, "bold")
        ).pack(pady=10)

        # 对战区
        battle = tk.Frame(self.root)
        battle.pack(pady=10)

        # 玩家
        player_frame = tk.LabelFrame(battle, text="你", font=("微软雅黑", 10))
        player_frame.grid(row=0, column=0, padx=30)
        self.player_label = tk.Label(player_frame, text="?", font=("Arial", 48))
        self.player_label.pack(padx=20, pady=10)

        # VS
        tk.Label(battle, text="VS", font=("微软雅黑", 16, "bold"), fg="red").grid(
            row=0, column=1, padx=10
        )

        # 电脑
        computer_frame = tk.LabelFrame(battle, text="电脑", font=("微软雅黑", 10))
        computer_frame.grid(row=0, column=2, padx=30)
        self.computer_label = tk.Label(computer_frame, text="?", font=("Arial", 48))
        self.computer_label.pack(padx=20, pady=10)

        # 结果显示
        self.result_label = tk.Label(
            self.root, text="等待出招...",
            font=("微软雅黑", 14, "bold"), fg="#1565C0"
        )
        self.result_label.pack(pady=5)

        # ===== 按钮区 =====
        btn_frame = tk.Frame(self.root)
        btn_frame.pack(pady=10)

        tk.Button(
            btn_frame, text="✊ 石头",
            width=10, height=2,
            font=("微软雅黑", 11),
            command=lambda: self.play("石头")
        ).pack(side=tk.LEFT, padx=5)

        tk.Button(
            btn_frame, text="✌️ 剪刀",
            width=10, height=2,
            font=("微软雅黑", 11),
            command=lambda: self.play("剪刀")
        ).pack(side=tk.LEFT, padx=5)

        tk.Button(
            btn_frame, text="✋ 布",
            width=10, height=2,
            font=("微软雅黑", 11),
            command=lambda: self.play("布")
        ).pack(side=tk.LEFT, padx=5)

        # ===== 统计区 =====
        stat_frame = tk.LabelFrame(self.root, text="📊 战绩统计", font=("微软雅黑", 10))
        stat_frame.pack(pady=10, padx=20, fill=tk.X)

        self.stat_text = tk.Label(
            stat_frame, text="", font=("Consolas", 10), justify=tk.LEFT
        )
        self.stat_text.pack(anchor="w", padx=10, pady=5)

        # 控制按钮
        control = tk.Frame(self.root)
        control.pack(pady=5)

        tk.Button(
            control, text="重置战绩",
            command=self.reset_stats
        ).pack(side=tk.LEFT, padx=10)

        tk.Button(
            control, text="规则说明",
            command=self.show_rules
        ).pack(side=tk.LEFT, padx=10)

        self.update_stats()

    # ========== 核心逻辑 ==========
    def play(self, player_choice):
        self.history.append(player_choice)
        if len(self.history) > 10:
            self.history.pop(0)

        computer_choice = self.ai_choose()

        # 显示出招
        self.player_label.config(text=self.emojis[player_choice])
        self.computer_label.config(text=self.emojis[computer_choice])

        # 判断胜负
        result = self.judge(player_choice, computer_choice)
        self.result_label.config(text=result)

        # 更新统计
        self.update_stats()

    def ai_choose(self):
        """
        简单AI策略：
        1. 前期：随机
        2. 后期：根据玩家最近出招习惯微调
        """
        if len(self.history) < 3:
            return random.choice(self.choices)

        # 统计玩家最近偏好
        recent = self.history[-3:]
        rock = recent.count("石头")
        scissors = recent.count("剪刀")
        paper = recent.count("布")

        # 如果玩家偏爱某个出招，克制它
        if rock > scissors and rock > paper:
            return "布"        # 布克石头
        elif scissors > rock and scissors > paper:
            return "石头"      # 石头克剪刀
        elif paper > rock and paper > scissors:
            return "剪刀"      # 剪刀克布

        # 否则随机
        return random.choice(self.choices)

    def judge(self, player, computer):
        if player == computer:
            self.draws += 1
            self.streak = 0
            return "平局！"

        win_map = {
            ("石头", "剪刀"): "胜利！",
            ("剪刀", "布"): "胜利！",
            ("布", "石头"): "胜利！",
        }

        if (player, computer) in win_map:
            self.player_wins += 1
            self.streak += 1
            self.max_streak = max(self.max_streak, self.streak)
            return f"你赢了！{self.emojis[player]} 克制 {self.emojis[computer]}"
        else:
            self.computer_wins += 1
            self.streak = 0
            return f"你输了！{self.emojis[computer]} 克制 {self.emojis[player]}"

    def update_stats(self):
        total = self.player_wins + self.computer_wins + self.draws
        win_rate = (self.player_wins / total * 100) if total > 0 else 0

        text = (
            f"总场次：{total}\n"
            f"胜利：{self.player_wins}  失败：{self.computer_wins}  平局：{self.draws}\n"
            f"胜率：{win_rate:.1f}%\n"
            f"当前连胜：{self.streak}  最高连胜：{self.max_streak}"
        )
        self.stat_text.config(text=text)

    def reset_stats(self):
        if messagebox.askyesno("确认", "确定要重置所有战绩吗？"):
            self.player_wins = 0
            self.computer_wins = 0
            self.draws = 0
            self.streak = 0
            self.max_streak = 0
            self.history.clear()
            self.result_label.config(text="等待出招...")
            self.player_label.config(text="?")
            self.computer_label.config(text="?")
            self.update_stats()

    def show_rules(self):
        rules = (
            "【游戏规则】\n\n"
            "✊ 石头 克 ✌️ 剪刀\n"
            "✌️ 剪刀 克 ✋ 布\n"
            "✋ 布   克 ✊ 石头\n\n"
            "【AI说明】\n"
            "电脑会记住你最近的出招习惯，\n"
            "并尝试克制你的偏好哦～"
        )
        messagebox.showinfo("规则说明", rules)


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