import pygame from pygame.locals import * import sys import random # Initialize pygame pygame.init() # Vector for easy 2D calculations vec = pygame.math.Vector2 # Screen dimensions HEIGHT = 400 WIDTH = 450 # Physics constants ACC = 0.5 FRIC = -0.12 # Frames per second FPS = 60 FramePerSec = pygame.time.Clock() # Set up display displaysurface = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("Game") # Player class class Player(pygame.sprite.Sprite): def __init__(self): super().__init__() self.surf = pygame.Surface((30, 30)) self.surf.fill((128, 255, 40)) self.rect = self.surf.get_rect() self.pos = vec((10, 360)) self.vel = vec(0, 0) self.acc = vec(0, 0) self.jumping = False self.max_jump_height = -15 # Max jump height def move(self): self.acc = vec(0, 0.5) pressed_keys = pygame.key.get_pressed() if pressed_keys[K_LEFT]: self.acc.x = -ACC if pressed_keys[K_RIGHT]: self.acc.x = ACC self.acc.x += self.vel.x * FRIC self.vel += self.acc self.pos += self.vel + 0.5 * self.acc if self.pos.x > WIDTH: self.pos.x = 0 if self.pos.x < 0: self.pos.x = WIDTH self.rect.midbottom = self.pos def jump(self): if not self.jumping: hits = pygame.sprite.spritecollide(self, platforms, False) if hits: self.jumping = True self.vel.y = self.max_jump_height def cancel_jump(self): if self.jumping and self.vel.y < -3: self.vel.y = -3 def update(self): hits = pygame.sprite.spritecollide(self, platforms, False) if self.vel.y > 0 and hits: if self.pos.y < hits[0].rect.bottom: self.pos.y = hits[0].rect.top + 1 self.vel.y = 0 self.jumping = False # Platform class class Platform(pygame.sprite.Sprite): def __init__(self): super().__init__() self.surf = pygame.Surface((random.randint(50, 100), 12)) self.surf.fill((0, 255, 0)) self.rect = self.surf.get_rect(center=(random.randint(0, WIDTH - 10), random.randint(0, HEIGHT - 30))) def move(self): pass # Platforms don't move, but this can be modified for moving platforms # Collision check to prevent overlapping def check(platform, groupies): if pygame.sprite.spritecollideany(platform, groupies): return True for entity in groupies: if entity == platform: continue if (abs(platform.rect.top - entity.rect.bottom) < 50) and \ (abs(platform.rect.bottom - entity.rect.top) < 50): return True return False # Generate new platforms (spawn higher off screen) def plat_gen(): while len(platforms) < 6: width = random.randrange(50, 100) p = Platform() C = True while C: p = Platform() p.rect.center = (random.randrange(0, WIDTH - width), random.randrange(-120, -40)) # ← FIX: spawn above view C = check(p, platforms) platforms.add(p) all_sprites.add(p) # Modify base platform to act as ground PT1 = Platform() PT1.surf = pygame.Surface((WIDTH, 20)) PT1.surf.fill((255, 0, 0)) PT1.rect = PT1.surf.get_rect(center=(WIDTH / 2, HEIGHT - 10)) # Sprite groups all_sprites = pygame.sprite.Group() all_sprites.add(PT1) platforms = pygame.sprite.Group() platforms.add(PT1) # Initial platforms for _ in range(random.randint(4, 5)): pl = Platform() while check(pl, platforms): pl = Platform() platforms.add(pl) all_sprites.add(pl) # Main game loop P1 = Player() all_sprites.add(P1) while True: P1.update() for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() if event.type == KEYDOWN and event.key == K_SPACE: P1.jump() if event.type == KEYUP and event.key == K_SPACE: P1.cancel_jump() # Scroll world up if player goes too high if P1.rect.top <= HEIGHT / 3: P1.pos.y += abs(P1.vel.y) for plat in platforms: plat.rect.y += abs(P1.vel.y) if plat.rect.top >= HEIGHT: plat.kill() plat_gen() displaysurface.fill((0, 0, 0)) # Draw all sprites for entity in all_sprites: displaysurface.blit(entity.surf, entity.rect) entity.move() pygame.display.update() FramePerSec.tick(FPS)