Example: Random Solar System

Create a ‘random’ solar system and surrounding star field using these commented Logo procedures:

TO solsys
  ;reset the turtles and clear the environment
  ;don't display text
  ask "snappy [pullout 1000]
  ;ask the camera turtle to pull away from
  ;myrtle 1000 turtle units
  ;raise the turtle's pen so she doesn't draw
  ;go incognito
  ;jump to the stars procedure, which creates
  ;a starfield around our solar system
  setfillcolor yellow
  icosphere 75
  ;make the sun, an icosphere 75 turtle units
  ;in radius
  ;set Myrtle's 'anchor point' or the point
  ;she orbits around to her home position.
  ;By default it is somewhat in front of it.
  pullout 100
  ;pull out from the anchor point 100 turtle units
  repeat 10 [
    ;do the following ten times, to create ten planets
    pullout 100
    ;pull out from the anchor point 100 more
    ;turtle units
    orbitleft random 360
    ;orbit to the left between 0 and 360 degrees
    ;(up to one full orbit of the anchor point)
    planet repcount
    ;jump to the planet procedure, passing it
    ;the current iteration of the repeat loop
    ;as its parameter - the current planet number
  ;this is the end of the planet creation loop
  snappy:forever [orbitdown 0.001]
  ;orbit around the scene
  ;snappy: is shorthand for 'ask "snappy []'

TO stars
  ;create a starfield
  repeat 500 [
    ;points the turtle in a random 3D
    ;direction. 'Vectors' describe absolute
    ;directions in 3D space using numbers.
    ;We call them vectors so as to not confuse
    ;them with relative directions such as up,
    ;down, left or right. A turtle with certain
    ;vectors will always point a certain way.
    ;For now, that's all you need to know!
    forward 1500 + random 500
    ;move forward 1500 turtle units plus
    ;between 0 and 499 turtle units in the
    ;turtle's forward direction - its forward
    ;Note: 'random' generates a number between
    ;0 and one less than the number you give it.
    ;The turtle knows what you mean when you say
    ;'random' because random is a primitive - a
    ;word the turtle knows.
    up 90
    ;tilt the turtle up 90 degrees, one quarter of
    ;a circle or one quarter of a complete rotation.
    ;Like as if you leaned back so far you were
    ;staring up at the sky
    ;random means 'pick one at random', in this
    ;case a random fill color, numbered between 1
    ;and 15 (there are 16 default colors, but 0 is
    ;transparent and not typically a useful fill
    spot 5 + random 5
    ;make a 'star', a spot with a radius of 5
    ;turtle units plus 0 - 4 additional turtle units
    ;go back to the home position
  ;make 500 stars

TO planet :number
  ;make a planet. The number passed to
  ;planet is used to uniquely identify
  ;its 'model' - what it looks like
  newmodel :number [
    ;Remember: not black!
    icosphere 10 + random 25
    ;create a randomly-sized sphere
    ;'what's your vectors, Victor?'
    dountil fillcolor != yellow [randomfillcolor]
    ;not yellow!
    spot 10 + random 30
    ;create a randomly-sizes spot.
    ;If it's bigger than the sphere
    ;then it will act as a ring
  ;make a random planet model with the
  ;name of the planet number stored
  ;in the :number container, which was
  ;created when the number was passed
  ;in to the planet procedure
  ;Models are not unique to turtles, and
  ;so they each need a unique name, regardless
  ;of whatever turtle 'wears' them. But that
  ;name can just be a number, as long as it
  ;is a unique number
  hatch [
    ;hatch a new turtle from this spot
    ;show the hatchling's model. Hatchlings
    ;models are hidden when they are hatched
    ;as are those of other turtles when they
    ;are newly created. Only Myrtle is shown
    ;by default
    put 1 + random 10 in "speed
    ;generate a random number between
    ;0 and 9, add it to 1 and put it in
    ;a container named 'speed'
    setmodel :number
    ;set the hatchling's 'model' or
    ;appearance to the name stored in
    ;the :number container
    setanchor [0 0 0]
    ;set the 'anchor' or the point a turtle
    ;orbits around to [0 0 0], the location
    ;of the sun
    forever [
      orbitleft :speed * 0.001
    ;orbit around the sun 'forever'
  ;this is the end of the hatchling's code