import pygame
import random
import sys

# 初始化pygame
pygame.init()

# 窗口设置
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("2D移动射击（方向键移动）")

# 颜色常量
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)

clock = pygame.time.Clock()
FPS = 60

# 玩家类
class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((40, 40))
        self.image.fill(GREEN)
        self.rect = self.image.get_rect()
        self.rect.center = (WIDTH // 2, HEIGHT // 2)
        self.speed = 5

    def update(self):
        keys = pygame.key.get_pressed()
        # 上下左右方向键
        if keys[pygame.K_UP] and self.rect.top > 0:
            self.rect.y -= self.speed
        if keys[pygame.K_DOWN] and self.rect.bottom < HEIGHT:
            self.rect.y += self.speed
        if keys[pygame.K_LEFT] and self.rect.left > 0:
            self.rect.x -= self.speed
        if keys[pygame.K_RIGHT] and self.rect.right < WIDTH:
            self.rect.x += self.speed

# 子弹类
class Bullet(pygame.sprite.Sprite):
    def __init__(self, x, y, dx, dy):
        super().__init__()
        self.image = pygame.Surface((8, 8))
        self.image.fill(BLUE)
        self.rect = self.image.get_rect()
        self.rect.center = (x, y)
        self.speed = 10
        self.dx = dx
        self.dy = dy

    def update(self):
        self.rect.x += self.dx * self.speed
        self.rect.y += self.dy * self.speed
        # 飞出屏幕自动删除
        if not screen.get_rect().contains(self.rect):
            self.kill()

# 敌人类
class Enemy(pygame.sprite.Sprite):
    def __init__(self, speed):
        super().__init__()
        self.image = pygame.Surface((35, 35))
        self.image.fill(RED)
        self.rect = self.image.get_rect()
        # 从屏幕四边随机出生
        side = random.choice(["top", "bottom", "left", "right"])
        if side == "top":
            self.rect.x = random.randint(0, WIDTH)
            self.rect.y = -40
        elif side == "bottom":
            self.rect.x = random.randint(0, WIDTH)
            self.rect.y = HEIGHT + 40
        elif side == "left":
            self.rect.x = -40
            self.rect.y = random.randint(0, HEIGHT)
        else:
            self.rect.x = WIDTH + 40
            self.rect.y = random.randint(0, HEIGHT)
        self.speed = speed

    def update(self, player):
        # 敌人朝玩家移动
        dx = player.rect.centerx - self.rect.centerx
        dy = player.rect.centery - self.rect.centery
        dist = (dx ** 2 + dy ** 2) ** 0.5
        if dist > 0:
            self.rect.x += dx / dist * self.speed
            self.rect.y += dy / dist * self.speed

# 精灵分组
all_sprites = pygame.sprite.Group()
bullet_group = pygame.sprite.Group()
enemy_group = pygame.sprite.Group()

player = Player()
all_sprites.add(player)

score = 0
enemy_spawn_timer = 0
SPAWN_INTERVAL = 120
base_enemy_speed = 2
game_over = False
running = True
shoot_cooldown = 0
SHOOT_DELAY = 8  # 连发间隔帧数

while running:
    clock.tick(FPS)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

        # 游戏结束按R重新开始
        if event.type == pygame.KEYDOWN and game_over:
            if event.key == pygame.K_r:
                all_sprites.empty()
                bullet_group.empty()
                enemy_group.empty()
                player = Player()
                all_sprites.add(player)
                score = 0
                game_over = False
                enemy_spawn_timer = 0
                base_enemy_speed = 2
                shoot_cooldown = 0

    if not game_over:
        # 按住鼠标左键连发
        mouse_pressed = pygame.mouse.get_pressed()
        if mouse_pressed[0] and shoot_cooldown <= 0:
            mx, my = pygame.mouse.get_pos()
            px, py = player.rect.center
            dx = mx - px
            dy = my - py
            dis = (dx ** 2 + dy ** 2) ** 0.5
            if dis > 0:
                bullet = Bullet(px, py, dx / dis, dy / dis)
                all_sprites.add(bullet)
                bullet_group.add(bullet)
                shoot_cooldown = SHOOT_DELAY
        if shoot_cooldown > 0:
            shoot_cooldown -= 1

        # ✅ 分开更新！重点修改这里
        player.update()
        bullet_group.update()
        enemy_group.update(player)

        # 生成敌人，敌人越来越快
        enemy_spawn_timer += 1
        if enemy_spawn_timer >= SPAWN_INTERVAL:
            enemy = Enemy(base_enemy_speed)
            all_sprites.add(enemy)
            enemy_group.add(enemy)
            enemy_spawn_timer = 0
            base_enemy_speed += 0.02

        # 子弹打中敌人
        hit_enemies = pygame.sprite.groupcollide(enemy_group, bullet_group, True, True)
        for _ in hit_enemies:
            score += 10

        # 敌人撞到玩家 → 游戏结束
        if pygame.sprite.spritecollide(player, enemy_group, False):
            game_over = True

    # 渲染画面
    screen.fill(BLACK)
    all_sprites.draw(screen)

    pygame.display.flip()

pygame.quit()
sys.exit()
