import pygame
import random
import sys

# 初始化 Pygame
pygame.init()

# 游戏常量
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 400
FPS = 60
GRAVITY = 0.8
JUMP_STRENGTH = -15
OBSTACLE_SPEED = 5
OBSTACLE_SPAWN_TIME = 1500  # 毫秒

# 颜色定义
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
BLUE = (0, 0, 255)
GREEN = (0, 255, 0)

# 设置屏幕
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("Pygame 跑酷游戏")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 36)

# 玩家类
class Player:
    def __init__(self):
        self.width = 40
        self.height = 60
        self.x = 100
        self.y = SCREEN_HEIGHT - self.height
        self.velocity_y = 0
        self.is_jumping = False

    def jump(self):
        if not self.is_jumping:
            self.velocity_y = JUMP_STRENGTH
            self.is_jumping = True

    def update(self):
        self.velocity_y += GRAVITY
        self.y += self.velocity_y

        if self.y >= SCREEN_HEIGHT - self.height:
            self.y = SCREEN_HEIGHT - self.height
            self.velocity_y = 0
            self.is_jumping = False

    def draw(self):
        pygame.draw.rect(screen, BLUE, (self.x, self.y, self.width, self.height))

    def get_rect(self):
        return pygame.Rect(self.x, self.y, self.width, self.height)

# 障碍物类
class Obstacle:
    def __init__(self):
        self.width = 30
        self.height = random.randint(40, 70)
        self.x = SCREEN_WIDTH
        self.y = SCREEN_HEIGHT - self.height
        self.speed = OBSTACLE_SPEED

    def update(self):
        self.x -= self.speed

    def draw(self):
        pygame.draw.rect(screen, RED, (self.x, self.y, self.width, self.height))

    def get_rect(self):
        return pygame.Rect(self.x, self.y, self.width, self.height)

    def is_off_screen(self):
        return self.x + self.width < 0

# 游戏主函数
def main():
    player = Player()
    obstacles = []
    score = 0
    last_spawn_time = pygame.time.get_ticks()
    game_over = False

    running = True
    while running:
        clock.tick(FPS)
        screen.fill(WHITE)

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE and not game_over:
                    player.jump()
                if event.key == pygame.K_r and game_over:
                    main()  # 重新开始
                    return

        if not game_over:
            # 生成障碍物
            current_time = pygame.time.get_ticks()
            if current_time - last_spawn_time > OBSTACLE_SPAWN_TIME:
                obstacles.append(Obstacle())
                last_spawn_time = current_time

            # 更新玩家
            player.update()

            # 更新障碍物
            for obstacle in obstacles[:]:
                obstacle.update()
                if obstacle.is_off_screen():
                    obstacles.remove(obstacle)
                    score += 1

                if player.get_rect().colliderect(obstacle.get_rect()):
                    game_over = True

        # 绘制
        player.draw()
        for obstacle in obstacles:
            obstacle.draw()

        # 显示分数
        score_text = font.render(f"Score: {score}", True, BLACK)
        screen.blit(score_text, (10, 10))

        # 游戏结束提示
        if game_over:
            game_over_text = font.render("Game Over! Press R to Restart", True, BLACK)
            text_rect = game_over_text.get_rect(center=(SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2))
            screen.blit(game_over_text, text_rect)

        pygame.display.flip()

    pygame.quit()
    sys.exit()

if __name__ == "__main__":
    main()
