import tkinter as tk
import random

# 窗口设置
WIDTH, HEIGHT = 500, 600
PLAYER_SIZE = 30      # 玩家尺寸
OBSTACLE_SIZE = 25    # 障碍物尺寸
SPEED = 5             # 玩家移动速度
OBSTACLE_SPEED = 3    # 障碍物下落速度
SPAWN_INTERVAL = 30   # 每隔多少帧生成一个障碍物

class FlyGame:
    def __init__(self, root):
        self.root = root
        self.root.title("飞行躲避")
        self.canvas = tk.Canvas(root, width=WIDTH, height=HEIGHT, bg="skyblue")
        self.canvas.pack()

        # 玩家（用三角形表示飞机）
        self.player = self.canvas.create_polygon(
            WIDTH//2 - PLAYER_SIZE//2, HEIGHT-50,
            WIDTH//2, HEIGHT-50 - PLAYER_SIZE,
            WIDTH//2 + PLAYER_SIZE//2, HEIGHT-50,
            fill="red", outline="black"
        )

        # 游戏状态
        self.obstacles = []
        self.score = 0
        self.running = True
        self.frame_count = 0

        # 显示得分
        self.score_text = self.canvas.create_text(
            10, 10, anchor="nw", font=("Arial", 16), fill="black", text="得分: 0"
        )

        # 键盘绑定
        self.root.bind("<Left>", self.move_left)
        self.root.bind("<Right>", self.move_right)
        self.root.bind("<Up>", self.move_up)
        self.root.bind("<Down>", self.move_down)
        self.root.bind("<a>", self.move_left)
        self.root.bind("<d>", self.move_right)
        self.root.bind("<w>", self.move_up)
        self.root.bind("<s>", self.move_down)

        # 启动游戏循环
        self.game_loop()

    def move_left(self, event=None):
        if self.running:
            x, y = self.canvas.coords(self.player)[0], self.canvas.coords(self.player)[1]
            if x - SPEED > 0:
                self.canvas.move(self.player, -SPEED, 0)

    def move_right(self, event=None):
        if self.running:
            x, y = self.canvas.coords(self.player)[0], self.canvas.coords(self.player)[1]
            if x + PLAYER_SIZE + SPEED < WIDTH:
                self.canvas.move(self.player, SPEED, 0)

    def move_up(self, event=None):
        if self.running:
            x, y = self.canvas.coords(self.player)[1]
            if y - SPEED > 0:
                self.canvas.move(self.player, 0, -SPEED)

    def move_down(self, event=None):
        if self.running:
            x, y = self.canvas.coords(self.player)[1]
            if y + PLAYER_SIZE + SPEED < HEIGHT:
                self.canvas.move(self.player, 0, SPEED)

    def spawn_obstacle(self):
        # 在顶部随机 x 位置生成障碍物（圆形）
        x = random.randint(OBSTACLE_SIZE, WIDTH - OBSTACLE_SIZE)
        obs = self.canvas.create_oval(
            x - OBSTACLE_SIZE//2, -OBSTACLE_SIZE,
            x + OBSTACLE_SIZE//2, 0,
            fill="purple", outline="black"
        )
        self.obstacles.append(obs)

    def check_collision(self, obs):
        # 获取玩家边界
        px1, py1, px2, py2 = self.canvas.bbox(self.player)
        # 获取障碍物边界
        ox1, oy1, ox2, oy2 = self.canvas.bbox(obs)
        # 矩形碰撞检测
        if px1 < ox2 and px2 > ox1 and py1 < oy2 and py2 > oy1:
            return True
        return False

    def update_obstacles(self):
        to_remove = []
        for obs in self.obstacles:
            # 下移
            self.canvas.move(obs, 0, OBSTACLE_SPEED)
            # 获取当前位置
            x1, y1, x2, y2 = self.canvas.bbox(obs)
            # 如果完全移出底部，移除并加分
            if y1 > HEIGHT:
                to_remove.append(obs)
                self.score += 1
                self.canvas.itemconfig(self.score_text, text=f"得分: {self.score}")
            # 碰撞检测
            elif self.check_collision(obs):
                self.game_over()
                return
        # 清除已出界的障碍物
        for obs in to_remove:
            self.canvas.delete(obs)
            self.obstacles.remove(obs)

    def game_over(self):
        self.running = False
        self.canvas.create_text(
            WIDTH//2, HEIGHT//2 - 20,
            text="游戏结束", font=("Arial", 30), fill="red"
        )
        self.canvas.create_text(
            WIDTH//2, HEIGHT//2 + 20,
            text=f"最终得分: {self.score}", font=("Arial", 20), fill="black"
        )

    def game_loop(self):
        if not self.running:
            return
        self.frame_count += 1
        # 每隔一定帧数生成障碍物
        if self.frame_count % SPAWN_INTERVAL == 0:
            self.spawn_obstacle()
        self.update_obstacles()
        # 继续循环
        self.root.after(30, self.game_loop)  # 约 33 FPS

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