import pygame
import random
import sys

# 初始化 Pygame
pygame.init()

# 游戏窗口设置
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("驾驶小游戏 - 丙午马年快乐！")

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

# 玩家车辆类
class PlayerCar:
    def __init__(self):
        self.width = 60
        self.height = 100
        self.x = WIDTH // 2 - self.width // 2
        self.y = HEIGHT - 150
        self.speed = 8
        self.color = BLUE
        self.score = 0
        self.lives = 3
        
    def draw(self, surface):
        # 绘制车辆主体
        pygame.draw.rect(surface, self.color, (self.x, self.y, self.width, self.height))
        
        # 绘制车窗
        pygame.draw.rect(surface, (200, 230, 255), (self.x + 5, self.y + 5, self.width - 10, 30))
        
        # 绘制车轮
        pygame.draw.rect(surface, BLACK, (self.x - 5, self.y + 20, 5, 20))
        pygame.draw.rect(surface, BLACK, (self.x + self.width, self.y + 20, 5, 20))
        pygame.draw.rect(surface, BLACK, (self.x - 5, self.y + 60, 5, 20))
        pygame.draw.rect(surface, BLACK, (self.x + self.width, self.y + 60, 5, 20))
        
    def move(self, direction):
        if direction == "left" and self.x > 150:
            self.x -= self.speed
        if direction == "right" and self.x < WIDTH - 150 - self.width:
            self.x += self.speed
        if direction == "up" and self.y > 0:
            self.y -= self.speed
        if direction == "down" and self.y < HEIGHT - self.height:
            self.y += self.speed
            
    def get_rect(self):
        return pygame.Rect(self.x, self.y, self.width, self.height)

# 障碍物类
class Obstacle:
    def __init__(self):
        self.width = random.randint(50, 100)
        self.height = random.randint(60, 100)
        self.x = random.randint(150, WIDTH - 150 - self.width)
        self.y = -self.height
        self.speed = random.randint(3, 7)
        self.color = (random.randint(100, 255), random.randint(50, 200), random.randint(50, 200))
        
    def update(self):
        self.y += self.speed
        return self.y > HEIGHT
        
    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 DrivingGame:
    def __init__(self):
        self.player = PlayerCar()
        self.obstacles = []
        self.game_over = False
        self.paused = False
        self.clock = pygame.time.Clock()
        self.font = pygame.font.SysFont(None, 36)
        self.small_font = pygame.font.SysFont(None, 24)
        self.obstacle_timer = 0
        self.road_marker_offset = 0
        
    def handle_events(self):
        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_ESCAPE:
                    pygame.quit()
                    sys.exit()
                if event.key == pygame.K_p:
                    self.paused = not self.paused
                if event.key == pygame.K_r and self.game_over:
                    self.__init__()  # 重置游戏
                    
    def update(self):
        if self.game_over or self.paused:
            return
            
        # 玩家控制
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT] or keys[pygame.K_a]:
            self.player.move("left")
        if keys[pygame.K_RIGHT] or keys[pygame.K_d]:
            self.player.move("right")
        if keys[pygame.K_UP] or keys[pygame.K_w]:
            self.player.move("up")
        if keys[pygame.K_DOWN] or keys[pygame.K_s]:
            self.player.move("down")
            
        # 生成障碍物
        self.obstacle_timer += 1
        if self.obstacle_timer > 30:  # 每30帧生成一个障碍物
            self.obstacles.append(Obstacle())
            self.obstacle_timer = 0
            
        # 更新障碍物
        for obstacle in self.obstacles[:]:
            if obstacle.update():
                self.obstacles.remove(obstacle)
                self.player.score += 1
                
        # 检查碰撞
        player_rect = self.player.get_rect()
        for obstacle in self.obstacles:
            if player_rect.colliderect(obstacle.get_rect()):
                self.player.lives -= 1
                self.obstacles.remove(obstacle)
                if self.player.lives <= 0:
                    self.game_over = True
                    
        # 道路标记动画
        self.road_marker_offset += 5
        if self.road_marker_offset > 40:
            self.road_marker_offset = 0
            
    def draw(self):
        # 绘制背景
        screen.fill(GRASS_COLOR)
        
        # 绘制道路
        pygame.draw.rect(screen, ROAD_COLOR, (150, 0, WIDTH - 300, HEIGHT))
        
        # 绘制道路边缘线
        pygame.draw.rect(screen, WHITE, (145, 0, 5, HEIGHT))
        pygame.draw.rect(screen, WHITE, (WIDTH - 150, 0, 5, HEIGHT))
        
        # 绘制道路中线
        for i in range(0, HEIGHT, 40):
            pygame.draw.rect(screen, YELLOW, (WIDTH//2 - 2, i + self.road_marker_offset, 4, 20))
        
        # 绘制障碍物
        for obstacle in self.obstacles:
            obstacle.draw(screen)
            
        # 绘制玩家车辆
        self.player.draw(screen)
        
        # 绘制UI
        score_text = self.font.render(f"得分: {self.player.score}", True, WHITE)
        lives_text = self.font.render(f"生命: {self.player.lives}", True, WHITE)
        screen.blit(score_text, (20, 20))
        screen.blit(lives_text, (20, 60))
        
        # 绘制控制提示
        controls_text = self.small_font.render("控制: 方向键/WASD | 暂停: P | 退出: ESC", True, WHITE)
        screen.blit(controls_text, (WIDTH - 350, 20))
        
        # 游戏标题
        title_font = pygame.font.SysFont(None, 48)
        title_text = title_font.render("驾驶小游戏", True, YELLOW)
        screen.blit(title_text, (WIDTH//2 - title_text.get_width()//2, 20))
        
        # 绘制年份主题
        year_text = self.small_font.render("丙午马年 - 2026", True, WHITE)
        screen.blit(year_text, (WIDTH//2 - year_text.get_width()//2, HEIGHT - 30))
        
        # 暂停状态
        if self.paused:
            pause_surface = pygame.Surface((WIDTH, HEIGHT), pygame.SRCALPHA)
            pause_surface.fill((0, 0, 0, 150))
            screen.blit(pause_surface, (0, 0))
            pause_text = self.font.render("游戏暂停 - 按P继续", True, YELLOW)
            screen.blit(pause_text, (WIDTH//2 - pause_text.get_width()//2, HEIGHT//2))
            
        # 游戏结束
        if self.game_over:
            game_over_surface = pygame.Surface((WIDTH, HEIGHT), pygame.SRCALPHA)
            game_over_surface.fill((0, 0, 0, 200))
            screen.blit(game_over_surface, (0, 0))
            
            game_over_text = self.font.render("游戏结束!", True, RED)
            final_score_text = self.font.render(f"最终得分: {self.player.score}", True, WHITE)
            restart_text = self.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))
            
    def run(self):
        while True:
            self.handle_events()
            self.update()
            self.draw()
            pygame.display.flip()
            self.clock.tick(60)

# 启动游戏
if __name__ == "__main__":
    print("驾驶小游戏启动中...")
    print("游戏控制:")
    print("  - 方向键 或 WASD: 控制车辆移动")
    print("  - P: 暂停/继续游戏")
    print("  - R: 游戏结束后重新开始")
    print("  - ESC: 退出游戏")
    print("\n游戏目标: 避开障碍物，尽可能获得高分！")
    
    game = DrivingGame()
    game.run()