import pygame
import random
import sys

# 初始化 Pygame
pygame.init()

# 游戏常量
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 400
FPS = 60

# 颜色定义
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 50, 50)
BLUE = (50, 150, 255)

# 屏幕设置
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("极速跑酷 - 按空格跳跃")
clock = pygame.time.Clock()


class Player:
    def __init__(self):
        self.width = 40
        self.height = 40
        self.x = 50
        self.y = SCREEN_HEIGHT - self.height - 10
        self.color = BLUE
        self.vel_y = 0
        self.jump_power = -15
        self.gravity = 0.8
        self.is_jumping = False

    def jump(self):
        if not self.is_jumping:
            self.vel_y = self.jump_power
            self.is_jumping = True

    def update(self):
        # 重力逻辑
        self.vel_y += self.gravity
        self.y += self.vel_y

        # 地面检测
        ground_y = SCREEN_HEIGHT - self.height - 10
        if self.y >= ground_y:
            self.y = ground_y
            self.is_jumping = False

    def draw(self):
        pygame.draw.rect(screen, self.color,
                         (self.x, self.y, self.width, self.height))


class Obstacle:
    def __init__(self, speed):
        self.width = 30
        self.height = random.randint(40, 70)
        self.x = SCREEN_WIDTH
        self.y = SCREEN_HEIGHT - self.height - 10
        self.color = RED
        self.speed = speed

    def update(self):
        self.x -= self.speed

    def draw(self):
        pygame.draw.rect(screen, self.color,
                         (self.x, self.y, self.width, self.height))


def main():
    player = Player()
    obstacles = []
    score = 0
    game_speed = 7
    spawn_timer = 0

    font = pygame.font.SysFont("SimHei", 30)  # 使用黑体显示中文

    running = True
    while running:
        screen.fill(WHITE)

        # 1. 事件处理
        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_SPACE:
                    player.jump()

        # 2. 玩家更新
        player.update()
        player.draw()

        # 3. 障碍物逻辑
        spawn_timer += 1
        # 随机间隔生成障碍物
        if spawn_timer > random.randint(50, 100):
            obstacles.append(Obstacle(game_speed))
            spawn_timer = 0

        for obs in obstacles[:]:
            obs.update()
            obs.draw()

            # 碰撞检测
            player_rect = pygame.Rect(
                player.x, player.y, player.width, player.height)
            obs_rect = pygame.Rect(obs.x, obs.y, obs.width, obs.height)

            if player_rect.colliderect(obs_rect):
                running = False  # 游戏结束

            # 移除屏幕外的障碍物
            if obs.x < -obs.width:
                obstacles.remove(obs)
                score += 1
                # 每得5分增加一点速度
                if score % 5 == 0:
                    game_speed += 0.5

        # 4. 绘制地面
        pygame.draw.line(screen, BLACK, (0, SCREEN_HEIGHT-10),
                         (SCREEN_WIDTH, SCREEN_HEIGHT-10), 2)

        # 5. 显示分数
        score_text = font.render(f"得分: {score}", True, BLACK)
        screen.blit(score_text, (10, 10))

        pygame.display.flip()
        clock.tick(FPS)

    # 游戏结束界面
    show_game_over(score)


def show_game_over(score):
    screen.fill(BLACK)
    font = pygame.font.SysFont("SimHei", 50)
    msg = font.render("游戏结束!", True, WHITE)
    score_msg = font.render(f"最终得分: {score}", True, WHITE)
    tip = font.render("按 R 重新开始", True, WHITE)

    screen.blit(msg, (SCREEN_WIDTH//2 - 100, 100))
    screen.blit(score_msg, (SCREEN_WIDTH//2 - 120, 180))
    screen.blit(tip, (SCREEN_WIDTH//2 - 140, 260))

    pygame.display.flip()

    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:
                    main()  # 重新开始


if __name__ == "__main__":
    main()
