import pygame import random import sys pygame.init() WIDTH, HEIGHT = 800, 600 screen = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("Advanced Platformer") clock = pygame.time.Clock() GRAVITY = 0.6 WHITE, BLACK, RED, GREEN = (255,255,255), (0,0,0), (255,0,0), (0,255,0) # Player class class Player(pygame.sprite.Sprite): def __init__(self): super().__init__() self.image = pygame.Surface((40, 50)) self.image.fill((0, 120, 255)) self.rect = self.image.get_rect(center=(WIDTH//2, HEIGHT - 150)) self.vel = pygame.Vector2(0, 0) self.speed = 5 self.jump_strength = -12 self.on_ground = False self.jump_count = 0 self.health = 3 def update(self): keys = pygame.key.get_pressed() self.vel.x = 0 if keys[pygame.K_LEFT]: self.vel.x = -self.speed if keys[pygame.K_RIGHT]: self.vel.x = self.speed self.vel.y += GRAVITY self.rect.x += self.vel.x self.rect.y += self.vel.y if self.rect.left > WIDTH: self.rect.right = 0 elif self.rect.right < 0: self.rect.left = WIDTH self.on_ground = False def jump(self): if self.on_ground or self.jump_count < 2: self.vel.y = self.jump_strength self.jump_count += 1 def damage(self): self.health -= 1 if self.health <= 0: self.kill() # Platform types class Platform(pygame.sprite.Sprite): def __init__(self, x, y, type="static"): super().__init__() self.type = type self.image = pygame.Surface((100, 20)) if self.type == "static": self.image.fill(GREEN) elif self.type == "moving": self.image.fill((0, 200, 0)) self.direction = 1 elif self.type == "breakable": self.image.fill((180, 100, 0)) elif self.type == "disappear": self.image.fill((150, 150, 150)) self.rect = self.image.get_rect(topleft=(x, y)) self.timer = 0 def update(self): if self.type == "moving": self.rect.x += 2 * self.direction if self.rect.left < 0 or self.rect.right > WIDTH: self.direction *= -1 if self.type == "disappear" and self.timer > 0: self.timer += 1 if self.timer > 30: self.kill() # Enemy class class Enemy(pygame.sprite.Sprite): def __init__(self, x, y): super().__init__() self.image = pygame.Surface((40, 40)) self.image.fill(RED) self.rect = self.image.get_rect(topleft=(x, y)) self.direction = 1 def update(self): self.rect.x += 2 * self.direction if self.rect.left < 0 or self.rect.right > WIDTH: self.direction *= -1 # Power-up class PowerUp(pygame.sprite.Sprite): def __init__(self, x, y): super().__init__() self.image = pygame.Surface((20, 20)) self.image.fill((255, 255, 0)) self.rect = self.image.get_rect(center=(x, y)) # Setup player = Player() all_sprites = pygame.sprite.Group(player) platforms = pygame.sprite.Group() enemies = pygame.sprite.Group() powerups = pygame.sprite.Group() # Create base platform for i in range(10): x = random.randint(0, WIDTH - 100) y = HEIGHT - i * 70 type = random.choice(["static", "moving", "breakable", "disappear"]) plat = Platform(x, y, type) platforms.add(plat) all_sprites.add(plat) if random.random() < 0.3: enemy = Enemy(x + 30, y - 40) enemies.add(enemy) all_sprites.add(enemy) if random.random() < 0.2: p = PowerUp(x + 50, y - 20) powerups.add(p) all_sprites.add(p) camera_offset = 0 font = pygame.font.SysFont("Arial", 24) # Game loop running = True while running: dt = clock.tick(60) screen.fill(WHITE) for event in pygame.event.get(): if event.type == pygame.QUIT: running = False keys = pygame.key.get_pressed() if keys[pygame.K_SPACE]: player.jump() # Update all_sprites.update() # Collision with platforms hits = pygame.sprite.spritecollide(player, platforms, False) for hit in hits: if player.vel.y > 0 and player.rect.bottom <= hit.rect.bottom: player.rect.bottom = hit.rect.top player.vel.y = 0 player.on_ground = True player.jump_count = 0 if hit.type == "breakable": hit.kill() elif hit.type == "disappear": hit.timer = 1 # Enemies if pygame.sprite.spritecollide(player, enemies, False): player.damage() # Powerups if pygame.sprite.spritecollide(player, powerups, True): player.health = min(3, player.health + 1) # Camera if player.rect.top <= HEIGHT // 3: dy = HEIGHT // 3 - player.rect.top player.rect.y += dy for s in all_sprites: if s != player: s.rect.y += dy camera_offset += dy # Draw all_sprites.draw(screen) health_txt = font.render(f"Health: {player.health}", True, BLACK) screen.blit(health_txt, (10, 10)) score_txt = font.render(f"Score: {camera_offset // 10}", True, BLACK) screen.blit(score_txt, (10, 40)) # Game over if not player.alive(): game_over = font.render("Game Over!", True, RED) screen.blit(game_over, (WIDTH//2 - 70, HEIGHT//2)) pygame.display.flip() pygame.time.wait(3000) running = False pygame.display.flip() pygame.quit()