import pygame
import random
import math

# 初始化Pygame
pygame.init()

# 游戏窗口设置
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("2D赛车游戏 - 躲避车流")

# 颜色定义
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
YELLOW = (255, 255, 0)
GRAY = (128, 128, 128)
DARK_GRAY = (64, 64, 64)

# 游戏设置
FPS = 60
clock = pygame.time.Clock()
font = pygame.font.Font(None, 36)
large_font = pygame.font.Font(None, 72)

class PlayerCar:
    def __init__(self):
        self.width = 50
        self.height = 80
        self.x = SCREEN_WIDTH // 2 - self.width // 2
        self.y = SCREEN_HEIGHT - self.height - 20
        self.speed = 7
        self.image = self.create_car_image(GREEN)
        
    def create_car_image(self, color):
        """创建赛车图像"""
        car = pygame.Surface((self.width, self.height))
        car.fill(color)
        # 添加车窗
        pygame.draw.rect(car, BLUE, (10, 10, 30, 25))
        pygame.draw.rect(car, BLUE, (10, 45, 30, 25))
        # 添加车灯
        pygame.draw.circle(car, YELLOW, (5, 10), 5)
        pygame.draw.circle(car, YELLOW, (5, self.height-10), 5)
        pygame.draw.circle(car, YELLOW, (self.width-5, 10), 5)
        pygame.draw.circle(car, YELLOW, (self.width-5, self.height-10), 5)
        return car
        
    def move(self, keys):
        if keys[pygame.K_LEFT] and self.x > 0:
            self.x -= self.speed
        if keys[pygame.K_RIGHT] and self.x < SCREEN_WIDTH - self.width:
            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.blit(self.image, (self.x, self.y))
        
    def get_rect(self):
        return pygame.Rect(self.x, self.y, self.width, self.height)

class EnemyCar:
    def __init__(self):
        self.width = 50
        self.height = 80
        self.x = random.randint(0, SCREEN_WIDTH - self.width)
        self.y = -self.height
        self.speed = random.randint(3, 8)
        self.color = random.choice([RED, BLUE, GRAY])
        self.image = self.create_car_image(self.color)
        
    def create_car_image(self, color):
        """创建敌方车辆图像"""
        car = pygame.Surface((self.width, self.height))
        car.fill(color)
        # 添加车窗
        pygame.draw.rect(car, (100, 100, 100), (10, 10, 30, 25))
        pygame.draw.rect(car, (100, 100, 100), (10, 45, 30, 25))
        return car
        
    def move(self):
        self.y += self.speed
        
    def draw(self):
        screen.blit(self.image, (self.x, self.y))
        
    def get_rect(self):
        return pygame.Rect(self.x, self.y, self.width, self.height)
        
    def off_screen(self):
        return self.y > SCREEN_HEIGHT

class Road:
    def __init__(self):
        self.x = SCREEN_WIDTH // 2 - 150
        self.width = 300
        self.line_positions = []
        self.lines = []
        self.line_speed = 5
        self.init_lines()
        
    def init_lines(self):
        """初始化道路标线"""
        for i in range(0, SCREEN_HEIGHT, 50):
            self.lines.append(i)
            
    def draw(self):
        # 绘制道路
        pygame.draw.rect(screen, DARK_GRAY, (self.x, 0, self.width, SCREEN_HEIGHT))
        # 绘制道路边缘
        pygame.draw.rect(screen, WHITE, (self.x, 0, 5, SCREEN_HEIGHT))
        pygame.draw.rect(screen, WHITE, (self.x + self.width - 5, 0, 5, SCREEN_HEIGHT))
        
        # 绘制车道线
        for i, y in enumerate(self.lines):
            pygame.draw.rect(screen, WHITE, (self.x + self.width//2 - 5, y, 10, 30))
            self.lines[i] = y + self.line_speed
            if self.lines[i] > SCREEN_HEIGHT:
                self.lines[i] = -30

def show_start_screen():
    """显示开始界面"""
    screen.fill(BLACK)
    title_text = large_font.render("2D RACING GAME", True, GREEN)
    start_text = font.render("Press SPACE to Start", True, WHITE)
    controls_text = font.render("Controls: LEFT/RIGHT/UP/DOWN to move", True, WHITE)
    
    screen.blit(title_text, (SCREEN_WIDTH//2 - title_text.get_width()//2, 200))
    screen.blit(start_text, (SCREEN_WIDTH//2 - start_text.get_width()//2, 300))
    screen.blit(controls_text, (SCREEN_WIDTH//2 - controls_text.get_width()//2, 350))
    
    pygame.display.flip()
    
    waiting = True
    while waiting:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                return False
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE:
                    waiting = False
    return True

def show_game_over(score):
    """显示游戏结束界面"""
    screen.fill(BLACK)
    game_over_text = large_font.render("GAME OVER", True, RED)
    score_text = font.render(f"Score: {score}", True, WHITE)
    restart_text = font.render("Press SPACE to Restart or ESC to Quit", True, WHITE)
    
    screen.blit(game_over_text, (SCREEN_WIDTH//2 - game_over_text.get_width()//2, 200))
    screen.blit(score_text, (SCREEN_WIDTH//2 - score_text.get_width()//2, 300))
    screen.blit(restart_text, (SCREEN_WIDTH//2 - restart_text.get_width()//2, 350))
    
    pygame.display.flip()
    
    waiting = True
    while waiting:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                return False
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE:
                    return True
                if event.key == pygame.K_ESCAPE:
                    return False
    return False

def main():
    """主游戏循环"""
    running = True
    
    while running:
        # 显示开始界面
        if not show_start_screen():
            break
            
        # 游戏初始化
        player = PlayerCar()
        enemies = []
        road = Road()
        score = 0
        game_state = "playing"
        
        # 游戏循环
        clock = pygame.time.Clock()
        running_game = True
        
        while running_game:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    running_game = False
                    running = False
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_ESCAPE:
                        running_game = False
                        running = False
            
            # 获取按键
            keys = pygame.key.get_pressed()
            
            # 更新玩家位置
            player.move(keys)
            
            # 生成敌方车辆
            if random.randint(1, 30) == 1:
                enemies.append(EnemyCar())
            
            # 更新敌方车辆位置
            for enemy in enemies[:]:
                enemy.move()
                if enemy.off_screen():
                    enemies.remove(enemy)
                    score += 10
            
            # 碰撞检测
            player_rect = player.get_rect()
            for enemy in enemies:
                if player_rect.colliderect(enemy.get_rect()):
                    game_state = "game_over"
            
            # 绘制游戏画面
            screen.fill(BLACK)
            road.draw()
            player.draw()
            for enemy in enemies:
                enemy.draw()
            
            # 显示分数
            score_text = font.render(f"Score: {score}", True, WHITE)
            screen.blit(score_text, (10, 10))
            
            pygame.display.flip()
            clock.tick(FPS)
            
            # 游戏结束
            if game_state == "game_over":
                if not show_game_over(score):
                    running_game = False
                    running = False
                else:
                    break
    
    pygame.quit()

if __name__ == "__main__":
    main()