import pygame
import random
import sys

# 初始化pygame
pygame.init()

# 窗口设置
WIDTH, HEIGHT = 800, 400
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Pygame Runner Game")
clock = pygame.time.Clock()
FPS = 60

# 颜色定义
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (220, 50, 50)
GREEN = (40, 180, 60)
BLUE = (30, 120, 220)
BROWN = (120, 80, 40)
SKY_BLUE = (135, 206, 235)

# 字体（使用内置默认字体，无中文依赖）
font = pygame.font.Font(pygame.font.get_default_font(), 48)
small_font = pygame.font.Font(pygame.font.get_default_font(), 36)

# 玩家类
class Player:
    def __init__(self):
        self.w = 40
        self.h = 60
        self.x = 100
        self.y = HEIGHT - 100 - self.h
        self.vel_y = 0
        self.speed_x = 5
        self.gravity = 0.8
        self.jump_power = -18
        self.on_ground = True

    def update(self):
        self.vel_y += self.gravity
        self.y += self.vel_y
        ground_y = HEIGHT - 100 - self.h
        if self.y >= ground_y:
            self.y = ground_y
            self.vel_y = 0
            self.on_ground = True

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

    def draw(self):
        pygame.draw.rect(screen, BLUE, (self.x, self.y, self.w, self.h))

# 障碍物类
class Obstacle:
    def __init__(self):
        self.w = 30
        self.h = random.randint(40, 70)
        self.x = WIDTH
        self.y = HEIGHT - 100 - self.h
        self.speed = 5

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

    def draw(self):
        pygame.draw.rect(screen, RED, (self.x, self.y, self.w, self.h))

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

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

# 绘制文字
def draw_text(text, color, x, y, font_type=font):
    surf = font_type.render(text, True, color)
    screen.blit(surf, (x, y))

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

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

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            if event.type == pygame.KEYDOWN:
                if not game_over:
                    if event.key == pygame.K_SPACE or event.key == pygame.K_UP:
                        player.jump()
                else:
                    if event.key == pygame.K_r:
                        player = Player()
                        obstacles.clear()
                        score = 0
                        spawn_timer = 0
                        game_over = False

        if not game_over:
            keys = pygame.key.get_pressed()
            if keys[pygame.K_LEFT] and player.x > 0:
                player.x -= player.speed_x
            if keys[pygame.K_RIGHT] and player.x < WIDTH - player.w:
                player.x += player.speed_x

            player.update()

            # ========= 修改这里：增大障碍物生成间隔 =========
            spawn_timer += 1
            if spawn_timer > 130:   # 原来90，提高阈值
                obstacles.append(Obstacle())
                spawn_timer = random.randint(60, 180)  # 最低间隔拉高

            for obs in obstacles[:]:
                obs.update()
                if obs.off_screen():
                    obstacles.remove(obs)
                    score += 1
                if obs.collide(player):
                    game_over = True

            pygame.draw.rect(screen, BROWN, (0, HEIGHT - 100, WIDTH, 100))
            player.draw()
            for obs in obstacles:
                obs.draw()

            draw_text(f"Score: {score}", BLACK, 20, 20)
        else:
            draw_text("GAME OVER!", RED, WIDTH//2 - 130, HEIGHT//2 - 60)
            draw_text(f"Final Score: {score}", BLACK, WIDTH//2 - 110, HEIGHT//2)
            draw_text("Press R to Restart", BLACK, WIDTH//2 - 130, HEIGHT//2 + 50, small_font)

        pygame.display.flip()

    pygame.quit()
    sys.exit()

if __name__ == "__main__":
    main()