import pygame
import sys
import random

# 初始化pygame
pygame.init()

# 游戏常量定义
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
FPS = 60
PLAYER_SPEED = 5
BULLET_SPEED = 7
ENEMY_SPEED = 3
ENEMY_SPAWN_RATE = 60  # 每60帧生成一个敌人

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

class Player(pygame.sprite.Sprite):
    """玩家类"""
    def __init__(self):
        super().__init__()
        # 创建玩家矩形（40x40像素）
        self.image = pygame.Surface((40, 40))
        self.image.fill(BLUE)
        self.rect = self.image.get_rect()
        # 初始位置在屏幕底部中间
        self.rect.centerx = SCREEN_WIDTH // 2
        self.rect.bottom = SCREEN_HEIGHT - 10
        
    def update(self):
        """更新玩家位置（响应键盘输入）"""
        keys = pygame.key.get_pressed()
        # 左右移动（限制在屏幕内）
        if keys[pygame.K_LEFT] and self.rect.left > 0:
            self.rect.x -= PLAYER_SPEED
        if keys[pygame.K_RIGHT] and self.rect.right < SCREEN_WIDTH:
            self.rect.x += PLAYER_SPEED
        # 上下移动（限制在屏幕内）
        if keys[pygame.K_UP] and self.rect.top > 0:
            self.rect.y -= PLAYER_SPEED
        if keys[pygame.K_DOWN] and self.rect.bottom < SCREEN_HEIGHT:
            self.rect.y += PLAYER_SPEED

class Bullet(pygame.sprite.Sprite):
    """子弹类"""
    def __init__(self, x, y):
        super().__init__()
        # 创建子弹矩形（5x15像素）
        self.image = pygame.Surface((5, 15))
        self.image.fill(WHITE)
        self.rect = self.image.get_rect()
        # 子弹初始位置在玩家顶部中间
        self.rect.centerx = x
        self.rect.bottom = y
        
    def update(self):
        """更新子弹位置（向上飞行）"""
        self.rect.y -= BULLET_SPEED
        # 子弹飞出屏幕后销毁
        if self.rect.bottom < 0:
            self.kill()

class Enemy(pygame.sprite.Sprite):
    """敌人类"""
    def __init__(self):
        super().__init__()
        # 创建敌人矩形（30x30像素）
        self.image = pygame.Surface((30, 30))
        self.image.fill(RED)
        self.rect = self.image.get_rect()
        # 随机生成在屏幕顶部
        self.rect.x = random.randint(0, SCREEN_WIDTH - self.rect.width)
        self.rect.y = random.randint(-100, -40)
        
    def update(self):
        """更新敌人位置（向下移动）"""
        self.rect.y += ENEMY_SPEED
        # 敌人飞出屏幕后销毁
        if self.rect.top > SCREEN_HEIGHT:
            self.kill()

def main():
    """游戏主函数"""
    # 创建游戏窗口
    screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
    pygame.display.set_caption("二维移动射击游戏")
    
    # 创建时钟（控制帧率）
    clock = pygame.time.Clock()
    
    # 创建精灵组
    all_sprites = pygame.sprite.Group()
    bullets = pygame.sprite.Group()
    enemies = pygame.sprite.Group()
    
    # 创建玩家
    player = Player()
    all_sprites.add(player)
    
    # 游戏分数
    score = 0
    font = pygame.font.Font(None, 36)
    
    # 游戏循环标志
    running = True
    frame_count = 0
    
    while running:
        # 控制帧率
        clock.tick(FPS)
        frame_count += 1
        
        # 事件处理
        for event in pygame.event.get():
            # 关闭窗口
            if event.type == pygame.QUIT:
                running = False
            # 空格键发射子弹
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE:
                    # 创建子弹并添加到精灵组
                    bullet = Bullet(player.rect.centerx, player.rect.top)
                    all_sprites.add(bullet)
                    bullets.add(bullet)
        
        # 生成敌人（每隔指定帧数生成一个）
        if frame_count % ENEMY_SPAWN_RATE == 0:
            enemy = Enemy()
            all_sprites.add(enemy)
            enemies.add(enemy)
        
        # 更新所有精灵
        all_sprites.update()
        
        # 碰撞检测：子弹击中敌人
        hits = pygame.sprite.groupcollide(enemies, bullets, True, True)
        for hit in hits:
            score += 10  # 每击中一个敌人加10分
        
        # 绘制背景
        screen.fill(BLACK)
        
        # 绘制所有精灵
        all_sprites.draw(screen)
        
        # 绘制分数
        score_text = font.render(f"Score: {score}", True, GREEN)
        screen.blit(score_text, (10, 10))
        
        # 更新屏幕显示
        pygame.display.flip()
    
    # 退出游戏
    pygame.quit()
    sys.exit()

if __name__ == "__main__":
    main()