import pygame
import random
import sys

# 初始化
pygame.init()
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("像素枪战 Pygame")
clock = pygame.time.Clock()
FPS = 60

# 颜色
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 50, 50)
GREEN = (50, 255, 50)
BLUE = (50, 50, 255)
YELLOW = (255, 220, 0)

# 玩家类
class Player:
    def __init__(self):
        self.size = 24
        self.x = WIDTH // 2
        self.y = HEIGHT // 2
        self.speed = 4
        self.hp = 100
        self.color = GREEN

    def update(self):
        keys = pygame.key.get_pressed()
        if keys[pygame.K_w] and self.y > 0:
            self.y -= self.speed
        if keys[pygame.K_s] and self.y < HEIGHT - self.size:
            self.y += self.speed
        if keys[pygame.K_a] and self.x > 0:
            self.x -= self.speed
        if keys[pygame.K_d] and self.x < WIDTH - self.size:
            self.x += self.speed

    def draw(self):
        pygame.draw.rect(screen, self.color, (self.x, self.y, self.size, self.size))

    def get_rect(self):
        return pygame.Rect(self.x, self.y, self.size, self.size)

# 子弹类
class Bullet:
    def __init__(self, x, y, dx, dy):
        self.x = x
        self.y = y
        self.speed = 8
        self.dx = dx
        self.dy = dy
        self.size = 6

    def update(self):
        self.x += self.dx * self.speed
        self.y += self.dy * self.speed

    def draw(self):
        pygame.draw.rect(screen, YELLOW, (self.x, self.y, self.size, self.size))

    def out_screen(self):
        return self.x < 0 or self.x > WIDTH or self.y < 0 or self.y > HEIGHT

    def get_rect(self):
        return pygame.Rect(self.x, self.y, self.size, self.size)

# 敌人类
class Enemy:
    def __init__(self):
        self.size = 22
        # 随机出生在屏幕边缘
        side = random.randint(0, 3)
        if side == 0:
            self.x = random.randint(0, WIDTH)
            self.y = -self.size
        elif side == 1:
            self.x = WIDTH
            self.y = random.randint(0, HEIGHT)
        elif side == 2:
            self.x = random.randint(0, WIDTH)
            self.y = HEIGHT
        else:
            self.x = -self.size
            self.y = random.randint(0, HEIGHT)
        self.speed = 1.8
        self.color = RED

    def update(self, px, py):
        # 向玩家移动
        if self.x < px:
            self.x += self.speed
        elif self.x > px:
            self.x -= self.speed
        if self.y < py:
            self.y += self.speed
        elif self.y > py:
            self.y -= self.speed

    def draw(self):
        pygame.draw.rect(screen, self.color, (self.x, self.y, self.size, self.size))

    def get_rect(self):
        return pygame.Rect(self.x, self.y, self.size, self.size)

def main():
    player = Player()
    bullets = []
    enemies = []
    spawn_timer = 0
    score = 0
    # 修复：用 Font(None, ...) 代替 SysFont(None, ...)，避免 Windows 注册表字体报错
    font = pygame.font.Font(None, 36)

    running = True
    while running:
        dt = clock.tick(FPS) / 1000

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            # 鼠标点击射击
            if event.type == pygame.MOUSEBUTTONDOWN:
                mx, my = pygame.mouse.get_pos()
                # 方向向量归一化
                dx = mx - (player.x + player.size / 2)
                dy = my - (player.y + player.size / 2)
                length = (dx ** 2 + dy ** 2) ** 0.5
                if length > 0:
                    dx /= length
                    dy /= length
                bullet = Bullet(player.x + player.size / 2, player.y + player.size / 2, dx, dy)
                bullets.append(bullet)

        # 生成敌人
        spawn_timer += dt
        if spawn_timer > 1.5:
            enemies.append(Enemy())
            spawn_timer = 0

        # 更新玩家
        player.update()

        # 更新子弹
        for b in bullets[:]:
            b.update()
            if b.out_screen():
                bullets.remove(b)

        # 更新敌人
        for e in enemies:
            e.update(player.x + player.size / 2, player.y + player.size / 2)

        # 子弹击中敌人
        for b in bullets[:]:
            for e in enemies[:]:
                if b.get_rect().colliderect(e.get_rect()):
                    bullets.remove(b)
                    enemies.remove(e)
                    score += 10
                    break

        # 敌人撞击玩家
        for e in enemies[:]:
            if e.get_rect().colliderect(player.get_rect()):
                player.hp -= 1
                enemies.remove(e)
                if player.hp <= 0:
                    print(f"游戏结束！得分：{score}")
                    running = False

        # 渲染
        screen.fill(BLACK)
        player.draw()
        for b in bullets:
            b.draw()
        for e in enemies:
            e.draw()

        # UI文字
        hp_text = font.render(f"HP: {player.hp}", True, WHITE)
        score_text = font.render(f"SCORE: {score}", True, WHITE)
        screen.blit(hp_text, (10, 10))
        screen.blit(score_text, (10, 40))

        pygame.display.flip()

    pygame.quit()
    sys.exit()

if __name__ == "__main__":
    main()