import tkinter as tk
import random

class ShootingGame:
    def __init__(self, root):
        self.root = root
        self.root.title("2D移动射击游戏")
        self.root.resizable(False, False)
        
        # 画布大小
        self.W = 480
        self.H = 600
        self.canvas = tk.Canvas(root, width=self.W, height=self.H, bg="#0a0a23")
        self.canvas.pack()
        
        # 玩家飞机属性
        self.player_w = 40
        self.player_h = 40
        self.player_x = self.W // 2 - self.player_w // 2
        self.player_y = self.H - 80
        self.player_speed = 6
        
        # 按键状态
        self.keys = {"Left": False, "Right": False, "Up": False, "Down": False}
        
        # 子弹列表
        self.bullets = []
        self.bullet_speed = 10
        self.bullet_w = 4
        self.bullet_h = 12
        
        # 敌机列表
        self.enemies = []
        self.enemy_w = 36
        self.enemy_h = 36
        self.enemy_speed_min = 2
        self.enemy_speed_max = 4
        
        # 分数
        self.score = 0
        self.score_text = self.canvas.create_text(40, 20, text=f"分数: {self.score}", fill="white", font=("黑体",16))
        
        # 绘制玩家
        self.player = self.canvas.create_rectangle(
            self.player_x, self.player_y,
            self.player_x+self.player_w, self.player_y+self.player_h,
            fill="#00ddff"
        )
        
        # 绑定键盘事件
        self.root.bind("<KeyPress>", self.key_down)
        self.root.bind("<KeyRelease>", self.key_up)
        
        # 启动循环
        self.game_loop()
        self.spawn_enemy()

    def key_down(self, event):
        if event.keysym in self.keys:
            self.keys[event.keysym] = True
        # 空格发射子弹
        if event.keysym == "space":
            self.shoot()

    def key_up(self, event):
        if event.keysym in self.keys:
            self.keys[event.keysym] = False

    def shoot(self):
        # 在飞机中间生成子弹
        bx = self.player_x + self.player_w//2 - self.bullet_w//2
        by = self.player_y - self.bullet_h
        bullet = self.canvas.create_rectangle(bx, by, bx+self.bullet_w, by+self.bullet_h, fill="#ffff00")
        self.bullets.append([bullet, bx, by])

    def spawn_enemy(self):
        # 随机生成敌机
        ex = random.randint(0, self.W - self.enemy_w)
        ey = -self.enemy_h
        enemy = self.canvas.create_rectangle(ex, ey, ex+self.enemy_w, ey+self.enemy_h, fill="#ff3333")
        speed = random.randint(self.enemy_speed_min, self.enemy_speed_max)
        self.enemies.append([enemy, ex, ey, speed])
        # 每隔800ms生成一架敌机
        self.root.after(800, self.spawn_enemy)

    def move_player(self):
        # 左右移动
        if self.keys["Left"] and self.player_x > 0:
            self.player_x -= self.player_speed
        if self.keys["Right"] and self.player_x < self.W - self.player_w:
            self.player_x += self.player_speed
        # 上下移动
        if self.keys["Up"] and self.player_y > 0:
            self.player_y -= self.player_speed
        if self.keys["Down"] and self.player_y < self.H - self.player_h:
            self.player_y += self.player_speed
        # 更新画布玩家坐标
        self.canvas.coords(
            self.player,
            self.player_x, self.player_y,
            self.player_x+self.player_w, self.player_y+self.player_h
        )

    def update_bullets(self):
        new_bullets = []
        for blt_id, x, y in self.bullets:
            y -= self.bullet_speed
            self.canvas.coords(blt_id, x, y, x+self.bullet_w, y+self.bullet_h)
            if y > -self.bullet_h:
                new_bullets.append([blt_id, x, y])
            else:
                self.canvas.delete(blt_id)
        self.bullets = new_bullets

    def update_enemies(self):
        new_enemies = []
        for e_id, x, y, spd in self.enemies:
            y += spd
            self.canvas.coords(e_id, x, y, x+self.enemy_w, y+self.enemy_h)
            if y < self.H:
                new_enemies.append([e_id, x, y, spd])
            else:
                self.canvas.delete(e_id)
        self.enemies = new_enemies

    def check_collision(self):
        # 子弹与敌机碰撞检测
        del_bullet = set()
        del_enemy = set()
        for b_idx, (b_id, bx, by) in enumerate(self.bullets):
            b_x2 = bx + self.bullet_w
            b_y2 = by + self.bullet_h
            for e_idx, (e_id, ex, ey, espd) in enumerate(self.enemies):
                e_x2 = ex + self.enemy_w
                e_y2 = ey + self.enemy_h
                # 矩形碰撞
                if bx < e_x2 and b_x2 > ex and by < e_y2 and b_y2 > ey:
                    del_bullet.add(b_idx)
                    del_enemy.add(e_idx)
                    self.score += 10
                    self.canvas.itemconfig(self.score_text, text=f"分数: {self.score}")
        # 删除击中的子弹敌机
        for i in sorted(del_bullet, reverse=True):
            self.canvas.delete(self.bullets[i][0])
            self.bullets.pop(i)
        for i in sorted(del_enemy, reverse=True):
            self.canvas.delete(self.enemies[i][0])
            self.enemies.pop(i)

    def game_loop(self):
        self.move_player()
        self.update_bullets()
        self.update_enemies()
        self.check_collision()
        # 每16ms刷新约60帧
        self.root.after(16, self.game_loop)

if __name__ == "__main__":
    window = tk.Tk()
    game = ShootingGame(window)
    window.mainloop()