import pygame
import random
import sys
import os

# 初始化pygame
pygame.init()

# 窗口设置
WIDTH, HEIGHT = 480, 700
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("滑雪模拟器")

# 颜色定义
WHITE = (255, 255, 255)
GREEN = (34, 139, 34)
RED = (220, 30, 30)
BLACK = (0, 0, 0)
BLUE = (50, 120, 255)

# ==========【修复字体加载】兼容Windows，不会崩溃 ==========
try:
    # Windows自带微软雅黑，支持中文
    font = pygame.font.SysFont("Microsoft YaHei", 32)
    small_font = pygame.font.SysFont("Microsoft YaHei", 24)
except:
    try:
        font = pygame.font.SysFont("SimHei", 32)
        small_font = pygame.font.SysFont("SimHei", 24)
    except:
        # 兜底默认字体（中文会变成方框，但程序不会崩溃）
        font = pygame.font.Font(None, 32)
        small_font = pygame.font.Font(None, 24)

# 滑雪玩家属性
player_width = 40
player_height = 60
player_x = WIDTH // 2 - player_width // 2
player_y = HEIGHT - 120
player_speed = 7

# 障碍物（树木）
tree_list = []
tree_width = 36
tree_height = 55
base_tree_speed = 4

clock = pygame.time.Clock()
FPS = 60
score = 0
game_over = False


def create_tree():
    """生成树木障碍物"""
    x = random.randint(20, WIDTH - tree_width - 20)
    y = random.randint(-120, -40)
    tree_list.append([x, y])


def draw_scene():
    """绘制画面"""
    screen.fill(WHITE)
    # 绘制雪道侧边
    pygame.draw.rect(screen, GREEN, [0, 0, 18, HEIGHT])
    pygame.draw.rect(screen, GREEN, [WIDTH - 18, 0, 18, HEIGHT])

    # 绘制树木
    for tree in tree_list:
        tx, ty = tree
        pygame.draw.rect(screen, GREEN, [tx, ty, tree_width, tree_height])
        pygame.draw.circle(screen, GREEN, (tx + tree_width//2, ty), 22)

    # 绘制滑雪小人
    pygame.draw.rect(screen, BLUE, [player_x, player_y, player_width, player_height])
    pygame.draw.circle(screen, RED, (player_x + player_width//2, player_y - 8), 14)

    # 绘制分数
    score_text = font.render(f"分数: {score}", True, BLACK)
    screen.blit(score_text, (25, 12))


# 初始生成树木
for _ in range(6):
    create_tree()

running = True
while running:
    clock.tick(FPS)
    tree_speed = base_tree_speed + score / 35  # 随分数提速

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        # 重新开始游戏
        if event.type == pygame.KEYDOWN:
            if game_over and event.key == pygame.K_r:
                game_over = False
                score = 0
                tree_list.clear()
                player_x = WIDTH // 2 - player_width // 2
                for _ in range(6):
                    create_tree()

    if not game_over:
        # 按键控制左右移动
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT] and player_x > 20:
            player_x -= player_speed
        if keys[pygame.K_RIGHT] and player_x < WIDTH - player_width - 20:
            player_x += player_speed

        # 更新树木位置
        for tree in tree_list:
            tree[1] += tree_speed

        # 清除出屏幕的树木、加分并生成新树
        for i in range(len(tree_list)-1, -1, -1):
            if tree_list[i][1] > HEIGHT:
                tree_list.pop(i)
                score += 1
                create_tree()

        # 碰撞检测
        player_rect = pygame.Rect(player_x, player_y, player_width, player_height)
        for tree in tree_list:
            tree_rect = pygame.Rect(tree[0], tree[1], tree_width, tree_height)
            if player_rect.colliderect(tree_rect):
                game_over = True

    # 渲染画面
    draw_scene()

    # 游戏结束界面
    if game_over:
        over_text = font.render("游戏结束!", True, RED)
        restart_text = small_font.render("按 R 重新开始", True, BLACK)
        screen.blit(over_text, (WIDTH//2 - 80, HEIGHT//2 - 60))
        screen.blit(restart_text, (WIDTH//2 - 90, HEIGHT//2))

    pygame.display.update()

pygame.quit()
sys.exit()