import pygame
import random
import sys

# 初始化 pygame
pygame.init()

# 屏幕设置
WIDTH, HEIGHT = 400, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("是男人就上一百层")

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

# 玩家类
class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((30, 30))
        self.image.fill(BLUE)
        self.rect = self.image.get_rect()
        self.rect.centerx = WIDTH // 2
        self.rect.bottom = HEIGHT - 50
        self.vel_y = 0
        self.gravity = 0.8
        self.jump_power = -15
        self.is_jumping = False

    def update(self):
        # 重力效果
        self.vel_y += self.gravity
        self.rect.y += self.vel_y

        # 限制玩家不能掉出屏幕底部（掉出则游戏结束）
        if self.rect.top > HEIGHT:
            return "GAME_OVER"

        # 限制玩家不能飞出屏幕顶部
        if self.rect.top < 0:
            self.rect.top = 0
            self.vel_y = 0

        # 简单的左右边界限制
        if self.rect.left < 0:
            self.rect.left = 0
        if self.rect.right > WIDTH:
            self.rect.right = WIDTH

    def jump(self):
        if not self.is_jumping:
            self.vel_y = self.jump_power
            self.is_jumping = True

    def reset(self):
        self.rect.centerx = WIDTH // 2
        self.rect.bottom = HEIGHT - 50
        self.vel_y = 0
        self.is_jumping = False

# 平台类
class Platform(pygame.sprite.Sprite):
    def __init__(self, x, y, width, height, color=GREEN):
        super().__init__()
        self.image = pygame.Surface((width, height))
        self.image.fill(color)
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y

# 主游戏类
class Game:
    def __init__(self):
        self.clock = pygame.time.Clock()
        self.font = pygame.font.Font(None, 36)
        self.running = True
        self.score = 0
        self.player = Player()
        self.platforms = pygame.sprite.Group()
        self.all_sprites = pygame.sprite.Group()
        self.all_sprites.add(self.player)
        self.generate_initial_platforms()

    def generate_initial_platforms(self):
        # 生成初始平台
        base_platform = Platform(WIDTH // 2 - 50, HEIGHT - 50, 100, 10)
        self.platforms.add(base_platform)
        self.all_sprites.add(base_platform)
        
        # 向上生成一系列平台
        for _ in range(10):
            self.add_new_platform()

    def add_new_platform(self):
        width = random.randint(60, 120)
        x = random.randint(0, WIDTH - width)
        # 找到当前最高的平台，在它上方生成新平台
        highest_y = min(p.rect.y for p in self.platforms)
        y = highest_y - random.randint(60, 100)
        
        # 随机生成普通平台或障碍平台
        color = GREEN
        if random.random() < 0.2:  # 20% 概率生成红色障碍平台
            color = RED
            
        platform = Platform(x, y, width, 10, color)
        self.platforms.add(platform)
        self.all_sprites.add(platform)

    def handle_collisions(self):
        # 只有在玩家下落时才检测碰撞
        if self.player.vel_y > 0:
            hits = pygame.sprite.spritecollide(self.player, self.platforms, False)
            if hits:
                # 确保是落在平台上方
                if self.player.rect.bottom <= hits[0].rect.top + 10:
                    self.player.rect.bottom = hits[0].rect.top
                    self.player.vel_y = 0
                    self.player.is_jumping = False
                    
                    # 如果踩到红色平台，游戏结束
                    if hits[0].image.get_at((0,0)) == RED:
                        return "GAME_OVER"
        return "PLAYING"

    def update(self):
        # 处理键盘输入
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            self.player.rect.x -= 5
        if keys[pygame.K_RIGHT]:
            self.player.rect.x += 5
        if keys[pygame.K_SPACE]:
            self.player.jump()

        # 更新玩家状态
        result = self.player.update()
        if result == "GAME_OVER":
            return "GAME_OVER"

        # 碰撞检测
        collision_result = self.handle_collisions()
        if collision_result == "GAME_OVER":
            return "GAME_OVER"

        # 更新分数（根据玩家到达的最高点）
        current_max_score = max(-p.rect.y for p in self.platforms) // 10
        if current_max_score > self.score:
            self.score = current_max_score

        # 摄像机跟随：如果玩家跳得太高，将所有元素下移
        if self.player.rect.top < HEIGHT // 3:
            shift = HEIGHT // 3 - self.player.rect.top
            self.player.rect.y += shift
            for sprite in self.all_sprites:
                if sprite != self.player:
                    sprite.rect.y += shift

        # 移除掉出屏幕底部的平台，并补充新平台
        for platform in self.platforms:
            if platform.rect.top > HEIGHT:
                self.platforms.remove(platform)
                self.all_sprites.remove(platform)
                self.add_new_platform()

        return "PLAYING"

    def draw(self):
        screen.fill(BLACK)
        self.all_sprites.draw(screen)
        
        # 绘制分数
        score_text = self.font.render(f"Score: {self.score}", True, WHITE)
        screen.blit(score_text, (10, 10))
        
        pygame.display.flip()

    def run(self):
        while self.running:
            self.clock.tick(60)
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    self.running = False

            result = self.update()
            self.draw()

            if result == "GAME_OVER":
                # 简单的游戏结束提示
                game_over_text = self.font.render("GAME OVER! Press R to Restart", True, RED)
                screen.blit(game_over_text, (WIDTH // 2 - 150, HEIGHT // 2))
                pygame.display.flip()
                
                # 等待重新开始
                waiting = True
                while waiting:
                    for event in pygame.event.get():
                        if event.type == pygame.QUIT:
                            self.running = False
                            waiting = False
                        if event.type == pygame.KEYDOWN and event.key == pygame.K_r:
                            self.__init__()  # 重置游戏
                            waiting = False

        pygame.quit()
        sys.exit()

if __name__ == "__main__":
    game = Game()
    game.run()