Simulating Planetary Orbits in the Solar System with 150 Lines of Python

import pygame
import sys
import math
from pygame.locals import *

pygame.init()

# Screen configuration
width, height = 1206, 780
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption("Solar System Simulation")
font = pygame.font.Font(None, 60)
clock = pygame.time.Clock()

# Load background image
background_img = pygame.image.load("./space_background.png")
screen.blit(background_img, (0, 0))

# Initialize orbital angles for planets
orbit_angle_sun = 0
orbit_angle_mercury = 0
orbit_angle_venus = 0
orbit_angle_earth = 0
orbit_angle_mars = 0
orbit_angle_jupiter = 0
orbit_angle_saturn = 0
orbit_angle_uranus = 0
orbit_angle_neptune = 0
orbit_angle_moon = 0

# Planet parameters: (image_path, radius, orbit_radius, speed)
planets_data = [
    ("sun_bg.png", 85, 0, 0),           # Sun
    ("mercury_bg.png", 4, 90, 0.077),   # Mercury
    ("venus_bg.png", 5, 100, 0.069),    # Venus
    ("earth_min_bg.png", 7.5, 120, 0.060), # Earth
    ("mars_bg.png", 6.5, 150, 0.053),   # Mars
    ("jupiter_bg.png", 35, 180, 0.045), # Jupiter
    ("saturn_bg.png", 25, 210, 0.037),  # Saturn
    ("uranus_bg.png", 22.5, 250, 0.031), # Uranus
    ("neptune_bg.png", 18.5, 300, 0.025), # Neptune
]

# Moon orbit around Earth
moon_orbit_radius = 10
moon_speed = 0.2

# Load music
pygame.mixer.music.load("victory.mp3")
pygame.mixer.music.play(-1, 40)
pygame.mixer.music.set_volume(0.5)

# Main loop
while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()

    # Draw background
    screen.blit(background_img, (0, 0))

    # Draw title
    title_text = font.render("Solar System", True, (255, 255, 0))
    screen.blit(title_text, (100, 100))

    # Draw planet labels and icons on the right
    label_font = pygame.font.SysFont("arial", 15)
    positions = [(1020, 30), (1020, 70), (1020, 110), (1020, 150), (1020, 190),
                 (1020, 230), (1020, 270), (1020, 300), (1020, 340), (1020, 380)]
    names = ["Sun", "Mercury", "Venus", "Earth", "Moon", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune"]
    icons = ["sun_bg.png", "mercury_bg.png", "venus_bg.png", "earth_min_bg.png", "mercury_bg.png",
             "mars_bg.png", "jupiter_bg.png", "saturn_bg.png", "uranus_bg.png", "neptune_bg.png"]

    for i, (x, y) in enumerate(positions):
        text_surface = label_font.render(names[i], True, (255, 0, 0))
        screen.blit(text_surface, (x, y))
        icon = pygame.image.load(f"./images/{icons[i]}")
        scaled_icon = pygame.transform.scale(icon, (27, 27))
        screen.blit(scaled_icon, (x + 70, y - 2))

    # Draw Sun at center
    sun_img = pygame.image.load("./images/sun_bg.png")
    screen.blit(pygame.transform.scale(sun_img, (170, 170)), (width//2 - 85, height//2 - 85))

    # Update and draw planets
    center_x, center_y = width // 2, height // 2
    for idx, (img_path, size_val, orbit_dist, speed) in enumerate(planets_data):
        angle = globals()[f"orbit_angle_{['mercury', 'venus', 'earth', 'mars', 'jupiter', 'saturn', 'uranus', 'neptune'][idx-1] if idx > 0 else 'sun'}"]
        angle += speed
        x = center_x + orbit_dist * math.sin(angle)
        y = center_y + orbit_dist * math.cos(angle)
        planet_img = pygame.image.load(f"./images/{img_path}")
        scaled = pygame.transform.scale(planet_img, (size_val * 2, size_val * 2))
        screen.blit(scaled, (x - size_val, y - size_val))

        # Update angle
        globals()[f"orbit_angle_{['mercury', 'venus', 'earth', 'mars', 'jupiter', 'saturn', 'uranus', 'neptune'][idx-1] if idx > 0 else 'sun'}"] = angle

    # Draw Moon orbiting Earth
    earth_x = center_x + 120 * math.sin(orbit_angle_earth)
    earth_y = center_y + 120 * math.cos(orbit_angle_earth)
    moon_angle = orbit_angle_moon + moon_speed
    moon_x = earth_x + moon_orbit_radius * math.sin(moon_angle)
    moon_y = earth_y + moon_orbit_radius * math.cos(moon_angle)
    moon_img = pygame.image.load("./images/mercury_bg.png")
    screen.blit(pygame.transform.scale(moon_img, (3, 3)), (moon_x - 1.5, moon_y - 1.5))
    orbit_angle_moon = moon_angle

    # Refresh display
    pygame.display.flip()
    clock.tick(50)

Tags: python pygame Solar System Simulation Planetary Motion animation

Posted on Sun, 24 May 2026 20:29:52 +0000 by sryder