Bale Example: Dodgeball
Dodgeball is a very simple game using a bale wherein the player moves the turtle from the left to right sides of the screen using the keyboard.
This is similar to a popular example used to teach Scratch, and the basic concept should be familiar to most Scratch learners.
In the case of this example, there are multiple balls that are controlled by a ‘bale’, a group of turtles who all execute the same code, first the code in the bale’s init procedure, and then the code in the ‘main’ procedure repeatedly. Each member of the bale executes consecutively, and once all members of a bale have executed (a cycle), the bale’s graphical output (its ‘turtle tracks’) is updated.
The bale’s execution is started by Myrtle, using the startbale command.
Myrtle checks to see if the user has pressed any of the movement keys and moves if required. She also checks to see if she’s been hit by a ball, or if she’s reached the right side of the screen, and if either condition has been met, the game ends.
The balls meanwhile move up and down at different speeds, gradually sliding towards the left side of the screen (to prevent Myrtle from procrastinating!)
NEWTURTLE "myrtle TO start ;this is a very simple yet addicting and frustrating game ;add in your own sound effects! reset setmodel [bk 7.5 stamp "myrtle] ;myrtle's position is usually her tail, so we need to move her a bit ;so that her position is center-ish of her shell startbale "balls 11 pu setxy -170 0 rt 90 forever [ if keyp [ make "key lowercase readchar if :key = "k [sr 10] if :key = "i [sl 10] if :key = "j [bk 10] if :key = "l [fd 10] ] ;pressing keys causes turtle to move if nearp 15 [pr "ouch! repeat 1000 [rt 1] finish] ;got hit by a ball if xpos > 180 [pr "win! finish] ;made it to the other side! ] END ON start flag queue [] start END NEWTURTLE "snappy NEWTURTLE "libby NEWBALE "balls TO init setmodel {"setfc baleindex "ico 10} st penup setxy -160 + baleindex * 30 100 output {"dir 1 "speed 1 + (0.1 * random (5 * (5 + baleindex)))} END TO main if :dir = 0 [bk :speed] [fd :speed] slideleft 0.1 ;the balls gradually move toward the left side ;of the screen to discourage procrastination! if ypos < -100 [make "dir 1] if ypos > 100 [make "dir 0] END