import pygame import random import math # Setup pygame.init() WIDTH, HEIGHT = 640, 480 screen = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("Hopple - Run from the Snake!") clock = pygame.time.Clock() font = pygame.font.SysFont("Arial", 28) # Colors WHITE = (255, 255, 255) # Player (Skier) player = pygame.Rect(160, 340, 20, 20) gravity = 0.8 velocity_y = 0 on_ground = False max_jump_height = (12 ** 2) / (2 * gravity) # Load skier images skier_ski1 = pygame.image.load("skier1.png").convert_alpha() skier_ski2 = pygame.image.load("skier2.png").convert_alpha() skier_ski3 = pygame.image.load("skier3.png").convert_alpha() skier_jump = pygame.image.load("skier_jump.png").convert_alpha() skier_ski1 = pygame.transform.scale(skier_ski1, (player.width, player.height)) skier_ski2 = pygame.transform.scale(skier_ski2, (player.width, player.height)) skier_ski3 = pygame.transform.scale(skier_ski3, (player.width, player.height)) skier_jump = pygame.transform.scale(skier_jump, (player.width, player.height)) ski_frames = [skier_ski1, skier_ski2, skier_ski3] ski_frame_index = 0 ski_frame_timer = 0 ski_frame_delay = 8 current_skier_image = ski_frames[0] # Load other images leaf_image = pygame.image.load("leaf.png").convert_alpha() leaf_image = pygame.transform.scale(leaf_image, (40, 40)) tree_image_raw = pygame.image.load("tree.png").convert_alpha() # Leaf state leaves = [] cash = 0 # World floor_tiles = [pygame.Rect(0, HEIGHT - 140, 700, 140)] speed = 5 max_speed = 9999999999999 tiles_passed = 0 scrolling = True # Trees trees = [] # Timer start_time = pygame.time.get_ticks() # Day/Night Cycle cycle_time = 0 cycle_duration = 3000 cycle_speed = 1 / cycle_duration def get_day_night_colors(cycle): t = (math.sin(cycle * math.pi * 2 - math.pi / 2) + 1) / 2 sky_day = (137, 207, 240) sky_night = (10, 10, 40) ground_day = (0, 128, 0) ground_night = (20, 60, 20) def blend(c1, c2): return tuple(int(c1[i] * t + c2[i] * (1 - t)) for i in range(3)) return blend(sky_day, sky_night), blend(ground_day, ground_night) def draw_world(): global cycle_time cycle_time += cycle_speed sky_color, ground_color = get_day_night_colors(cycle_time) screen.fill(sky_color) for tree in trees: scaled_width = int(tree["scale"] * 60) scaled_height = int(tree["scale"] * 100) tree_img = pygame.transform.scale(tree_image_raw, (scaled_width, scaled_height)) tree_img.set_alpha(tree["alpha"]) draw_y = tree["y"] - scaled_height screen.blit(tree_img, (tree["x"], draw_y)) for tile in floor_tiles: pygame.draw.rect(screen, ground_color, tile) for leaf in leaves: screen.blit(leaf_image, (leaf.x, leaf.y)) screen.blit(current_skier_image, (player.x, player.y)) hud_y = HEIGHT - 40 screen.blit(font.render(f"Speed: {speed}", True, WHITE), (10, hud_y)) elapsed_time = (pygame.time.get_ticks() - start_time) // 1000 screen.blit(font.render(f"Time: {elapsed_time}s", True, WHITE), (220, hud_y)) screen.blit(leaf_image, (570, hud_y - 6)) screen.blit(font.render(f"${cash}", True, WHITE), (615, hud_y)) def get_current_platform_height(x): for tile in floor_tiles: if tile.x <= x <= tile.x + tile.width: return HEIGHT - tile.height return HEIGHT + 100 def add_platforms(): if len(floor_tiles) < 3: last = floor_tiles[-1] last_top = HEIGHT - last.height max_diff = max_jump_height - 10 min_diff = 10 min_top = max(0, last_top - max_diff) max_top = min(HEIGHT - 80, last_top + max_diff) while True: new_top = random.randint(int(min_top), int(max_top)) if abs(new_top - last_top) >= min_diff: break if last_top < HEIGHT - 200: new_top = random.randint(int(last_top), HEIGHT - 80) new_height = HEIGHT - new_top new_tile = pygame.Rect(last.x + last.width, new_top, 700, new_height) floor_tiles.append(new_tile) if random.random() < 0.7: leaf_x = new_tile.x + random.randint(50, 600) leaf_y = new_tile.y - 40 leaf_rect = pygame.Rect(leaf_x, leaf_y, 40, 40) leaves.append(leaf_rect) for _ in range(random.randint(1, 4)): tree_x = new_tile.x + random.randint(0, new_tile.width) tree_y = new_tile.y scale = random.uniform(0.5, 1.2) alpha = int(255 * (0.3 + (scale - 0.5) / 0.7)) alpha = min(255, max(80, alpha)) trees.append({"x": tree_x, "y": tree_y, "scale": scale, "alpha": alpha}) def clean_platforms(): global tiles_passed, speed for tile in floor_tiles[:]: if tile.x + tile.width < 0: floor_tiles.remove(tile) tiles_passed += 1 if tiles_passed % 3 == 0 and speed < max_speed: speed += 1 for leaf in leaves[:]: if leaf.right < 0: leaves.remove(leaf) for tree in trees[:]: if tree["x"] < -100: trees.remove(tree) def move_world(): for tile in floor_tiles: tile.x -= speed for leaf in leaves: leaf.x -= speed for tree in trees: tree["x"] -= speed def check_side_collision(): for tile in floor_tiles: if player.colliderect(tile): if player.right > tile.left and player.left < tile.left and player.bottom > tile.top: return True return False # Main Game Loop running = True while running: clock.tick(60) keys = pygame.key.get_pressed() for event in pygame.event.get(): if event.type == pygame.QUIT: running = False if keys[pygame.K_SPACE] and on_ground: velocity_y = -12 on_ground = False if scrolling: move_world() clean_platforms() add_platforms() velocity_y += gravity player.y += velocity_y for leaf in leaves[:]: if player.colliderect(leaf): leaves.remove(leaf) cash += 1 if check_side_collision() or player.top > HEIGHT: scrolling = False else: platform_y = get_current_platform_height(player.centerx) if player.bottom >= platform_y: safe_to_land = True for tile in floor_tiles: if player.colliderect(tile): if player.right > tile.left and player.left < tile.left: safe_to_land = False if safe_to_land: player.bottom = platform_y velocity_y = 0 on_ground = True else: on_ground = False else: on_ground = False if on_ground: ski_frame_timer += 1 if ski_frame_timer >= ski_frame_delay: ski_frame_index = (ski_frame_index + 1) % len(ski_frames) ski_frame_timer = 0 current_skier_image = ski_frames[ski_frame_index] else: current_skier_image = skier_jump draw_world() pygame.display.flip() pygame.quit()