import pygame
import random
import sys

# 初始化 pygame
pygame.init()

# -------------------------- 游戏基础设置 --------------------------
WIDTH, HEIGHT = 800, 600
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 = (128, 128, 128)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
YELLOW = (255, 255, 0)

# 道路参数
ROAD_WIDTH = 500
ROAD_X = (WIDTH - ROAD_WIDTH) // 2

# -------------------------- 玩家汽车类 --------------------------
class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((50, 80), pygame.SRCALPHA)
        # 画一辆简单的汽车
        pygame.draw.rect(self.image, BLUE, (0, 20, 50, 60))
        pygame.draw.circle(self.image, BLACK, (10, 20), 10)
        pygame.draw.circle(self.image, BLACK, (40, 20), 10)
        pygame.draw.circle(self.image, BLACK, (10, 80), 10)
        pygame.draw.circle(self.image, BLACK, (40, 80), 10)
        
        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_LEFT] and self.rect.left > ROAD_X:
            self.rect.x -= self.speed
        if keys[pygame.K_RIGHT] and self.rect.right < ROAD_X + ROAD_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 Obstacle(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.width = random.randint(60, 120)
        self.height = random.randint(80, 140)
        self.image = pygame.Surface((self.width, self.height))
        self.image.fill(RED)
        self.rect = self.image.get_rect()
        self.rect.x = random.randint(ROAD_X, ROAD_X + ROAD_WIDTH - self.width)
        self.rect.y = random.randint(-200, -50)
        self.speed = random.randint(5, 9)

    def update(self):
        self.rect.y += self.speed
        # 出屏幕后重置
        if self.rect.top > HEIGHT:
            self.reset()

    def reset(self):
        self.rect.x = random.randint(ROAD_X, ROAD_X + ROAD_WIDTH - self.width)
        self.rect.y = random.randint(-200, -50)
        self.speed = random.randint(5, 9)

# -------------------------- 文字绘制函数 --------------------------
def draw_text(text, size, color, x, y):
    font = pygame.font.SysFont(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("驾驶小游戏", 80, BLACK, WIDTH//2, HEIGHT//4)
    draw_text("方向键控制汽车移动", 40, BLACK, WIDTH//2, HEIGHT//2)
    draw_text("按任意键开始游戏", 50, GREEN, WIDTH//2, HEIGHT*3//4)
    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.KEYUP:
                waiting = False

# -------------------------- 结束界面 --------------------------
def show_go_screen(score):
    screen.fill(GRAY)
    draw_text("游戏结束", 80, RED, WIDTH//2, HEIGHT//4)
    draw_text(f"得分：{score}", 60, BLACK, WIDTH//2, HEIGHT//2)
    draw_text("按任意键重新开始", 50, GREEN, WIDTH//2, HEIGHT*3//4)
    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.KEYUP:
                waiting = False

# -------------------------- 主游戏函数 --------------------------
def new_game():
    # 精灵组
    all_sprites = pygame.sprite.Group()
    obstacles = pygame.sprite.Group()

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

    # 创建障碍物
    for _ in range(3):
        obs = Obstacle()
        all_sprites.add(obs)
        obstacles.add(obs)

    # 游戏数据
    score = 0
    start_time = pygame.time.get_ticks()

    # 游戏循环
    game_over = False
    while not game_over:
        clock.tick(FPS)

        # 事件处理
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

        # 更新
        all_sprites.update()

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

        # 计分（按时间）
        score = (pygame.time.get_ticks() - start_time) // 100

        # 绘制
        screen.fill(GRAY)
        # 画道路
        pygame.draw.rect(screen, BLACK, (ROAD_X, 0, ROAD_WIDTH, HEIGHT))
        # 画道路线
        for i in range(0, HEIGHT, 40):
            pygame.draw.rect(screen, WHITE, (WIDTH//2 - 5, i, 10, 20))
        
        all_sprites.draw(screen)
        
        # 显示分数
        draw_text(f"得分: {score}", 40, YELLOW, WIDTH//2, 30)

        pygame.display.flip()

    return score

# -------------------------- 游戏主流程 --------------------------
show_start_screen()
while True:
    score = new_game()
    show_go_screen(score)