import pygame
import random
import sys

# 初始化 pygame
pygame.init()

# 屏幕设置
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("2D赛车")

# 颜色
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
GRAY = (200, 200, 200)
DARK_GRAY = (50, 50, 50)
BROWN = (139, 69, 19)
RED = (200, 0, 0)

# 字体
font = pygame.font.Font(None, 36)

# 游戏时钟
clock = pygame.time.Clock()

# 赛车类
class Car:
    def __init__(self):
        self.width = 60
        self.height = 100
        self.x = SCREEN_WIDTH // 2 - self.width // 2
        self.y = SCREEN_HEIGHT - self.height - 30
        self.speed = 5
        self.image = pygame.Surface((self.width, self.height))
        self.image.fill(BROWN)

        # 简单画一个古风马车造型
        pygame.draw.rect(self.image, (100, 50, 10), (10, 30, 40, 60))
        pygame.draw.circle(self.image, BLACK, (20, 90), 12)
        pygame.draw.circle(self.image, BLACK, (40, 90), 12)
        pygame.draw.polygon(self.image, (255, 200, 100), [(30, 10), (10, 30), (50, 30)])

    def move(self, keys):
        if keys[pygame.K_LEFT] and self.x > 120:
            self.x -= self.speed
        if keys[pygame.K_RIGHT] and self.x < SCREEN_WIDTH - self.width - 120:
            self.x += self.speed
        if keys[pygame.K_UP] and self.y > 0:
            self.y -= self.speed
        if keys[pygame.K_DOWN] and self.y < SCREEN_HEIGHT - self.height:
            self.y += self.speed

    def draw(self, screen):
        screen.blit(self.image, (self.x, self.y))

    def get_rect(self):
        return pygame.Rect(self.x, self.y, self.width, self.height)

# 障碍物类
class Obstacle:
    def __init__(self, speed):
        self.width = random.choice([50, 60, 70])
        self.height = random.choice([50, 60, 70])
        lane = random.choice([1, 2, 3])
        if lane == 1:
            self.x = 150
        elif lane == 2:
            self.x = SCREEN_WIDTH // 2 - self.width // 2
        else:
            self.x = SCREEN_WIDTH - 150 - self.width

        self.y = -self.height
        self.speed = speed
        self.color = random.choice([(80, 80, 80), (120, 60, 20), (34, 139, 34)])

    def update(self):
        self.y += self.speed

    def draw(self, screen):
        pygame.draw.rect(screen, self.color, (self.x, self.y, self.width, self.height))
        if self.color == (34, 139, 34):
            pygame.draw.circle(screen, (0, 100, 0), (self.x + self.width // 2, self.y + 20), 25)

    def get_rect(self):
        return pygame.Rect(self.x, self.y, self.width, self.height)

    def is_off_screen(self):
        return self.y > SCREEN_HEIGHT

# 绘制古风背景
def draw_bg(screen, scroll_y):
    # 宣纸色背景
    screen.fill((245, 235, 200))

    # 滚动水墨山影
    for i in range(5):
        offset = (scroll_y + i * 150) % (SCREEN_HEIGHT + 200) - 100
        pygame.draw.polygon(screen, (180, 180, 180), [
            (0, offset + 200),
            (100, offset + 80),
            (200, offset + 200)
        ])
        pygame.draw.polygon(screen, (160, 160, 160), [
            (250, offset + 200),
            (400, offset + 50),
            (550, offset + 200)
        ])
        pygame.draw.polygon(screen, (200, 200, 200), [
            (600, offset + 200),
            (750, offset + 90),
            (800, offset + 200)
        ])

    # 道路边框
    pygame.draw.rect(screen, (220, 180, 140), (100, 0, SCREEN_WIDTH - 200, SCREEN_HEIGHT))
    pygame.draw.line(screen, (180, 130, 80), (100, 0), (100, SCREEN_HEIGHT), 5)
    pygame.draw.line(screen, (180, 130, 80), (SCREEN_WIDTH - 100, 0), (SCREEN_WIDTH - 100, SCREEN_HEIGHT), 5)

    # 道路虚线
    for y in range(0, SCREEN_HEIGHT, 40):
        pygame.draw.rect(screen, (150, 100, 50), (SCREEN_WIDTH // 2 - 5, y + scroll_y % 40, 10, 25))

# 主游戏函数
def main():
    car = Car()
    obstacles = []
    obstacle_timer = 0
    base_speed = 5
    score = 0
    scroll_y = 0

    running = True
    while running:
        clock.tick(60)

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False

        keys = pygame.key.get_pressed()
        car.move(keys)

        # 背景滚动
        scroll_y += base_speed
        if scroll_y >= 40:
            scroll_y = 0

        # 生成障碍物
        obstacle_timer += 1
        if obstacle_timer > 60:
            obstacles.append(Obstacle(base_speed))
            obstacle_timer = max(20, 60 - score // 500)

        # 更新障碍物
        for obstacle in obstacles[:]:
            obstacle.update()
            if obstacle.is_off_screen():
                obstacles.remove(obstacle)
                score += 10

        # 碰撞检测
        car_rect = car.get_rect()
        for obstacle in obstacles:
            if car_rect.colliderect(obstacle.get_rect()):
                running = False

        # 逐渐加速
        base_speed = 5 + score // 1000

        # 绘制
        draw_bg(screen, scroll_y)
        car.draw(screen)
        for obstacle in obstacles:
            obstacle.draw(screen)

        # 显示分数
        score_text = font.render(f"分数: {score}", True, DARK_GRAY)
        screen.blit(score_text, (20, 20))

        # 显示速度
        speed_text = font.render(f"速度: {base_speed}", True, DARK_GRAY)
        screen.blit(speed_text, (20, 60))

        pygame.display.flip()

    # 游戏结束界面
    screen.fill((245, 235, 200))
    game_over_text = font.render("游戏结束", True, RED)
    final_score_text = font.render(f"最终分数: {score}", True, DARK_GRAY)
    tip_text = font.render("按 ESC 退出", True, GRAY)

    screen.blit(game_over_text, (SCREEN_WIDTH // 2 - 70, SCREEN_HEIGHT // 2 - 60))
    screen.blit(final_score_text, (SCREEN_WIDTH // 2 - 70, SCREEN_HEIGHT // 2 - 10))
    screen.blit(tip_text, (SCREEN_WIDTH // 2 - 60, SCREEN_HEIGHT // 2 + 40))

    pygame.display.flip()

    waiting = True
    while waiting:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                waiting = False
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:
                    waiting = False

    pygame.quit()
    sys.exit()

if __name__ == "__main__":
    main()