import pygame
import random
import sys

# 初始化pygame
pygame.init()

# 游戏常量设置
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
FPS = 60
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)

# 设置游戏窗口
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("二维移动射击游戏")
clock = pygame.time.Clock()

# 玩家类
class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        # 创建玩家矩形（代替图片，简化开发）
        self.image = pygame.Surface((50, 50))
        self.image.fill(BLUE)
        self.rect = self.image.get_rect()
        # 初始位置（屏幕中央）
        self.rect.center = (SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2)
        # 移动速度
        self.speed = 5
        # 射击冷却（避免连射过快）
        self.shoot_cooldown = 200  # 冷却时间（毫秒）
        self.last_shot = pygame.time.get_ticks()

    def update(self):
        # 获取键盘输入
        keys = pygame.key.get_pressed()
        # 上下左右移动（WASD + 方向键双支持）
        if keys[pygame.K_w] or keys[pygame.K_UP]:
            self.rect.y -= self.speed
        if keys[pygame.K_s] or keys[pygame.K_DOWN]:
            self.rect.y += self.speed
        if keys[pygame.K_a] or keys[pygame.K_LEFT]:
            self.rect.x -= self.speed
        if keys[pygame.K_d] or keys[pygame.K_RIGHT]:
            self.rect.x += self.speed

        # 限制玩家在窗口内
        if self.rect.left < 0:
            self.rect.left = 0
        if self.rect.right > SCREEN_WIDTH:
            self.rect.right = SCREEN_WIDTH
        if self.rect.top < 0:
            self.rect.top = 0
        if self.rect.bottom > SCREEN_HEIGHT:
            self.rect.bottom = SCREEN_HEIGHT

    def shoot(self):
        # 检测冷却时间，满足则发射子弹
        current_time = pygame.time.get_ticks()
        if current_time - self.last_shot > self.shoot_cooldown:
            self.last_shot = current_time
            # 创建子弹，位置在玩家中心
            bullet = Bullet(self.rect.centerx, self.rect.top)
            all_sprites.add(bullet)
            bullets.add(bullet)

# 子弹类
class Bullet(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = pygame.Surface((10, 20))
        self.image.fill(GREEN)
        self.rect = self.image.get_rect()
        self.rect.centerx = x
        self.rect.bottom = y
        self.speed = -10  # 向上移动（负值）

    def update(self):
        # 子弹移动
        self.rect.y += self.speed
        # 超出窗口则销毁
        if self.rect.bottom < 0:
            self.kill()

# 目标类（敌方）
class Target(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((40, 40))
        self.image.fill(RED)
        self.rect = self.image.get_rect()
        # 随机生成位置（窗口右侧外）
        self.rect.x = random.randrange(SCREEN_WIDTH - self.rect.width)
        self.rect.y = random.randrange(-100, -40)
        # 随机移动速度
        self.speed_y = random.randrange(1, 5)
        self.speed_x = random.randrange(-3, 3)

    def update(self):
        # 目标移动
        self.rect.y += self.speed_y
        self.rect.x += self.speed_x
        # 边界检测，碰到左右边界反弹
        if self.rect.left < 0 or self.rect.right > SCREEN_WIDTH:
            self.speed_x *= -1
        # 超出窗口底部则重新生成
        if self.rect.top > SCREEN_HEIGHT + 10:
            self.rect.x = random.randrange(SCREEN_WIDTH - self.rect.width)
            self.rect.y = random.randrange(-100, -40)
            self.speed_y = random.randrange(1, 5)

# 创建精灵组
all_sprites = pygame.sprite.Group()
bullets = pygame.sprite.Group()
targets = pygame.sprite.Group()

# 创建玩家
player = Player()
all_sprites.add(player)

# 生成初始目标
for _ in range(8):
    target = Target()
    all_sprites.add(target)
    targets.add(target)

# 分数初始化
score = 0
font = pygame.font.Font(None, 36)

# 游戏主循环
running = True
while running:
    # 控制帧率
    clock.tick(FPS)

    # 事件处理
    for event in pygame.event.get():
        # 关闭窗口
        if event.type == pygame.QUIT:
            running = False
        # 空格键射击
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                player.shoot()

    # 更新所有精灵
    all_sprites.update()

    # 碰撞检测：子弹击中目标
    hits = pygame.sprite.groupcollide(targets, bullets, True, True)
    for hit in hits:
        score += 10  # 每击中一个目标加10分
        # 击中后重新生成目标
        target = Target()
        all_sprites.add(target)
        targets.add(target)

    # 绘制背景
    screen.fill(BLACK)

    # 绘制所有精灵
    all_sprites.draw(screen)

    # 绘制分数
    score_text = font.render(f"Score: {score}", True, WHITE)
    screen.blit(score_text, (10, 10))

    # 更新画面
    pygame.display.flip()

# 退出游戏
pygame.quit()
sys.exit()