import pygame
import random
import sys

# 初始化Pygame
pygame.init()

# 游戏窗口设置
WIDTH, HEIGHT = 500, 700
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Pygame 赛车小游戏")
clock = pygame.time.Clock()

# 颜色定义
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
GRAY = (50, 50, 50)

# ----------------------
# 【关键修复】加载中文字体
# ----------------------


def get_chinese_font(size):
    try:
        # Windows 系统字体
        return pygame.font.Font("C:/Windows/Fonts/msyh.ttc", size)
    except:
        try:
            # Mac 系统字体
            return pygame.font.Font("/System/Library/Fonts/PingFang.ttc", size)
        except:
            # 备用方案
            return pygame.font.SysFont("simhei", size)

# 玩家赛车类


class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((50, 80))
        self.image.fill(GREEN)
        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 > 0:
            self.rect.x -= self.speed
        if keys[pygame.K_RIGHT] and self.rect.right < WIDTH:
            self.rect.x += self.speed

# 敌人车辆类


class Enemy(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((50, 80))
        self.image.fill(RED)
        self.rect = self.image.get_rect()
        self.rect.x = random.randint(0, WIDTH - 50)
        self.rect.y = random.randint(-200, -80)
        self.speed = random.randint(5, 8)

    def update(self):
        self.rect.y += self.speed
        if self.rect.top > HEIGHT:
            self.rect.x = random.randint(0, WIDTH - 50)
            self.rect.y = random.randint(-200, -80)
            self.speed = random.randint(5, 8)

# 背景滚动（赛道效果）


class Background:
    def __init__(self):
        self.bg_y1 = 0
        self.bg_y2 = -HEIGHT
        self.speed = 5

    def update(self):
        self.bg_y1 += self.speed
        self.bg_y2 += self.speed
        if self.bg_y1 >= HEIGHT:
            self.bg_y1 = -HEIGHT
        if self.bg_y2 >= HEIGHT:
            self.bg_y2 = -HEIGHT

    def draw(self):
        pygame.draw.rect(screen, GRAY, (0, self.bg_y1, WIDTH, HEIGHT))
        pygame.draw.rect(screen, GRAY, (0, self.bg_y2, WIDTH, HEIGHT))
        # 道路中线
        pygame.draw.rect(screen, WHITE, (WIDTH//2 - 5, self.bg_y1, 10, 80))
        pygame.draw.rect(screen, WHITE, (WIDTH//2 - 5, self.bg_y2, 10, 80))

# 主游戏函数


def game_loop():
    # 创建精灵组
    all_sprites = pygame.sprite.Group()
    enemies = pygame.sprite.Group()

    # 玩家
    player = Player()
    all_sprites.add(player)

    # 生成敌人
    for _ in range(3):
        enemy = Enemy()
        all_sprites.add(enemy)
        enemies.add(enemy)

    # 背景
    bg = Background()

    # 分数
    score = 0

    # ----------------------
    # 使用中文字体
    # ----------------------
    font_score = get_chinese_font(40)
    font_gameover = get_chinese_font(60)
    font_restart = get_chinese_font(35)

    # 游戏状态
    game_over = False

    while True:
        # 事件处理
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if game_over and event.type == pygame.KEYDOWN:
                game_loop()

        if not game_over:
            # 更新
            all_sprites.update()
            bg.update()
            score += 1

            # 碰撞检测
            if pygame.sprite.spritecollideany(player, enemies):
                game_over = True

        # 绘制
        bg.draw()
        all_sprites.draw(screen)

        # 显示分数（中文正常）
        score_text = font_score.render(f"分数：{score}", True, WHITE)
        screen.blit(score_text, (10, 10))

        # 游戏结束（中文正常）
        if game_over:
            over_text = font_gameover.render("游戏结束！", True, RED)
            restart_text = font_restart.render("按任意键重新开始", True, WHITE)

            screen.blit(over_text, (WIDTH//2 - 120, HEIGHT//2 - 50))
            screen.blit(restart_text, (WIDTH//2 - 160, HEIGHT//2 + 30))

        pygame.display.flip()
        clock.tick(60)


if __name__ == "__main__":
    game_loop()
