import pygame
import random
import sys

# 初始化Pygame
pygame.init()

# ===================== 游戏基础设置 =====================
WIDTH, HEIGHT = 480, 700  # 窗口大小
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("2D赛车小游戏")
clock = pygame.time.Clock()
FPS = 60

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

# 道路参数
road_width = 360
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, 100))
        self.image.fill(RED)
        self.rect = self.image.get_rect()
        # 初始位置：屏幕底部中间
        self.rect.centerx = WIDTH // 2
        self.rect.bottom = HEIGHT - 20
        self.speed = 8

    def update(self):
        # 键盘控制
        keys = pygame.key.get_pressed()
        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
        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 Enemy(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((50, 100))
        self.image.fill(GREEN)
        self.rect = self.image.get_rect()
        # 随机出生在道路上方
        self.rect.x = random.choice([road_left + 40, road_left + 130, road_left + 220])
        self.rect.bottom = random.randint(-200, -50)
        self.speed = random.randint(6, 10)

    def update(self):
        self.rect.y += self.speed
        # 超出屏幕底部后重新生成
        if self.rect.top > HEIGHT:
            self.kill()
            new_enemy = Enemy()
            all_sprites.add(new_enemy)
            enemies.add(new_enemy)

# ===================== 道路标线动画 =====================
class Line(pygame.sprite.Sprite):
    def __init__(self, y):
        super().__init__()
        self.image = pygame.Surface((8, 40))
        self.image.fill(YELLOW)
        self.rect = self.image.get_rect()
        self.rect.centerx = WIDTH // 2
        self.rect.y = y
        self.speed = 7

    def update(self):
        self.rect.y += self.speed
        if self.rect.top > HEIGHT:
            self.rect.bottom = 0

# ===================== 文字绘制函数（修复版） =====================
def draw_text(text, size, x, y, color=WHITE):
    # 这里修复了环境不支持的字体问题
    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("2D 赛车小游戏", 60, WIDTH//2, HEIGHT//4)
    draw_text("方向键控制移动", 40, WIDTH//2, HEIGHT//2)
    draw_text("躲避绿色车辆", 40, WIDTH//2, HEIGHT//2 + 50)
    draw_text("按任意键开始", 30, WIDTH//2, HEIGHT*3//4)
    pygame.display.flip()
    
    waiting = True
    while waiting:
        clock.tick(FPS)
        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("游戏结束", 60, WIDTH//2, HEIGHT//4)
    draw_text(f"最终得分：{score}", 40, WIDTH//2, HEIGHT//2)
    draw_text("按R重玩，按Q退出", 30, WIDTH//2, HEIGHT*3//4)
    pygame.display.flip()
    
    waiting = True
    while waiting:
        clock.tick(FPS)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type == pygame.KEYUP:
                if event.key == pygame.K_r:
                    waiting = False
                if event.key == pygame.K_q:
                    pygame.quit()
                    sys.exit()

# ===================== 游戏主循环 =====================
# 精灵组
all_sprites = pygame.sprite.Group()
enemies = pygame.sprite.Group()
lines = pygame.sprite.Group()

# 创建道路标线
for y in range(0, HEIGHT, 80):
    line = Line(y)
    all_sprites.add(line)
    lines.add(line)

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

# 游戏状态
game_over = False
score = 0

# 显示开始界面
show_start_screen()

# 主循环
running = True
while running:
    clock.tick(FPS)

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

    if not game_over:
        # 生成敌方车辆
        if len(enemies) < 3:
            enemy = Enemy()
            all_sprites.add(enemy)
            enemies.add(enemy)

        # 更新所有精灵
        all_sprites.update()

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

        # 计分
        score += 1
    
    # ===================== 绘制界面 =====================
    screen.fill(GRAY)
    # 绘制道路
    pygame.draw.rect(screen, BLACK, (road_left, 0, road_width, HEIGHT))
    # 绘制所有元素
    all_sprites.draw(screen)
    # 绘制分数
    draw_text(f"得分: {score}", 30, WIDTH//2, 30)
    
    # 游戏结束
    if game_over:
        show_go_screen(score)
        # 重置游戏
        game_over = False
        score = 0
        enemies.empty()
        all_sprites.empty()
        # 重新创建标线和玩家
        for y in range(0, HEIGHT, 80):
            line = Line(y)
            all_sprites.add(line)
            lines.add(line)
        player = Player()
        all_sprites.add(player)
    
    pygame.display.flip()

pygame.quit()
sys.exit()