import pygame
import random
import sys

# 初始化Pygame
pygame.init()

# 游戏窗口设置
WINDOW_WIDTH = 800
WINDOW_HEIGHT = 600
screen = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
pygame.display.set_caption("极速驾驶")

# 颜色定义
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 200, 0)
BLUE = (50, 100, 250)
YELLOW = (255, 215, 0)
GRAY = (128, 128, 128)

class PlayerCar:
    def __init__(self):
        self.width = 60
        self.height = 80
        self.x = WINDOW_WIDTH // 2 - self.width // 2
        self.y = WINDOW_HEIGHT - 150
        self.speed = 5
        self.dx = 0
        
    def move(self):
        self.x += self.dx
        # 边界限制
        if self.x < 20:
            self.x = 20
        elif self.x > WINDOW_WIDTH - self.width - 20:
            self.x = WINDOW_WIDTH - self.width - 20
            
    def draw(self):
        # 车身
        pygame.draw.rect(screen, BLUE, (self.x, self.y, self.width, self.height), border_radius=10)
        # 车窗
        pygame.draw.rect(screen, WHITE, (self.x + 10, self.y + 15, 40, 25), border_radius=5)
        # 车轮
        pygame.draw.rect(screen, BLACK, (self.x - 5, self.y + 10, 8, 30))
        pygame.draw.rect(screen, BLACK, (self.x + self.width - 3, self.y + 10, 8, 30))
        pygame.draw.rect(screen, BLACK, (self.x - 5, self.y + self.height - 35, 8, 28))
        pygame.draw.rect(screen, BLACK, (self.x + self.width - 3, self.y + self.height - 38, 8, 31))

class EnemyCar:
    def __init__(self):
        self.width = 55
        self.height = 75
        self.x = random.randint(30, WINDOW_WIDTH - self.width - 70)
        self.y = -100
        self.speed = random.randint(4, 9)
        
    def move(self):
        self.y += self.speed
        return self.y > WINDOW_HEIGHT
    
    def draw(self):
        # 敌方车辆
        pygame.draw.rect(screen, RED, (self.x, self.y, self.width, self.height), border_radius=8)
        pygame.draw.rect(screen, YELLOW, (self.x + 8, self.y + 12, 39, 22), border_radius=4)
        # 车轮
        pygame.draw.rect(screen, BLACK, (self.x - 4, self.y + 8, 7, 26))
        pygame.draw.rect(screen, BLACK, (self.x + self.width - 3, self.y + 11, 7, 23))
        pygame.draw.rect(screen, BLACK, (self.x - 4, self.y + self.height - 32, 7, 24))
        pygame.draw.rect(screen, BLACK, (self.x + self.width - 3, self.y + self.height - 29, 7, 21))

class Road:
    def __init__(self):
        self.lane_width = 120
        self.lanes = [100, 240, 380, 520]
        self.line_y = 0
        self.line_speed = 6
        
    def update(self):
        self.line_y += self.line_speed
        if self.line_y >= 500:
            self.line_y = 0
            
    def draw(self):
        # 路面
        pygame.draw.rect(screen, GRAY, (0, 0, WINDOW_WIDTH, WINDOW_HEIGHT))
        # 车道线
        for lane_x in self.lanes:
            for i in range(-1, 7):
                y_pos = self.line_y + i * 90
                if 0 <= y_pos <= WINDOW_HEIGHT:
                    pygame.draw.rect(screen, WHITE, (lane_x, y_pos, 10, 45))
        # 路肩
        pygame.draw.rect(screen, GREEN, (0, 0, 18, WINDOW_HEIGHT))
        pygame.draw.rect(screen, GREEN, (WINDOW_WIDTH - 16, 0, 14, WINDOW_HEIGHT))

def show_game_over(score):
    font_large = pygame.font.Font(None, 72)
    font_small = pygame.font.Font(None, 36)
    
    screen.fill(BLACK)
    
    game_over_text = font_large.render("游戏结束", True, RED)
    score_text = font_small.render(f"得分: {score}", True, WHITE)
    restart_text = font_small.render("按 R 键重新开始", True, WHITE)
    quit_text = font_small.render("按 Q 键退出", True, WHITE)
    
    text_rect = game_over_text.get_rect(center=(WINDOW_WIDTH//2, WINDOW_HEIGHT//2 - 80))
    score_rect = score_text.get_rect(center=(WINDOW_WIDTH//2, WINDOW_HEIGHT//2))
    restart_rect = restart_text.get_rect(center=(WINDOW_WIDTH//2, WINDOW_HEIGHT//2 + 60))
    quit_rect = quit_text.get_rect(center=(WINDOW_WIDTH//2, WINDOW_HEIGHT//2 + 110))
    
    screen.blit(game_over_text, text_rect)
    screen.blit(score_text, score_rect)
    screen.blit(restart_text, restart_rect)
    screen.blit(quit_text, quit_rect)
    
    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.KEYDOWN:
                if event.key == pygame.K_r:
                    waiting = False
                    main_game()
                elif event.key == pygame.K_q:
                    pygame.quit()
                    sys.exit()

def main_game():
    clock = pygame.time.Clock()
    running = True
    
    player = PlayerCar()
    enemies = []
    road = Road()
    score = 0
    spawn_timer = 0
    
    # 字体
    font = pygame.font.Font(None, 48)
    
    while running:
        # 事件处理
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT or event.key == pygame.K_a:
                    player.dx = -player.speed
                elif event.key == pygame.K_RIGHT or event.key == pygame.K_d:
                    player.dx = player.speed
                elif event.key == pygame.K_SPACE:
                    # 加速功能
                    player.speed = 8
            if event.type == pygame.KEYUP:
                if event.key in [pygame.K_LEFT, pygame.K_RIGHT, pygame.K_a, pygame.K_d]:
                    player.dx = 0
                elif event.key == pygame.K_SPACE:
                    player.speed = 5
        
        # 更新游戏状态
        player.move()
        road.update()
        
        # 生成敌方车辆
        spawn_timer += 1
        if spawn_timer > 40:
            enemies.append(EnemyCar())
            spawn_timer = 0
            # 增加难度
            if len(enemies) > 5:
                for enemy in enemies:
                    enemy.speed = min(enemy.speed + 0.5, 13)
        
        # 移动并移除越界的敌方车辆
        enemies = [enemy for enemy in enemies if not enemy.move()]
        
        # 碰撞检测
        player_rect = pygame.Rect(player.x, player.y, player.width, player.height)
        for enemy in enemies[:]:
            enemy_rect = pygame.Rect(enemy.x, enemy.y, enemy.width, enemy.height)
            if player_rect.colliderect(enemy_rect):
                show_game_over(score)
                return
        
        # 更新分数
        score += 1
        
        # 绘制画面
        road.draw()
        player.draw()
        for enemy in enemies:
            enemy.draw()
        
        # 显示分数
        score_text = font.render(f"分数: {score}", True, WHITE)
        screen.blit(score_text, (20, 20))
        
        # 显示控制提示
        control_font = pygame.font.Font(None, 24)
        controls = control_font.render("← → 或 A D 移动 | SPACE 加速", True, WHITE)
        screen.blit(controls, (WINDOW_WIDTH - 280, 580))
        
        pygame.display.flip()
        clock.tick(60)

if __name__ == "__main__":
    # 开始画面
    screen.fill(BLACK)
    title_font = pygame.font.Font(None, 64)
    info_font = pygame.font.Font(None, 36)
    
    title = title_font.render("极速驾驶", True, BLUE)
    start_info = info_font.render("按任意键开始游戏", True, WHITE)
    control_info = info_font.render("方向键/A D 控制左右 | 空格加速", True, WHITE)
    
    title_rect = title.get_rect(center=(WINDOW_WIDTH//2, WINDOW_HEIGHT//2 - 60))
    start_rect = start_info.get_rect(center=(WINDOW_WIDTH//2, WINDOW_HEIGHT//2 + 20))
    control_rect = control_info.get_rect(center=(WINDOW_WIDTH//2, WINDOW_HEIGHT//2 + 70))
    
    screen.blit(title, title_rect)
    screen.blit(start_info, start_rect)
    screen.blit(control_info, control_rect)
    
    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.KEYDOWN:
                waiting = False
                main_game()


















