import tkinter as tk
import random

class ShootingGame:
    def __init__(self, root):
        self.root = root
        self.root.title("二维移动射击")
        self.canvas = tk.Canvas(root, width=800, height=600, bg='black')
        self.canvas.pack()
        
        # 玩家设置
        self.player_size = 40
        self.player_x = 400 - self.player_size//2
        self.player_y = 550
        self.player_speed = 5
        self.player = self.canvas.create_rectangle(self.player_x, self.player_y,
                                                   self.player_x+self.player_size, self.player_y+self.player_size,
                                                   fill='blue')
        
        # 子弹设置
        self.bullet_speed = 10
        self.bullets = []
        
        # 敌人设置
        self.enemy_size = 30
        self.enemy_speed = 2
        self.enemies = []
        self.enemy_spawn_rate = 0.02  # 每帧生成概率
        
        # 游戏状态
        self.score = 0
        self.lives = 3
        self.running = True
        
        # 移动标志
        self.move_left = False
        self.move_right = False
        self.move_up = False
        self.move_down = False
        
        # 绑定按键
        self.root.bind('<KeyPress>', self.key_press)
        self.root.bind('<KeyRelease>', self.key_release)
        
        # 显示得分和生命
        self.score_text = self.canvas.create_text(10, 10, anchor='nw', fill='white',
                                                  font=('Arial', 16), text='得分: 0  生命: 3')
        
        # 开始游戏循环
        self.update()
        
    def key_press(self, event):
        key = event.keysym
        if key == 'Left' or key == 'a':
            self.move_left = True
        elif key == 'Right' or key == 'd':
            self.move_right = True
        elif key == 'Up' or key == 'w':
            self.move_up = True
        elif key == 'Down' or key == 's':
            self.move_down = True
        elif key == 'space':
            self.fire()
            
    def key_release(self, event):
        key = event.keysym
        if key == 'Left' or key == 'a':
            self.move_left = False
        elif key == 'Right' or key == 'd':
            self.move_right = False
        elif key == 'Up' or key == 'w':
            self.move_up = False
        elif key == 'Down' or key == 's':
            self.move_down = False
            
    def fire(self):
        if not self.running:
            return
        # 从玩家中心发射
        x = self.player_x + self.player_size//2 - 5
        y = self.player_y
        bullet = self.canvas.create_oval(x, y, x+10, y+20, fill='yellow')
        self.bullets.append(bullet)
        
    def spawn_enemy(self):
        if random.random() < self.enemy_spawn_rate and self.running:
            x = random.randint(0, 800 - self.enemy_size)
            enemy = self.canvas.create_rectangle(x, 0, x+self.enemy_size, self.enemy_size,
                                                 fill='red')
            self.enemies.append(enemy)
            
    def update(self):
        if not self.running:
            return
        
        # 移动玩家
        if self.move_left and self.player_x > 0:
            self.player_x -= self.player_speed
        if self.move_right and self.player_x < 800 - self.player_size:
            self.player_x += self.player_speed
        if self.move_up and self.player_y > 0:
            self.player_y -= self.player_speed
        if self.move_down and self.player_y < 600 - self.player_size:
            self.player_y += self.player_speed
        self.canvas.coords(self.player, self.player_x, self.player_y,
                           self.player_x+self.player_size, self.player_y+self.player_size)
        
        # 移动子弹
        for bullet in self.bullets[:]:
            self.canvas.move(bullet, 0, -self.bullet_speed)
            # 获取子弹位置，检查是否超出屏幕
            x1, y1, x2, y2 = self.canvas.bbox(bullet)
            if y2 < 0:
                self.canvas.delete(bullet)
                self.bullets.remove(bullet)
                
        # 移动敌人
        for enemy in self.enemies[:]:
            self.canvas.move(enemy, 0, self.enemy_speed)
            x1, y1, x2, y2 = self.canvas.bbox(enemy)
            if y1 > 600:
                self.canvas.delete(enemy)
                self.enemies.remove(enemy)
                
        # 碰撞检测：子弹 vs 敌人
        for bullet in self.bullets[:]:
            bx1, by1, bx2, by2 = self.canvas.bbox(bullet)
            for enemy in self.enemies[:]:
                ex1, ey1, ex2, ey2 = self.canvas.bbox(enemy)
                if not (bx2 < ex1 or bx1 > ex2 or by2 < ey1 or by1 > ey2):
                    # 碰撞
                    self.canvas.delete(bullet)
                    self.bullets.remove(bullet)
                    self.canvas.delete(enemy)
                    self.enemies.remove(enemy)
                    self.score += 1
                    self.update_score()
                    break  # 子弹消失，跳出内循环
                    
        # 碰撞检测：玩家 vs 敌人
        px1, py1, px2, py2 = self.canvas.bbox(self.player)
        for enemy in self.enemies[:]:
            ex1, ey1, ex2, ey2 = self.canvas.bbox(enemy)
            if not (px2 < ex1 or px1 > ex2 or py2 < ey1 or py1 > ey2):
                # 碰撞，玩家失去一条命
                self.canvas.delete(enemy)
                self.enemies.remove(enemy)
                self.lives -= 1
                self.update_score()
                if self.lives <= 0:
                    self.game_over()
                    return
                # 可选：短暂无敌时间，但简单处理
        
        # 生成敌人
        self.spawn_enemy()
        
        # 继续循环
        self.root.after(50, self.update)
        
    def update_score(self):
        self.canvas.itemconfig(self.score_text, text=f'得分: {self.score}  生命: {self.lives}')
        
    def game_over(self):
        self.running = False
        self.canvas.create_text(400, 300, text='游戏结束', fill='white', font=('Arial', 30))
        self.canvas.create_text(400, 350, text='点击关闭窗口退出', fill='white', font=('Arial', 16))

if __name__ == '__main__':
    root = tk.Tk()
    game = ShootingGame(root)
    root.mainloop()
