import pygame
import random
import sys

# --- 初始化 Pygame ---
pygame.init()

# --- 常量定义 ---
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
FPS = 60

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

# 游戏设置
PLAYER_SIZE = 50
OBSTACLE_SIZE = 50
PLAYER_SPEED = 7
OBSTACLE_SPEED = 5
OBSTACLE_SPAWN_RATE = 30  # 帧数间隔，越小生成越快

# --- 类定义 ---

class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        # 创建一个简单的红色矩形代表赛车
        self.image = pygame.Surface((PLAYER_SIZE, PLAYER_SIZE))
        self.image.fill(RED)
        # 画点细节让它看起来像车
        pygame.draw.rect(self.image, BLACK, (10, 10, 30, 30)) # 车窗
        pygame.draw.circle(self.image, BLACK, (10, 45), 5)    # 左后轮
        pygame.draw.circle(self.image, BLACK, (40, 45), 5)    # 右后轮
        
        self.rect = self.image.get_rect()
        self.rect.centerx = SCREEN_WIDTH // 2
        self.rect.bottom = SCREEN_HEIGHT - 20
        self.speed_x = 0

    def update(self):
        # 键盘控制
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT] or keys[pygame.K_a]:
            self.speed_x = -PLAYER_SPEED
        elif keys[pygame.K_RIGHT] or keys[pygame.K_d]:
            self.speed_x = PLAYER_SPEED
        else:
            self.speed_x = 0

        self.rect.x += self.speed_x

        # 边界检查
        if self.rect.left < 0:
            self.rect.left = 0
        if self.rect.right > SCREEN_WIDTH:
            self.rect.right = SCREEN_WIDTH

class Obstacle(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((OBSTACLE_SIZE, OBSTACLE_SIZE))
        self.image.fill(BLUE)
        # 画点细节
        pygame.draw.rect(self.image, WHITE, (10, 10, 30, 10)) # 车窗
        
        self.rect = self.image.get_rect()
        self.rect.x = random.randrange(0, SCREEN_WIDTH - OBSTACLE_SIZE)
        self.rect.y = random.randrange(-100, -40)
        self.speed_y = random.randint(OBSTACLE_SPEED, OBSTACLE_SPEED + 3)

    def update(self):
        self.rect.y += self.speed_y
        # 如果超出屏幕底部，移除对象
        if self.rect.top > SCREEN_HEIGHT:
            self.kill()

# --- 主游戏函数 ---

def draw_text(surface, text, size, x, y, color=WHITE):
    font = pygame.font.Font(pygame.font.match_font('arial'), size)
    text_surface = font.render(text, True, color)
    text_rect = text_surface.get_rect()
    text_rect.midtop = (x, y)
    surface.blit(text_surface, text_rect)

def main():
    screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
    pygame.display.set_caption("Python 2D 极速赛车")
    clock = pygame.time.Clock()

    # 精灵组
    all_sprites = pygame.sprite.Group()
    obstacles = pygame.sprite.Group()
    
    player = Player()
    all_sprites.add(player)

    score = 0
    frame_count = 0
    running = True
    game_over = False

    while running:
        # 1. 事件处理
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            
            if game_over and event.type == pygame.KEYDOWN:
                if event.key == pygame.K_r: # 按 R 重启
                    main()
                    return

        if not game_over:
            # 2. 更新逻辑
            all_sprites.update()

            # 生成障碍物
            frame_count += 1
            if frame_count >= OBSTACLE_SPAWN_RATE:
                obstacle = Obstacle()
                all_sprites.add(obstacle)
                obstacles.add(obstacle)
                frame_count = 0
                # 随着分数增加，稍微加快生成速度
                if score % 5 == 0 and OBSTACLE_SPAWN_RATE > 10:
                     pass # 这里可以做动态难度调整逻辑

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

            # 计分 (每存活一帧加一点分，或者每躲过一个障碍加分)
            # 这里简单处理：每帧加分
            score += 1

        # 3. 绘制渲染
        screen.fill(GRAY) # 背景色（路面）

        # 画跑道线
        pygame.draw.rect(screen, WHITE, (SCREEN_WIDTH//2 - 5, 0, 10, SCREEN_HEIGHT))
        # 模拟移动效果：画虚线
        line_offset = (pygame.time.get_ticks() // 5) % 40
        for i in range(-40, SCREEN_HEIGHT, 40):
            pygame.draw.rect(screen, YELLOW, (SCREEN_WIDTH//2 - 2, i + line_offset, 4, 20))

        all_sprites.draw(screen)

        # UI 显示
        draw_text(screen, f"Score: {score}", 30, SCREEN_WIDTH / 2, 10)

        if game_over:
            draw_text(screen, "GAME OVER", 64, SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2 - 50, RED)
            draw_text(screen, "Press 'R' to Restart", 30, SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2 + 20)
            draw_text(screen, f"Final Score: {score}", 40, SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2 + 60, YELLOW)

        # 翻转显示
        pygame.display.flip()
        
        # 控制帧率
        clock.tick(FPS)

    pygame.quit()
    sys.exit()

if __name__ == "__main__":
    main()