import pygame
import random
import sys
import math

# 初始化 Pygame
pygame.init()

# 游戏窗口设置
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("2D 赛车游戏 - 马年快乐！")
clock = pygame.time.Clock()
FPS = 60

# 颜色定义
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 50, 50)
BLUE = (50, 100, 255)
GREEN = (50, 200, 50)
GRAY = (100, 100, 100)
YELLOW = (255, 255, 0)
ROAD_COLOR = (60, 60, 60)
GRASS_COLOR = (30, 120, 30)

# 玩家赛车类
class PlayerCar:
    def __init__(self):
        self.width = 40
        self.height = 70
        self.x = WIDTH // 2 - self.width // 2
        self.y = HEIGHT - 150
        self.speed = 0
        self.max_speed = 8
        self.acceleration = 0.2
        self.friction = 0.1
        self.angle = 0
        self.steering = 0
        self.max_steering = 3
        self.color = RED
        
    def update(self, keys):
        # 加速和减速
        if keys[pygame.K_UP] or keys[pygame.K_w]:
            self.speed += self.acceleration
        elif keys[pygame.K_DOWN] or keys[pygame.K_s]:
            self.speed -= self.acceleration
        else:
            # 自然减速
            if self.speed > 0:
                self.speed = max(0, self.speed - self.friction)
            elif self.speed < 0:
                self.speed = min(0, self.speed + self.friction)
        
        # 限制速度
        self.speed = max(-self.max_speed/2, min(self.max_speed, self.speed))
        
        # 转向控制
        self.steering = 0
        if keys[pygame.K_LEFT] or keys[pygame.K_a]:
            self.steering = -self.max_steering
        if keys[pygame.K_RIGHT] or keys[pygame.K_d]:
            self.steering = self.max_steering
            
        # 更新角度
        if abs(self.speed) > 0.5:  # 只有移动时才能转向
            self.angle += self.steering * (abs(self.speed) / self.max_speed)
        
        # 更新位置
        self.x += self.speed * math.sin(math.radians(self.angle))
        self.y -= self.speed * math.cos(math.radians(self.angle))
        
        # 边界检查
        self.x = max(50, min(WIDTH - 50 - self.width, self.x))
        self.y = max(50, min(HEIGHT - 50, self.y))
    
    def draw(self, surface):
        # 创建赛车表面
        car_surface = pygame.Surface((self.width, self.height), pygame.SRCALPHA)
        pygame.draw.rect(car_surface, self.color, (0, 0, self.width, self.height))
        
        # 绘制车窗
        pygame.draw.rect(car_surface, BLUE, (5, 5, self.width-10, self.height//3))
        
        # 绘制车灯
        pygame.draw.rect(car_surface, YELLOW, (5, 5, 8, 8))
        pygame.draw.rect(car_surface, YELLOW, (self.width-13, 5, 8, 8))
        
        # 旋转赛车
        rotated_car = pygame.transform.rotate(car_surface, -self.angle)
        rotated_rect = rotated_car.get_rect(center=(self.x + self.width//2, self.y + self.height//2))
        
        # 绘制赛车
        surface.blit(rotated_car, rotated_rect)
        
        # 绘制速度表
        speed_text = font_small.render(f"速度: {abs(self.speed):.1f}", True, WHITE)
        surface.blit(speed_text, (20, 20))

# 障碍物类
class Obstacle:
    def __init__(self):
        self.width = random.randint(30, 60)
        self.height = random.randint(30, 60)
        self.x = random.randint(100, WIDTH - 100 - self.width)
        self.y = -self.height
        self.speed = random.uniform(3, 7)
        self.color = (random.randint(100, 255), random.randint(100, 255), random.randint(100, 255))
        
    def update(self):
        self.y += self.speed
        return self.y < HEIGHT  # 如果还在屏幕内返回True
        
    def draw(self, surface):
        pygame.draw.rect(surface, self.color, (self.x, self.y, self.width, self.height))
        
    def get_rect(self):
        return pygame.Rect(self.x, self.y, self.width, self.height)

# 道路标记
class RoadMarker:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.width = 10
        self.height = 40
        
    def update(self, speed):
        self.y += speed
        if self.y > HEIGHT:
            self.y = -self.height
            return True
        return False
        
    def draw(self, surface):
        pygame.draw.rect(surface, YELLOW, (self.x, self.y, self.width, self.height))

# 初始化游戏对象
player = PlayerCar()
obstacles = []
road_markers = []
score = 0
game_over = False
speed_multiplier = 1.0

# 创建道路标记
for i in range(0, HEIGHT, 100):
    road_markers.append(RoadMarker(WIDTH//2 - 5, i))
    road_markers.append(RoadMarker(WIDTH//2 - 5 - 200, i))
    road_markers.append(RoadMarker(WIDTH//2 - 5 + 200, i))

# 加载字体
try:
    font = pygame.font.SysFont(None, 48)
    font_small = pygame.font.SysFont(None, 24)
except:
    font = pygame.font.Font(None, 48)
    font_small = pygame.font.Font(None, 24)

# 游戏主循环
last_obstacle_time = pygame.time.get_ticks()
obstacle_interval = 1500  # 生成障碍物的间隔（毫秒）

while True:
    # 事件处理
    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 and game_over:
                # 重新开始游戏
                player = PlayerCar()
                obstacles = []
                score = 0
                game_over = False
                speed_multiplier = 1.0
            if event.key == pygame.K_ESCAPE:
                pygame.quit()
                sys.exit()
    
    if not game_over:
        # 获取按键状态
        keys = pygame.key.get_pressed()
        
        # 更新玩家
        player.update(keys)
        
        # 生成障碍物
        current_time = pygame.time.get_ticks()
        if current_time - last_obstacle_time > obstacle_interval / speed_multiplier:
            obstacles.append(Obstacle())
            last_obstacle_time = current_time
            
            # 随着时间增加难度
            if score % 10 == 0 and score > 0:
                speed_multiplier += 0.1
        
        # 更新障碍物
        for obstacle in obstacles[:]:
            if not obstacle.update():
                obstacles.remove(obstacle)
                score += 1
            else:
                # 碰撞检测
                player_rect = pygame.Rect(player.x, player.y, player.width, player.height)
                if player_rect.colliderect(obstacle.get_rect()):
                    game_over = True
        
        # 更新道路标记
        for marker in road_markers:
            if marker.update(player.speed * 0.5):
                score += 0.1
    
    # 绘制背景
    screen.fill(GRASS_COLOR)
    
    # 绘制道路
    pygame.draw.rect(screen, ROAD_COLOR, (50, 0, WIDTH - 100, HEIGHT))
    pygame.draw.rect(screen, ROAD_COLOR, (50, 0, 150, HEIGHT))
    pygame.draw.rect(screen, ROAD_COLOR, (WIDTH - 200, 0, 150, HEIGHT))
    
    # 绘制道路标记
    for marker in road_markers:
        marker.draw(screen)
    
    # 绘制障碍物
    for obstacle in obstacles:
        obstacle.draw(screen)
    
    # 绘制玩家
    player.draw(screen)
    
    # 绘制分数
    score_text = font.render(f"分数: {int(score)}", True, WHITE)
    screen.blit(score_text, (WIDTH - 150, 20))
    
    # 绘制难度级别
    level_text = font_small.render(f"难度: {speed_multiplier:.1f}x", True, WHITE)
    screen.blit(level_text, (WIDTH - 150, 60))
    
    # 绘制控制说明
    controls = [
        "控制方式:",
        "↑/W: 加速",
        "↓/S: 减速/倒车",
        "←→/A/D: 转向",
        "ESC: 退出游戏"
    ]
    
    for i, text in enumerate(controls):
        control_text = font_small.render(text, True, WHITE)
        screen.blit(control_text, (20, 60 + i * 25))
    
    # 游戏结束画面
    if game_over:
        overlay = pygame.Surface((WIDTH, HEIGHT), pygame.SRCALPHA)
        overlay.fill((0, 0, 0, 180))
        screen.blit(overlay, (0, 0))
        
        game_over_text = font.render("游戏结束!", True, RED)
        final_score_text = font.render(f"最终分数: {int(score)}", True, WHITE)
        restart_text = font.render("按 R 键重新开始", True, GREEN)
        
        screen.blit(game_over_text, (WIDTH//2 - game_over_text.get_width()//2, HEIGHT//2 - 60))
        screen.blit(final_score_text, (WIDTH//2 - final_score_text.get_width()//2, HEIGHT//2))
        screen.blit(restart_text, (WIDTH//2 - restart_text.get_width()//2, HEIGHT//2 + 60))
        
        # 丙午马年祝福
        year_text = font_small.render("祝您丙午马年快乐，马到成功！", True, YELLOW)
        screen.blit(year_text, (WIDTH//2 - year_text.get_width()//2, HEIGHT - 50))
    
    # 更新显示
    pygame.display.flip()
    clock.tick(FPS)