import pygame

# --- 初始化 ---
pygame.init()
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("简易版马里奥")
clock = pygame.time.Clock()

# 颜色定义
SKY_BLUE = (107, 140, 255)
GROUND_BROWN = (139, 69, 19)
BRICK_ORANGE = (210, 105, 30)
MARIO_RED = (255, 0, 0)
GOOMBA_BROWN = (101, 67, 33)

# --- 类定义 ---

class Player(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = pygame.Surface((30, 40))
        self.image.fill(MARIO_RED)
        self.rect = self.image.get_rect()
        self.rect.topleft = (x, y)
        
        self.velocity_x = 0
        self.velocity_y = 0
        self.speed = 5
        self.jump_power = -12
        self.gravity = 0.6
        self.on_ground = False

    def update(self, platforms):
        # 水平移动
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            self.velocity_x = -self.speed
        elif keys[pygame.K_RIGHT]:
            self.velocity_x = self.speed
        else:
            self.velocity_x = 0

        self.rect.x += self.velocity_x
        
        # 水平碰撞检测
        for platform in platforms:
            if self.rect.colliderect(platform.rect):
                if self.velocity_x > 0: # 向右撞
                    self.rect.right = platform.rect.left
                elif self.velocity_x < 0: # 向左撞
                    self.rect.left = platform.rect.right

        # 垂直移动 (重力)
        self.velocity_y += self.gravity
        self.rect.y += self.velocity_y
        self.on_ground = False # 先假设在空中

        # 垂直碰撞检测
        for platform in platforms:
            if self.rect.colliderect(platform.rect):
                if self.velocity_y > 0: # 下落碰到地面
                    self.rect.bottom = platform.rect.top
                    self.velocity_y = 0
                    self.on_ground = True
                elif self.velocity_y < 0: # 顶到头
                    self.rect.top = platform.rect.bottom
                    self.velocity_y = 0

        # 边界检查
        if self.rect.left < 0: self.rect.left = 0
        if self.rect.right > WIDTH: self.rect.right = WIDTH
        if self.rect.bottom > HEIGHT: # 掉坑里了
            self.rect.topleft = (50, 300) # 重置位置

    def jump(self):
        if self.on_ground:
            self.velocity_y = self.jump_power

class Platform(pygame.sprite.Sprite):
    def __init__(self, x, y, w, h, color=BRICK_ORANGE):
        super().__init__()
        self.image = pygame.Surface((w, h))
        self.image.fill(color)
        self.rect = self.image.get_rect()
        self.rect.topleft = (x, y)

class Enemy(pygame.sprite.Sprite):
    def __init__(self, x, y, range_w):
        super().__init__()
        self.image = pygame.Surface((30, 30))
        self.image.fill(GOOMBA_BROWN)
        self.rect = self.image.get_rect()
        self.rect.topleft = (x, y)
        
        self.speed = 2
        self.start_x = x
        self.range_w = range_w
        self.direction = 1

    def update(self):
        self.rect.x += self.speed * self.direction
        # 巡逻范围限制
        if self.rect.x > self.start_x + self.range_w or self.rect.x < self.start_x:
            self.direction *= -1

# --- 主程序 ---

def main():
    # 创建玩家
    player = Player(50, 400)
    
    # 创建关卡 (地面和砖块)
    platforms = pygame.sprite.Group()
    # 地面
    platforms.add(Platform(0, 550, 800, 50, GROUND_BROWN))
    # 空中平台
    platforms.add(Platform(200, 450, 100, 20))
    platforms.add(Platform(400, 350, 100, 20))
    platforms.add(Platform(600, 250, 100, 20))
    # 墙壁
    platforms.add(Platform(750, 450, 50, 100))

    # 创建敌人
    enemies = pygame.sprite.Group()
    enemies.add(Enemy(300, 520, 200)) # 地面上的敌人
    enemies.add(Enemy(400, 320, 80))  # 平台上的敌人

    running = True
    while running:
        clock.tick(60)
        
        # 事件处理
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE:
                    player.jump()

        # 更新逻辑
        player.update(platforms)
        enemies.update()

        # 敌人与玩家的碰撞处理 (核心机制：踩头)
        hits = pygame.sprite.spritecollide(player, enemies, False)
        for enemy in hits:
            # 如果玩家正在下落，且位置高于敌人 -> 踩死敌人
            if player.velocity_y > 0 and player.rect.bottom < enemy.rect.centroid[1] + 10:
                enemy.kill()
                player.velocity_y = -8 # 踩踏后小跳一下
            else:
                # 否则玩家死亡 (这里简单重置位置)
                player.rect.topleft = (50, 300)

        # 绘图
        screen.fill(SKY_BLUE)
        
        platforms.draw(screen)
        enemies.draw(screen)
        screen.blit(player.image, player.rect)

        pygame.display.flip()

    pygame.quit()

if __name__ == "__main__":
    main()