02-05-2026, 06:59 PM
Hello team! I thought I would share a bit of fun code with graphical statements, to draw planets randomly. Trying to make it as beautiful as possible.
Let me know what you think!
Code: (Select All)
Screen _NewImage(800, 600, 32)
_Title "20 Beautiful Planets in QB64PE"
Randomize Timer
Type PlanetData
x As Integer
y As Integer
radius As Integer
r As Integer
g As Integer
b As Integer
hasRings As Integer
ringAngle As Single
atmosphere As Integer
spots As Integer
End Type
Dim Shared Planets(1 To 20) As PlanetData
Dim Shared i As Integer
Dim Shared f As Long
f = _LoadFont("Arial.ttf", 16, "MONOSPACE")
If f > 0 Then _Font f
For i = 1 To 20
Planets(i).x = 70 + ((i - 1) Mod 5) * 150
Planets(i).y = 70 + ((i - 1) \ 5) * 120
Planets(i).radius = 20 + Rnd * 25
Planets(i).hasRings = IIf(Rnd > 0.5, -1, 0)
Planets(i).ringAngle = Rnd * _Pi
Planets(i).atmosphere = IIf(Rnd > 0.3, -1, 0)
Planets(i).spots = Int(Rnd * 8) + 2
Select Case i
Case 1: ' Blue gas giant
Planets(i).r = 50: Planets(i).g = 100: Planets(i).b = 200
Case 2: ' Red desert planet
Planets(i).r = 180: Planets(i).g = 80: Planets(i).b = 60
Case 3: ' Green jungle planet
Planets(i).r = 60: Planets(i).g = 150: Planets(i).b = 80
Case 4: ' Purple crystal planet
Planets(i).r = 150: Planets(i).g = 70: Planets(i).b = 200
Case 5: ' Orange lava planet
Planets(i).r = 220: Planets(i).g = 120: Planets(i).b = 40
Case 6: ' Ice planet
Planets(i).r = 200: Planets(i).g = 230: Planets(i).b = 250
Case 7: ' Brown rocky planet
Planets(i).r = 140: Planets(i).g = 110: Planets(i).b = 90
Case 8: ' Pink nebula planet
Planets(i).r = 230: Planets(i).g = 150: Planets(i).b = 200
Case 9: ' Yellow sun-like
Planets(i).r = 240: Planets(i).g = 220: Planets(i).b = 100
Case 10: ' Teal ocean planet
Planets(i).r = 70: Planets(i).g = 180: Planets(i).b = 170
Case 11: ' Maroon volcanic
Planets(i).r = 120: Planets(i).g = 40: Planets(i).b = 50
Case 12: ' Cyan gas giant
Planets(i).r = 80: Planets(i).g = 200: Planets(i).b = 220
Case 13: ' Gold metallic
Planets(i).r = 210: Planets(i).g = 180: Planets(i).b = 80
Case 14: ' Emerald green
Planets(i).r = 40: Planets(i).g = 180: Planets(i).b = 120
Case 15: ' Deep blue
Planets(i).r = 30: Planets(i).g = 70: Planets(i).b = 150
Case 16: ' Rust planet
Planets(i).r = 170: Planets(i).g = 90: Planets(i).b = 70
Case 17: ' Lilac planet
Planets(i).r = 180: Planets(i).g = 140: Planets(i).b = 220
Case 18: ' Turquoise
Planets(i).r = 70: Planets(i).g = 210: Planets(i).b = 190
Case 19: ' Copper
Planets(i).r = 190: Planets(i).g = 130: Planets(i).b = 100
Case 20: ' Violet storm
Planets(i).r = 130: Planets(i).g = 80: Planets(i).b = 180
End Select
Next i
Cls , _RGB32(5, 5, 20)
For i = 1 To 200
PSet (Rnd * 800, Rnd * 600), _RGB32(200 + Rnd * 55, 200 + Rnd * 55, 200 + Rnd * 55)
Next i
For i = 1 To 5
DrawNebula Rnd * 800, Rnd * 600, Int(Rnd * 100) + 50
Next i
For i = 1 To 20
DrawPlanet Planets(i)
Next i
Color _RGB32(180, 180, 255)
_PrintMode _KeepBackground
_PrintString (320, 550), "Press SPACE to regenerate"
_PrintString (350, 570), "Press ESC to exit"
Do
k$ = InKey$
If k$ = " " Then
Randomize Timer
For i = 1 To 20
Planets(i).radius = 20 + Rnd * 25
Planets(i).hasRings = IIf(Rnd > 0.5, -1, 0)
Planets(i).ringAngle = Rnd * _Pi
Planets(i).atmosphere = IIf(Rnd > 0.3, -1, 0)
Planets(i).spots = Int(Rnd * 8) + 2
Next i
Cls , _RGB32(5, 5, 20)
For i = 1 To 200
PSet (Rnd * 800, Rnd * 600), _RGB32(200 + Rnd * 55, 200 + Rnd * 55, 200 + Rnd * 55)
Next i
For i = 1 To 5
DrawNebula Rnd * 800, Rnd * 600, Int(Rnd * 100) + 50
Next i
For i = 1 To 20
DrawPlanet Planets(i)
Next i
Color _RGB32(180, 180, 255)
_PrintString (320, 550), "Press SPACE to regenerate"
_PrintString (350, 570), "Press ESC to exit"
End If
_Limit 30
Loop Until k$ = Chr$(27)
System
Sub DrawPlanet (p As PlanetData)
For r = p.radius To 0 Step -1
intensity = 0.3 + 0.7 * (r / p.radius)
Circle (p.x - 3, p.y - 3), r, _RGB32(p.r * intensity * 0.3, p.g * intensity * 0.3, p.b * intensity * 0.3)
Next r
For r = p.radius To 0 Step -1
intensity = 0.5 + 0.5 * (r / p.radius)
gradient = 0.7 + 0.3 * Sin(r * _Pi / p.radius)
Circle (p.x, p.y), r, _RGB32(p.r * intensity * gradient, p.g * intensity * gradient, p.b * intensity * gradient)
Next r
If p.atmosphere Then
For r = p.radius + 3 To p.radius + 10 Step 1
alpha = 50 - (r - p.radius - 3) * 7
If alpha > 0 Then
Circle (p.x, p.y), r, _RGBA32(p.r, p.g, p.b, alpha)
End If
Next r
End If
If p.hasRings Then
DrawRings p.x, p.y, p.radius, p.ringAngle, p.r, p.g, p.b
End If
DrawSurfaceDetails p.x, p.y, p.radius, p.spots, p.r, p.g, p.b
For r = p.radius \ 3 To 0 Step -1
intensity = 0.8 + 0.2 * (r / (p.radius \ 3))
Circle (p.x - p.radius \ 3, p.y - p.radius \ 3), r, _RGBA32(255, 255, 255, 100 * intensity)
Next r
End Sub
Sub DrawRings (x, y, radius, angle, r, g, b)
For ring = 1 To 3
ringRadius = radius + 15 + ring * 5
ringWidth = 3
For w = -ringWidth To ringWidth
For a = 0 To _Pi(2) Step 0.01
rx = ringRadius * Cos(a)
ry = (ringRadius + w) * Sin(a) * 0.3
rx2 = rx * Cos(angle) - ry * Sin(angle)
ry2 = rx * Sin(angle) + ry * Cos(angle)
distFromCenter = Abs(w) / ringWidth
alpha = 150 * (1 - distFromCenter)
ringColor = _RGBA32(r + 30, g + 30, b + 30, alpha)
PSet (x + rx2, y + ry2), ringColor
Next a
Next w
Next ring
End Sub
Sub DrawSurfaceDetails (x, y, radius, numSpots, baseR, baseG, baseB)
For spot = 1 To numSpots
angle = Rnd * _Pi(2)
distance = Rnd * radius * 0.8
spotX = x + distance * Cos(angle)
spotY = y + distance * Sin(angle)
spotSize = radius * (0.1 + Rnd * 0.2)
spotType = Int(Rnd * 3)
Select Case spotType
Case 0:
spotR = baseR * 0.5
spotG = baseG * 0.5
spotB = baseB * 0.5
Case 1:
spotR = _Min(255, baseR * 1.3)
spotG = _Min(255, baseG * 1.3)
spotB = _Min(255, baseB * 1.3)
Case 2:
spotR = _Min(255, baseG * 1.2)
spotG = _Min(255, baseB * 1.2)
spotB = _Min(255, baseR * 1.2)
End Select
For r = spotSize To 0 Step -1
alpha = 200 * (r / spotSize)
Circle (spotX, spotY), r, _RGBA32(spotR, spotG, spotB, alpha)
Next r
If Rnd > 0.7 Then
craterSize = spotSize * 0.5
Circle (spotX + craterSize * 0.3, spotY + craterSize * 0.3), craterSize, _RGB32(baseR * 0.3, baseG * 0.3, baseB * 0.3)
Circle (spotX + craterSize * 0.2, spotY + craterSize * 0.2), craterSize * 0.7, _RGB32(baseR * 0.7, baseG * 0.7, baseB * 0.7)
End If
Next spot
End Sub
Sub DrawNebula (x, y, size)
For i = 1 To 5
nx = x + (Rnd - 0.5) * size
ny = y + (Rnd - 0.5) * size
ns = size * (0.3 + Rnd * 0.3)
nr = 50 + Rnd * 100
ng = 50 + Rnd * 100
nb = 100 + Rnd * 100
For r = ns To 0 Step -1
alpha = 30 * (r / ns)
Circle (nx, ny), r, _RGBA32(nr, ng, nb, alpha)
Next r
Next i
End Sub
Function IIf% (condition, trueValue, falseValue)
If condition Then
IIf = trueValue
Else
IIf = falseValue
End If
End Function
Let me know what you think!


![[Image: Screenshot-20260207-112914.png]](https://i.ibb.co/C5q9RqGz/Screenshot-20260207-112914.png)
