import pygame
import random
import sys

# 初始化Pygame
pygame.init()

# ====================== 游戏基础设置 ======================
WIDTH, HEIGHT = 480, 700
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("驾驶小游戏")
clock = pygame.time.Clock()
FPS = 60

# 颜色定义
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
GRAY = (50, 50, 50)
RED = (200, 0, 0)
GREEN = (0, 200, 0)
BLUE = (0, 100, 255)
YELLOW = (255, 255, 0)

# 道路参数
road_width = 380
road_left = (WIDTH - road_width) // 2
road_right = road_left + road_width

# ====================== 玩家汽车类 ======================
class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((50, 90))
        self.image.fill(BLUE)
        self.rect = self.image.get_rect()
        self.rect.centerx = WIDTH // 2
        self.rect.bottom = HEIGHT - 50
        self.speed = 8

    def update(self):
        # 上下左右控制
        keys = pygame.key.get_pressed()
        if keys[pygame.K_UP] and self.rect.top > 100:
            self.rect.y -= self.speed
        if keys[pygame.K_DOWN] and self.rect.bottom < HEIGHT - 20:
            self.rect.y += self.speed
        if keys[pygame.K_LEFT] and self.rect.left > road_left:
            self.rect.x -= self.speed
        if keys[pygame.K_RIGHT] and self.rect.right < road_right:
            self.rect.x += self.speed

# ====================== 障碍物车辆类 ======================
class Enemy(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((50, 90))
        self.image.fill(RED)
        self.rect = self.image.get_rect()
        # 随机出生在道路上
        self.rect.x = random.choice([road_left + 40, road_left + 140, road_left + 240])
        self.rect.y = random.randint(-300, -100)
        self.speed = random.randint(6, 10)

    def update(self):
        self.rect.y += self.speed
        # 出屏幕后删除
        if self.rect.top > HEIGHT:
            self.kill()

# ====================== 道路滚动 ======================
class RoadLine:
    def __init__(self):
        self.y = 0
        self.speed = 8

    def update(self):
        self.y += self.speed
        if self.y > 100:
            self.y = 0

    def draw(self):
        for i in range(-100, HEIGHT, 100):
            pygame.draw.rect(screen, YELLOW, (WIDTH//2 - 5, self.y + i, 10, 60))

# ====================== 文字绘制函数（修复版） ======================
def draw_text(text, size, color, x, y):
    # 固定使用系统支持的字体，彻底解决sysfont报错问题
    font = pygame.font.Font(None, size)
    text_surface = font.render(text, True, color)
    text_rect = text_surface.get_rect()
    text_rect.center = (x, y)
    screen.blit(text_surface, text_rect)

# ====================== 主菜单 ======================
def show_start_screen():
    screen.fill(GRAY)
    draw_text("驾驶小游戏", 60, WHITE, WIDTH//2, HEIGHT//3)
    draw_text("按 空格键 开始游戏", 40, GREEN, WIDTH//2, HEIGHT//2)
    draw_text("方向键控制移动", 30, WHITE, WIDTH//2, HEIGHT//2 + 80)
    pygame.display.flip()
    
    waiting = True
    while waiting:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
                waiting = False

# ====================== 游戏结束界面 ======================
def show_game_over_screen(score):
    screen.fill(GRAY)
    draw_text("游戏结束", 60, RED, WIDTH//2, HEIGHT//3)
    draw_text(f"最终得分：{score}", 40, WHITE, WIDTH//2, HEIGHT//2)
    draw_text("按 空格键 重新开始", 35, GREEN, WIDTH//2, HEIGHT//2 + 70)
    draw_text("按 Q 退出", 30, WHITE, WIDTH//2, HEIGHT//2 + 120)
    pygame.display.flip()
    
    waiting = True
    while waiting:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE:
                    waiting = False
                if event.key == pygame.K_q:
                    pygame.quit()
                    sys.exit()

# ====================== 游戏主循环 ======================
def new_game():
    # 显示开始界面
    show_start_screen()

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

    player = Player()
    all_sprites.add(player)

    road = RoadLine()
    score = 0
    spawn_timer = 0

    running = True
    game_over = False

    while running:
        clock.tick(FPS)

        # 事件处理
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False

        if not game_over:
            # 生成障碍物
            spawn_timer += 1
            if spawn_timer > 30:
                enemy = Enemy()
                all_sprites.add(enemy)
                enemies.add(enemy)
                spawn_timer = 0

            # 更新
            all_sprites.update()
            road.update()

            # 碰撞检测
            hits = pygame.sprite.spritecollide(player, enemies, True)
            if hits:
                game_over = True

            # 计分
            score += 1

        # 绘制界面
        screen.fill(GRAY)
        # 画道路
        pygame.draw.rect(screen, BLACK, (road_left, 0, road_width, HEIGHT))
        road.draw()

        all_sprites.draw(screen)

        # 显示分数
        draw_text(f"分数：{score}", 40, WHITE, WIDTH//2, 50)

        if game_over:
            show_game_over_screen(score)
            return  # 退出当前游戏，回到new_game重新开始

        pygame.display.flip()

    pygame.quit()
    sys.exit()

# 启动游戏
if __name__ == "__main__":
    while True:
        new_game()