import pygame
import random
import sys

# 初始化pygame
pygame.init()

# 窗口设置
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 400
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("Python跑酷游戏")

# 颜色定义
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
GRAY = (80, 80, 80)
RED = (220, 30, 30)
GREEN = (30, 180, 30)
SKY_BLUE = (135, 206, 235)

# 字体
try:
    font = pygame.font.SysFont("simhei", 30)
    game_over_font = pygame.font.SysFont("simhei", 60)
except:
    font = pygame.font.Font(None, 30)
    game_over_font = pygame.font.Font(None, 60)

clock = pygame.time.Clock()
FPS = 60

# 玩家类
class Player:
    def __init__(self):
        self.width = 40
        self.height = 60
        self.x = 100
        self.y = SCREEN_HEIGHT - self.height - 50
        self.vel_y = 0
        self.gravity = 0.8
        self.jump_power = -18
        self.on_ground = True

    def jump(self):
        if self.on_ground:
            self.vel_y = self.jump_power
            self.on_ground = False

    def update(self):
        self.vel_y += self.gravity
        self.y += self.vel_y
        ground_y = SCREEN_HEIGHT - self.height - 50
        if self.y >= ground_y:
            self.y = ground_y
            self.vel_y = 0
            self.on_ground = True

    def draw(self):
        pygame.draw.rect(screen, GREEN, (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 - 50
        self.speed = 7

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

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

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

    def collide(self,player):
        p_rect = pygame.Rect(player.x, player.y, player.width, player.height)
        o_rect = pygame.Rect(self.x, self.y, self.width, self.height)
        return p_rect.colliderect(o_rect)

def main():
    player = Player()
    obstacles = []
    spawn_timer = 0
    score = 0
    game_over = False

    running = True
    while running:
        screen.fill(SKY_BLUE)
        # 绘制地面
        pygame.draw.rect(screen, GRAY, (0, SCREEN_HEIGHT-50, SCREEN_WIDTH, 50))

        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:
                    # 重置游戏
                    player = Player()
                    obstacles.clear()
                    spawn_timer = 0
                    score = 0
                    game_over = False

        if not game_over:
            player.update()
            # 生成障碍物
            spawn_timer +=1
            if spawn_timer >= random.randint(80,130):
                obstacles.append(Obstacle())
                spawn_timer = 0

            # 更新障碍物
            for obs in obstacles[:]:
                obs.update()
                if obs.off_screen():
                    obstacles.remove(obs)
                    score +=1
                if obs.collide(player):
                    game_over = True

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

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

        if game_over:
            over_text = game_over_font.render("游戏结束", True, RED)
            tip_text = font.render("按 R 重新开始", True, BLACK)
            screen.blit(over_text,(SCREEN_WIDTH//2-160, SCREEN_HEIGHT//2-50))
            screen.blit(tip_text,(SCREEN_WIDTH//2-120, SCREEN_HEIGHT//2+20))

        pygame.display.flip()
        clock.tick(FPS)

    pygame.quit()
    sys.exit()

if __name__ == "__main__":
    main()
