import pygame
import random
import sys

# 初始化pygame
pygame.init()
# 窗口设置
WIDTH, HEIGHT = 900, 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, 150, 255)

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

    def update(self):
        # WASD移动
        keys = pygame.key.get_pressed()
        if keys[pygame.K_w] and self.rect.top > 0:
            self.rect.y -= self.speed
        if keys[pygame.K_s] and self.rect.bottom < HEIGHT:
            self.rect.y += self.speed
        if keys[pygame.K_a] and self.rect.left > 0:
            self.rect.x -= self.speed
        if keys[pygame.K_d] and self.rect.right < WIDTH:
            self.rect.x += self.speed

# 子弹类
class Bullet(pygame.sprite.Sprite):
    def __init__(self, x, y, target_x, target_y):
        super().__init__()
        self.image = pygame.Surface((8, 8))
        self.image.fill(WHITE)
        self.rect = self.image.get_rect(center=(x, y))
        self.speed = 12
        # 计算子弹移动方向
        dx = target_x - x
        dy = target_y - y
        length = (dx ** 2 + dy ** 2) ** 0.5
        self.vx = dx / length * self.speed
        self.vy = dy / length * self.speed

    def update(self):
        self.rect.x += self.vx
        self.rect.y += self.vy
        # 超出屏幕自动销毁
        if self.rect.right < 0 or self.rect.left > WIDTH or self.rect.bottom < 0 or self.rect.top > HEIGHT:
            self.kill()

# 敌人类
class Enemy(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((35, 35))
        self.image.fill(RED)
        self.rect = self.image.get_rect()
        # 随机出生在屏幕四边
        side = random.randint(0, 3)
        if side == 0:
            self.rect.x = random.randint(0, WIDTH)
            self.rect.y = -40
        elif side == 1:
            self.rect.x = random.randint(0, WIDTH)
            self.rect.y = HEIGHT + 40
        elif side == 2:
            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 = 2
        self.hp = 1

    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
font = pygame.font.SysFont(None, 40)
spawn_timer = 0
spawn_interval = 120  # 每120帧生成一个敌人

# 主游戏循环
running = True
while running:
    clock.tick(FPS)
    screen.fill(BLACK)

    # 事件处理
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        # 鼠标左键发射子弹
        if event.type == pygame.MOUSEBUTTONDOWN:
            if event.button == 1:
                mx, my = pygame.mouse.get_pos()
                bullet = Bullet(player.rect.centerx, player.rect.centery, mx, my)
                all_sprites.add(bullet)
                bullet_group.add(bullet)

    # 生成敌人计时器
    spawn_timer += 1
    if spawn_timer >= spawn_interval:
        spawn_timer = 0
        enemy = Enemy()
        all_sprites.add(enemy)
        enemy_group.add(enemy)

    # 更新所有精灵
    player.update()
    for enemy in enemy_group:
        enemy.update(player)
    bullet_group.update()

    # 子弹击中敌人碰撞检测
    hits = pygame.sprite.groupcollide(enemy_group, bullet_group, True, True)
    for hit in hits:
        score += 10

    # 敌人撞到玩家扣血
    hit_player = pygame.sprite.spritecollide(player, enemy_group, True)
    for hit in hit_player:
        player.hp -= 10
        if player.hp <= 0:
            game_over_text = font.render("游戏结束！得分：" + str(score), True, RED)
            screen.blit(game_over_text, (WIDTH//2 - 180, HEIGHT//2))
            pygame.display.flip()
            pygame.time.wait(2000)
            running = False

    # 绘制所有元素
    all_sprites.draw(screen)

    # 绘制UI文字
    hp_text = font.render(f"血量：{player.hp}", True, GREEN)
    score_text = font.render(f"得分：{score}", True, WHITE)
    screen.blit(hp_text, (10, 10))
    screen.blit(score_text, (10, 50))

    pygame.display.flip()

pygame.quit()
sys.exit()