import tkinter as tk
from tkinter import messagebox
import random

class SnakeGame:
    def __init__(self, master):
        self.master = master
        self.master.title("贪吃蛇游戏")
        self.master.geometry("600x500")
        self.master.resizable(False, False)
        
        # 游戏参数设置
        self.cell_size = 20
        self.width = 30
        self.height = 20
        self.speed = 150  # 移动速度(毫秒)
        
        # 初始化界面
        self.create_widgets()
        self.init_game()
        
        # 绑定键盘事件
        self.master.bind('<Key>', self.on_key_press)
        self.master.bind('<F5>', self.restart_game)

    def create_widgets(self):
        # 游戏画布
        self.canvas = tk.Canvas(
            self.master,
            width=self.width*self.cell_size,
            height=self.height*self.cell_size,
            bg="black"
        )
        self.canvas.pack(pady=20)

        # 控制面板
        control_frame = tk.Frame(self.master)
        control_frame.pack()

        self.start_btn = tk.Button(
            control_frame,
            text="开始游戏",
            command=self.start_game
        )
        self.start_btn.pack(side=tk.LEFT, padx=10)

        self.restart_btn = tk.Button(
            control_frame,
            text="重新开始",
            command=self.restart_game,
            state=tk.DISABLED
        )
        self.restart_btn.pack(side=tk.LEFT, padx=10)

        # 得分显示
        self.score_label = tk.Label(
            self.master,
            text="得分: 0",
            font=("Arial", 14)
        )
        self.score_label.pack(pady=5)

    def init_game(self):
        # 初始化游戏状态
        self.direction = "Right"
        self.next_direction = "Right"
        self.snake = [(5, 5), (4, 5), (3, 5)]
        self.food = None
        self.score = 0
        self.game_running = False
        self.create_food()
        self.draw()

    def draw(self):
        self.canvas.delete("all")
        
        # 绘制蛇
        for x, y in self.snake:
            self.canvas.create_rectangle(
                x*self.cell_size, y*self.cell_size,
                (x+1)*self.cell_size, (y+1)*self.cell_size,
                fill="green", outline="darkgreen"
            )
        
        # 绘制食物
        if self.food:
            x, y = self.food
            self.canvas.create_oval(
                x*self.cell_size, y*self.cell_size,
                (x+1)*self.cell_size, (y+1)*self.cell_size,
                fill="red", outline="darkred"
            )

    def create_food(self):
        while True:
            x = random.randint(0, self.width-1)
            y = random.randint(0, self.height-1)
            if (x, y) not in self.snake:
                self.food = (x, y)
                break

    def move_snake(self):
        if not self.game_running:
            return

        # 更新方向
        self.direction = self.next_direction
        
        # 计算新头部位置
        head_x, head_y = self.snake[0]
        if self.direction == "Up":
            new_head = (head_x, head_y - 1)
        elif self.direction == "Down":
            new_head = (head_x, head_y + 1)
        elif self.direction == "Left":
            new_head = (head_x - 1, head_y)
        else:  # Right
            new_head = (head_x + 1, head_y)

        # 碰撞检测
        if (new_head in self.snake or
            new_head[0] < 0 or new_head[0] >= self.width or
            new_head[1] < 0 or new_head[1] >= self.height):
            self.game_over()
            return

        self.snake.insert(0, new_head)

        # 吃食物检测
        if new_head == self.food:
            self.score += 10
            self.score_label.config(text=f"得分: {self.score}")
            self.create_food()
        else:
            self.snake.pop()

        self.draw()
        self.master.after(self.speed, self.move_snake)

    def on_key_press(self, event):
        key = event.keysym
        if (key in ["Up", "Down", "Left", "Right"] and
            not ((self.direction == "Up" and key == "Down") or
                 (self.direction == "Down" and key == "Up") or
                 (self.direction == "Left" and key == "Right") or
                 (self.direction == "Right" and key == "Left"))):
            self.next_direction = key

    def start_game(self):
        if not self.game_running:
            self.game_running = True
            self.start_btn.config(state=tk.DISABLED)
            self.restart_btn.config(state=tk.NORMAL)
            self.move_snake()

    def restart_game(self, event=None):
        self.game_running = False
        self.init_game()
        self.start_btn.config(state=tk.NORMAL)
        self.restart_btn.config(state=tk.DISABLED)
        self.score_label.config(text="得分: 0")
        self.draw()

    def game_over(self):
        self.game_running = False
        self.canvas.create_text(
            self.width*self.cell_size/2,
            self.height*self.cell_size/2,
            text="游戏结束编程论坛你胜利了!",
            fill="white",
            font=("Arial", 24)
        )
        self.start_btn.config(state=tk.DISABLED)
        self.restart_btn.config(state=tk.NORMAL)

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