import pygame
import random
import sys

# 初始化
pygame.init()
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("2D移动射击")
clock = pygame.time.Clock()
FPS = 60

# 颜色定义
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 120, 255)

# 键值编码（不用 pygame.K_W 常量，规避报错）
KEY_W = 119
KEY_S = 115
KEY_A = 97
KEY_D = 100

# 玩家类
class Player:
    def __init__(self):
        self.x = WIDTH // 2
        self.y = HEIGHT // 2
        self.radius = 20
        self.speed = 5
        self.hp = 100

    def update(self):
        keys = pygame.key.get_pressed()
        if keys[KEY_W] and self.y - self.radius > 0:
            self.y -= self.speed
        if keys[KEY_S] and self.y + self.radius < HEIGHT:
            self.y += self.speed
        if keys[KEY_A] and self.x - self.radius > 0:
            self.x -= self.speed
        if keys[KEY_D] and self.x + self.radius < WIDTH:
            self.x += self.speed

    def draw(self):
        pygame.draw.circle(screen, BLUE, (int(self.x), int(self.y)), self.radius)

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

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

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

    def draw(self):
        pygame.draw.circle(screen, WHITE, (int(self.x), int(self.y)), self.radius)

# 敌人类
class Enemy:
    def __init__(self):
        side = random.randint(0, 3)
        if side == 0:
            self.x = random.randint(0, WIDTH)
            self.y = -30
        elif side == 1:
            self.x = WIDTH + 30
            self.y = random.randint(0, HEIGHT)
        elif side == 2:
            self.x = random.randint(0, WIDTH)
            self.y = HEIGHT + 30
        else:
            self.x = -30
            self.y = random.randint(0, HEIGHT)
        self.radius = 18
        self.speed = 2.2

    def update(self, player):
        dx = player.x - self.x
        dy = player.y - self.y
        dist = (dx**2 + dy**2)**0.5
        if dist > 0:
            self.x += dx / dist * self.speed
            self.y += dy / dist * self.speed

    def draw(self):
        pygame.draw.circle(screen, RED, (int(self.x), int(self.y)), self.radius)

# 碰撞检测
def circle_collide(a_x, a_y, a_r, b_x, b_y, b_r):
    dis_sq = (a_x - b_x)**2 + (a_y - b_y)**2
    return dis_sq < (a_r + b_r)**2

def main():
    player = Player()
    bullets = []
    enemies = []
    spawn_timer = 0
    game_over = False
    
    # 字体容错方案
    try:
        font = pygame.font.Font(pygame.font.get_default_font(), 40)
    except:
        font = pygame.font.Font(None, 40)

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

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type == pygame.MOUSEBUTTONDOWN and not game_over:
                mx, my = pygame.mouse.get_pos()
                dx = mx - player.x
                dy = my - player.y
                dist = (dx**2 + dy**2)**0.5
                if dist > 0:
                    bullets.append(Bullet(player.x, player.y, dx/dist, dy/dist))

        if not game_over:
            player.update()

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

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

            # 更新敌人
            for e in enemies:
                e.update(player)

            # 子弹击中敌人
            for b in bullets[:]:
                for e in enemies[:]:
                    if circle_collide(b.x, b.y, b.radius, e.x, e.y, e.radius):
                        if b in bullets:
                            bullets.remove(b)
                        if e in enemies:
                            enemies.remove(e)
                        break

            # 敌人撞击玩家
            for e in enemies:
                if circle_collide(player.x, player.y, player.radius, e.x, e.y, e.radius):
                    player.hp -= 1
                    if player.hp <= 0:
                        game_over = True

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

        hp_text = font.render(f"HP: {player.hp}", True, GREEN)
        screen.blit(hp_text, (10, 10))

        if game_over:
            over_text = font.render("游戏结束！关闭窗口退出", True, RED)
            screen.blit(over_text, (WIDTH//2 - 180, HEIGHT//2))

        pygame.display.flip()

if __name__ == "__main__":
    main()