import pygame
import random
import sys

# --- 1. 游戏配置 ---
WIDTH = 480
HEIGHT = 600
FPS = 60

# 颜色定义
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
YELLOW = (255, 255, 0)
CYAN = (0, 255, 255)

pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("星际避障 - 飞行挑战")
clock = pygame.time.Clock()
font = pygame.font.SysFont("arial", 24)

# --- 2. 游戏对象类 ---

class Player(pygame.sprite.Sprite):
    """玩家飞机类"""
    def __init__(self):
        super().__init__()
        # 创建一个三角形代表飞机
        self.image = pygame.Surface((40, 40), pygame.SRCALPHA)
        pygame.draw.polygon(self.image, CYAN, [(20, 0), (0, 40), (40, 40)])
        self.rect = self.image.get_rect()
        self.rect.centerx = WIDTH // 2
        self.rect.bottom = HEIGHT - 20
        self.speed = 7

    def update(self):
        # 键盘控制移动
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT] and self.rect.left > 0:
            self.rect.x -= self.speed
        if keys[pygame.K_RIGHT] and self.rect.right < WIDTH:
            self.rect.x += self.speed
        if keys[pygame.K_UP] and self.rect.top > 0:
            self.rect.y -= self.speed
        if keys[pygame.K_DOWN] and self.rect.bottom < HEIGHT:
            self.rect.y += self.speed

class Mob(pygame.sprite.Sprite):
    """陨石/障碍物类"""
    def __init__(self):
        super().__init__()
        size = random.randint(30, 60)
        self.image = pygame.Surface((size, size), pygame.SRCALPHA)
        # 画一个灰色的圆代表陨石
        pygame.draw.circle(self.image, (150, 150, 150), (size//2, size//2), size//2)
        self.rect = self.image.get_rect()
        self.rect.x = random.randrange(WIDTH - self.rect.width)
        self.rect.y = random.randrange(-100, -40)
        self.speedy = random.randrange(4, 10) # 垂直下落速度
        self.speedx = random.randrange(-2, 2) # 左右轻微漂移

    def update(self):
        self.rect.y += self.speedy
        self.rect.x += self.speedx
        # 如果飞出屏幕底部，重置到顶部
        if self.rect.top > HEIGHT + 10:
            self.rect.x = random.randrange(WIDTH - self.rect.width)
            self.rect.y = random.randrange(-100, -40)
            self.speedy = random.randrange(4, 10)

# --- 3. 游戏主循环 ---

def show_text(surf, text, size, x, y, color=WHITE):
    font = pygame.font.SysFont("microsoftyahei", size)
    text_surface = font.render(text, True, color)
    text_rect = text_surface.get_rect()
    text_rect.midtop = (x, y)
    surf.blit(text_surface, text_rect)

def main():
    all_sprites = pygame.sprite.Group()
    mobs = pygame.sprite.Group()
    
    player = Player()
    all_sprites.add(player)
    
    # 生成初始障碍物
    for i in range(8):
        m = Mob()
        all_sprites.add(m)
        mobs.add(m)

    score = 0
    running = True
    game_over = False

    while running:
        # 1. 事件处理
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            if game_over and event.type == pygame.KEYDOWN:
                if event.key == pygame.K_r: # 按R键重开
                    main()
                    return

        if not game_over:
            # 2. 更新
            all_sprites.update()
            score += 1 # 存活时间越长分数越高

            # 3. 碰撞检测
            hits = pygame.sprite.spritecollide(player, mobs, False, pygame.sprite.collide_circle)
            if hits:
                game_over = True

        # 4. 绘制
        screen.fill(BLACK) # 背景色
        
        # 绘制繁星点点（简单的背景装饰）
        for _ in range(10):
            pygame.draw.circle(screen, WHITE, (random.randint(0, WIDTH), random.randint(0, HEIGHT)), 1)

        all_sprites.draw(screen)
        show_text(screen, f"Score: {score // 10}", 20, WIDTH // 2, 10)

        if game_over:
            show_text(screen, "GAME OVER", 48, WIDTH // 2, HEIGHT // 3, RED)
            show_text(screen, "Press R to Restart", 24, WIDTH // 2, HEIGHT // 2, YELLOW)

        pygame.display.flip()
        clock.tick(FPS)

    pygame.quit()
    sys.exit()

if __name__ == "__main__":
    main()