pip install pygame pymunk numpy import pygame import pymunk import pymunk.pygame_util import numpy as np # Initialize Pygame & Pymunk pygame.init() screen = pygame.display.set_mode((800, 800)) clock = pygame.time.Clock() space = pymunk.Space() # Disable Pymunk's default gravity (we'll implement custom gravity) space.gravity = (0, 0) # Draw helper draw_options = pymunk.pygame_util.DrawOptions(screen) # Celestial body (e.g., a planet) planet_mass = 100000 planet_radius = 50 planet_body = pymunk.Body(body_type=pymunk.Body.STATIC) planet_body.position = (400, 400) planet_shape = pymunk.Circle(planet_body, planet_radius) planet_shape.density = 1 space.add(planet_body, planet_shape) # Spacecraft (player-controlled) ship_mass = 10 ship_radius = 10 ship_body = pymunk.Body(ship_mass, pymunk.moment_for_circle(ship_mass, 0, ship_radius)) ship_body.position = (400, 200) # Start above the planet ship_shape = pymunk.Circle(ship_body, ship_radius) ship_shape.density = 1 space.add(ship_body, ship_shape) # Custom gravity function (Newtonian gravity) def apply_gravity(): G = 1000 # Gravitational constant (tuned for gameplay) planet_pos = np.array(planet_body.position) ship_pos = np.array(ship_body.position) r_vec = planet_pos - ship_pos r = np.linalg.norm(r_vec) if r > planet_radius + ship_radius: force_magnitude = G * planet_mass * ship_mass / (r ** 2) force_dir = r_vec / r force = force_magnitude * force_dir ship_body.apply_force_at_local_point(force, (0, 0)) # Game loop running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == pygame.KEYDOWN: # Apply thrust (WASD controls) if event.key == pygame.K_w: ship_body.apply_impulse_at_local_point((0, -50)) # Up elif event.key == pygame.K_s: ship_body.apply_impulse_at_local_point((0, 50)) # Down elif event.key == pygame.K_a: ship_body.apply_impulse_at_local_point((-50, 0)) # Left elif event.key == pygame.K_d: ship_body.apply_impulse_at_local_point((50, 0)) # Right # Apply custom gravity apply_gravity() # Update physics space.step(1/60) # Draw screen.fill((0, 0, 0)) space.debug_draw(draw_options) pygame.display.flip() clock.tick(60) pygame.quit(ship_body.velocity = (150, 0) # Circular orbit velocity)