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

class RockPaperScissorsApp:
    def __init__(self, root):
        self.root = root
        self.root.title("石头剪子布小游戏")
        self.root.geometry("700x500")
        self.root.resizable(False, False)
        
        # 游戏状态
        self.player_score = 0  # 玩家得分
        self.computer_score = 0  # 电脑得分
        self.tie_count = 0  # 平局数
        
        # 选项映射（便于判断胜负）
        self.choices = {
            "石头": 0,
            "剪子": 1,
            "布": 2
        }
        # 结果文本
        self.result_texts = {
            "win": "🎉 你赢了！",
            "lose": "😢 电脑赢了！",
            "tie": "🤝 平局！"
        }
        # 选项对应的图标文本（增强视觉效果）
        self.icon_texts = {
            "石头": "🪨",
            "剪子": "✂️",
            "布": "📜"
        }
        
        # 设置字体
        self.font_large = ("微软雅黑", 20, "bold")
        self.font_medium = ("微软雅黑", 16)
        self.font_small = ("微软雅黑", 12)
        
        # 初始化界面
        self.setup_ui()

    def setup_ui(self):
        """搭建游戏界面"""
        # 1. 标题区域
        title_frame = ttk.Frame(self.root, padding="10")
        title_frame.pack(fill=tk.X, padx=10, pady=10)
        
        title_label = ttk.Label(title_frame, text="石头 🪨 剪子 ✂️ 布 📜", font=self.font_large)
        title_label.pack()
        
        # 2. 比分统计区域
        score_frame = ttk.Frame(self.root, padding="10")
        score_frame.pack(fill=tk.X, padx=20, pady=5)
        
        # 玩家比分
        self.player_score_label = ttk.Label(
            score_frame, 
            text=f"玩家: {self.player_score}", 
            font=self.font_medium
        )
        self.player_score_label.grid(row=0, column=0, padx=40)
        
        # 平局数
        self.tie_label = ttk.Label(
            score_frame, 
            text=f"平局: {self.tie_count}", 
            font=self.font_medium
        )
        self.tie_label.grid(row=0, column=1, padx=40)
        
        # 电脑比分
        self.computer_score_label = ttk.Label(
            score_frame, 
            text=f"电脑: {self.computer_score}", 
            font=self.font_medium
        )
        self.computer_score_label.grid(row=0, column=2, padx=40)
        
        # 3. 选择区域
        choice_frame = ttk.Frame(self.root, padding="10")
        choice_frame.pack(fill=tk.X, padx=20, pady=20)
        
        ttk.Label(choice_frame, text="请选择你的出招：", font=self.font_medium).pack(pady=5)
        
        # 出招按钮
        btn_frame = ttk.Frame(choice_frame)
        btn_frame.pack(pady=10)
        
        # 石头按钮
        rock_btn = ttk.Button(
            btn_frame,
            text=f"石头 {self.icon_texts['石头']}",
            command=lambda: self.play_game("石头"),
            width=15
        )
        rock_btn.grid(row=0, column=0, padx=10)
        
        # 剪子按钮
        scissors_btn = ttk.Button(
            btn_frame,
            text=f"剪子 {self.icon_texts['剪子']}",
            command=lambda: self.play_game("剪子"),
            width=15
        )
        scissors_btn.grid(row=0, column=1, padx=10)
        
        # 布按钮
        paper_btn = ttk.Button(
            btn_frame,
            text=f"布 {self.icon_texts['布']}",
            command=lambda: self.play_game("布"),
            width=15
        )
        paper_btn.grid(row=0, column=2, padx=10)
        
        # 4. 对战结果区域
        result_frame = ttk.Frame(self.root, padding="10", relief=tk.RAISED, borderwidth=2)
        result_frame.pack(fill=tk.BOTH, expand=True, padx=20, pady=10)
        
        # 对战展示
        self.battle_label = ttk.Label(
            result_frame,
            text="等待你的选择...",
            font=self.font_large,
            justify=tk.CENTER
        )
        self.battle_label.pack(pady=20)
        
        # 结果展示
        self.result_label = ttk.Label(
            result_frame,
            text="",
            font=self.font_large,
            justify=tk.CENTER
        )
        self.result_label.pack(pady=10)
        
        # 5. 功能按钮区域
        func_btn_frame = ttk.Frame(self.root, padding="10")
        func_btn_frame.pack(fill=tk.X, padx=20, pady=5)
        
        # 重置比分按钮
        reset_btn = ttk.Button(
            func_btn_frame,
            text="重置比分",
            command=self.reset_score,
            width=15
        )
        reset_btn.pack(side=tk.LEFT, padx=20)
        
        # 退出按钮
        exit_btn = ttk.Button(
            func_btn_frame,
            text="退出游戏",
            command=self.root.quit,
            width=15
        )
        exit_btn.pack(side=tk.RIGHT, padx=20)

    def get_computer_choice(self):
        """电脑随机选择"""
        return random.choice(list(self.choices.keys()))

    def judge_winner(self, player_choice, computer_choice):
        """判断胜负"""
        player_val = self.choices[player_choice]
        computer_val = self.choices[computer_choice]
        
        # 判断规则：石头(0)赢剪子(1)，剪子(1)赢布(2)，布(2)赢石头(0)
        if player_val == computer_val:
            return "tie"
        elif (player_val == 0 and computer_val == 1) or \
             (player_val == 1 and computer_val == 2) or \
             (player_val == 2 and computer_val == 0):
            return "win"
        else:
            return "lose"

    def play_game(self, player_choice):
        """开始一局游戏"""
        # 电脑选择
        computer_choice = self.get_computer_choice()
        
        # 判断胜负
        result = self.judge_winner(player_choice, computer_choice)
        
        # 更新比分
        if result == "win":
            self.player_score += 1
        elif result == "lose":
            self.computer_score += 1
        else:
            self.tie_count += 1
        
        # 更新界面显示
        self.update_display(player_choice, computer_choice, result)

    def update_display(self, player_choice, computer_choice, result):
        """更新界面展示"""
        # 更新对战信息
        battle_text = f"你出了：{player_choice} {self.icon_texts[player_choice]}\n电脑出了：{computer_choice} {self.icon_texts[computer_choice]}"
        self.battle_label.config(text=battle_text)
        
        # 更新结果信息
        self.result_label.config(text=self.result_texts[result])
        
        # 更新比分统计
        self.player_score_label.config(text=f"玩家: {self.player_score}")
        self.computer_score_label.config(text=f"电脑: {self.computer_score}")
        self.tie_label.config(text=f"平局: {self.tie_count}")

    def reset_score(self):
        """重置比分"""
        if messagebox.askyesno("确认", "确定要重置所有比分吗？"):
            self.player_score = 0
            self.computer_score = 0
            self.tie_count = 0
            
            # 更新界面
            self.player_score_label.config(text=f"玩家: {self.player_score}")
            self.computer_score_label.config(text=f"电脑: {self.computer_score}")
            self.tie_label.config(text=f"平局: {self.tie_count}")
            
            # 清空对战结果
            self.battle_label.config(text="等待你的选择...")
            self.result_label.config(text="")
            
            messagebox.showinfo("提示", "比分已重置！")

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