Grok's Geometry Dash Random Short Level Generator
Real Python in your browser • Short levels (20–50s) • Unique every time
File downloads automatically! Import with GDShare/Geode in Geometry Dash.
import random
import js
# Constants
GROUND_Y = 124
SPIKE_Y = 109
PAD_Y = 109
PORTAL_Y = 124
ORB_Y = 124
FINISH_Y = 124
START_X = 48
START_Y = 139
def add_object(obj_id, x, y, rot=0, sx=100, sy=100, col1=-1, col2=-1):
return f"1,{obj_id},1,{int(x)},{int(y)},{sx},{sy},{int(rot)},1,{col1},{col2},1,1,1,1,0,0"
def generate_and_download():
random.seed()
length = random.randint(6000, 15000)
est_time = round(length / 300, 1)
name_options = ["ChaosDash", "GrokRand", "QuickChaos", "ShortFury", "PixelRush", "DashRandom", "MiniMayhem", "SpeedSpin", "NeonBurst", "QuantumJump"]
name = random.choice(name_options) + f" #{random.randint(1000,9999)}"
desc = f"Random short level by Grok! (~{est_time}s chaos)"
song_id = random.randint(1, 50000)
objects = []
objects.append(add_object(82, START_X, START_Y)) # Start pos
# Ground + hazards
step = random.randint(20, 40)
for i in range(0, length + 200, step):
x = i
block_id = random.choice([1, 21, 31, 41])
objects.append(add_object(block_id, x, GROUND_Y))
if random.random() < 0.25:
hazard_id = random.choice([8, 9, 176])
objects.append(add_object(hazard_id, x + step//2, SPIKE_Y))
# Jump aids
num_aids = random.randint(4, 10)
aid_xs = sorted([random.randint(400, length-400) for _ in range(num_aids)])
for x in aid_xs:
if random.random() < 0.65:
pad_id = random.choice([35, 37, 38, 140])
objects.append(add_object(pad_id, x, PAD_Y))
else:
orb_id = random.choice([36, 42, 52, 84])
objects.append(add_object(orb_id, x, ORB_Y))
# Portals
num_portals = random.randint(2, 5)
portal_xs = sorted([random.randint(800, length-800) for _ in range(num_portals)])
for x in portal_xs:
portal_id = random.choice([11, 46, 47, 99, 101, 202, 203])
objects.append(add_object(portal_id, x, PORTAL_Y))
# Finish orb
objects.append(add_object(43, length + 50, FINISH_Y))
# Decorations
deco_ids = [2, 3, 4, 5, 22, 23, 289, 30, 31]
for _ in range(random.randint(15, 35)):
x = random.randint(150, length-150)
deco_id = random.choice(deco_ids)
y = random.choice([GROUND_Y-40, GROUND_Y+40, 80, 200, 300])
rot = random.randint(0, 360)
objects.append(add_object(deco_id, x, y, rot=rot))
object_str = ";".join(objects)
# Build level data
keys = [
("k1", "1"), ("k2", name), ("k3", desc), ("k4", object_str),
("k5", str(song_id)), ("k6", "0"), ("k7", "0"),
("k8", "0"), ("k9", "0"), ("k10", "0"), ("k11", "0"),
("k12", "0"), ("k13", "0"), ("k14", "0"), ("k15", "0"),
("k16", "0"), ("k17", "0"), ("k18", "0"), ("k19", "0"),
("k20", "0"), ("k21", "0"), ("k22", "0"),
("k45", "0"), ("k50", "")
]
plist = "".join(f"{k}{v}" for k, v in keys)
gmd_content = f"{plist}"
# Unique filename
filename = f"{name.replace(' ', '_')}_{random.randint(10000,99999)}.gmd"
# Auto download
blob = js.Blob.new([gmd_content], {type: "text/plain;charset=utf-8"})
url = js.URL.createObjectURL(blob)
a = js.document.createElement("a")
a.href = url
a.download = filename
js.document.body.appendChild(a)
a.click()o
js.document.body.removeChild(a)
js.URL.revokeObjectURL(url)
# Update UI
info_text = f"Downloaded: {name} (~{est_time}s) • Length: {length}px • Song ID: {song_id}"
output_html = f"""
File automatically downloaded: {filename}
Check your Downloads folder!
You can also copy the above text and save manually as .gmd if needed.
"""
js.document.getElementById("info").innerHTML = info_text
js.document.getElementById("output").innerHTML = output_html
# Bind button
js.document.getElementById("generate-btn").addEventListener("click", generate_and_download)