import pygame
import random
import sys

# 初始化Pygame
pygame.init()

# 窗口基础配置
WIDTH, HEIGHT = 480, 700
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("太空飞行躲避")

# 色彩常量
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 30, 30)
BLUE = (20, 140, 255)
GREEN = (0, 230, 80)
GRAY = (80, 80, 80)

# 帧率控制器
clock = pygame.time.Clock()
FPS = 60

# 玩家战机类
class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        # 绘制简易战机
        self.image = pygame.Surface((42, 52), pygame.SRCALPHA)
        pygame.draw.polygon(self.image, BLUE, [(21, 0), (0, 52), (42, 52)])
        pygame.draw.rect(self.image, GRAY, (16, 20, 10, 22))
        self.rect = self.image.get_rect()
        self.rect.centerx = WIDTH // 2
        self.rect.bottom = HEIGHT - 30
        self.move_speed = 7

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

# 敌方陨石/敌机类
class Obstacle(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.size_w = random.randint(30, 50)
        self.size_h = random.randint(35, 55)
        self.image = pygame.Surface((self.size_w, self.size_h), pygame.SRCALPHA)
        pygame.draw.ellipse(self.image, RED, (0, 0, self.size_w, self.size_h))
        self.rect = self.image.get_rect()
        self.rect.x = random.randint(0, WIDTH - self.size_w)
        self.rect.y = random.randint(-120, -40)
        self.fall_speed = random.randint(5, 10)

    def update(self):
        self.rect.y += self.fall_speed
        # 飞出屏幕顶部后重置到上方循环生成
        if self.rect.top > HEIGHT:
            self.rect.x = random.randint(0, WIDTH - self.size_w)
            self.rect.y = random.randint(-120, -40)
            self.fall_speed = random.randint(5, 10)

# 精灵分组管理
all_sprites = pygame.sprite.Group()
enemy_group = pygame.sprite.Group()

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

# 初始化障碍物数量
for _ in range(8):
    obs = Obstacle()
    all_sprites.add(obs)
    enemy_group.add(obs)

# 文字渲染配置
score = 0
score_font = pygame.font.SysFont("SimHei", 40)
gameover_font = pygame.font.SysFont("SimHei", 65)
tip_font = pygame.font.SysFont("SimHei", 32)

game_over = False
game_running = True

# 主游戏循环
while game_running:
    clock.tick(FPS)
    # 事件捕获
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            game_running = False
        # 游戏结束后按空格键重新开局
        if game_over and event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                game_over = False
                score = 0
                # 重置玩家位置
                player_ship.rect.centerx = WIDTH // 2
                player_ship.rect.bottom = HEIGHT - 30
                # 清空旧障碍物重新生成
                enemy_group.empty()
                all_sprites.empty()
                all_sprites.add(player_ship)
                for _ in range(8):
                    new_obs = Obstacle()
                    all_sprites.add(new_obs)
                    enemy_group.add(new_obs)

    if not game_over:
        all_sprites.update()
        # 碰撞判定：撞到障碍物游戏结束
        crash = pygame.sprite.spritecollide(player_ship, enemy_group, False)
        if crash:
            game_over = True
        # 实时累加分数
        score += 1 / FPS

    # 星空黑色背景
    screen.fill(BLACK)
    all_sprites.draw(screen)

    # 绘制分数面板
    score_text = score_font.render(f"得分：{int(score)}", True, WHITE)
    screen.blit(score_text, (15, 12))

    # 游戏结束弹窗
    if game_over:
        over_text = gameover_font.render("游戏结束", True, RED)
        restart_tip = tip_font.render("按空格键重新开始", True, GREEN)
        screen.blit(over_text, (WIDTH//2 - over_text.get_width()//2, HEIGHT//2 - 70))
        screen.blit(restart_tip, (WIDTH//2 - restart_tip.get_width()//2, HEIGHT//2 + 20))

    pygame.display.update()

pygame.quit()
sys.exit()