Terrapin Resources

ScatterGrams

ScatterGrams is a fun game of jumbled words and letters. Each player will see letters floating around the screen. Figure out the scrambled word and type it in. The object is to type the word more quickly and accurately than your opponent to score more points. You can control the word size and your typing speed so keep in mind that longer words and faster typing usually mean a higher score. But, typos are penalties! So, fill in your names, make your selections, and click PLAY to begin the fun.

ScatterGrams.lgo

TO SETUP
	SETUP.SCREEN
	SETUP.GLOBALS
	DEMO.SCREEN
	PPROP "SCORES "VISIBLE TRUE
END

TO SETUP.SCREEN
	DRAW
	FULLSCREEN
	BOUNCE

; setup player 1 controls
	DECLARE "EDITBOX "NAME.1
	PPROP "NAME.1 "SIZE [150 20]
	PPROP "NAME.1 "POSITION [400 213]
	PPROP "NAME.1 "PLACEHOLDER "|Player 1 put name here|

	DECLARE "LISTBOX "WORD.LIST.1
	PPROP "WORD.LIST.1 "SIZE [150 85]
	PPROP "WORD.LIST.1 "POSITION [400 155]
	REPEAT 3 [ASK "WORD.LIST.1 [LBREMOVE 0]]

	DECLARE "STATICTEXT "SCORE.1
	PPROP "SCORE.1 "SIZE [150 16]
	PPROP "SCORE.1 "POSITION [400 100]
	PPROP "SCORE.1 "TEXT "|Score: 0|

	DECLARE "POPUP "WORD.SIZE.1
	PPROP "WORD.SIZE.1 "SIZE [150 30]
	PPROP "WORD.SIZE.1 "POSITION [400 72]
	REPEAT 3 [ASK "WORD.SIZE.1 [LBREMOVE 0]]
	IGNORE ASK "WORD.SIZE.1 [LBAPPEND "|Random word size|]
	IGNORE ASK "WORD.SIZE.1 [LBAPPEND "|3-letter words|]
	IGNORE ASK "WORD.SIZE.1 [LBAPPEND "|4-letter words|]
	IGNORE ASK "WORD.SIZE.1 [LBAPPEND "|5-letter words|]
	IGNORE ASK "WORD.SIZE.1 [LBAPPEND "|6-letter words|]
	IGNORE ASK "WORD.SIZE.1 [LBAPPEND "|7-letter words|]
	IGNORE ASK "WORD.SIZE.1 [LBAPPEND "|8-letter words|]
	IGNORE ASK "WORD.SIZE.1 [LBAPPEND "|9-letter words|]
	IGNORE ASK "WORD.SIZE.1 [LBAPPEND "|10-letter words|]
	IGNORE ASK "WORD.SIZE.1 [LBAPPEND "|11-letter words|]
	IGNORE ASK "WORD.SIZE.1 [LBAPPEND "|12-letter words|]
	PPROP "WORD.SIZE.1 "INDEX 0

; setup player 2 controls
	DECLARE "EDITBOX "NAME.2
	PPROP "NAME.2 "SIZE [150 20]
	PPROP "NAME.2 "POSITION [400 -70]
	PPROP "NAME.2 "PLACEHOLDER "|Player 2 put name here|

	DECLARE "LISTBOX "WORD.LIST.2
	PPROP "WORD.LIST.2 "SIZE [150 85]
	PPROP "WORD.LIST.2 "POSITION [400 -128]
	REPEAT 3 [ASK "WORD.LIST.2 [LBREMOVE 0]]

	DECLARE "STATICTEXT "SCORE.2
	PPROP "SCORE.2 "SIZE [150 16]
	PPROP "SCORE.2 "POSITION [400 -183]
	PPROP "SCORE.2 "TEXT "|Score: 0|

	DECLARE "POPUP "WORD.SIZE.2
	PPROP "WORD.SIZE.2 "SIZE [150 30]
	PPROP "WORD.SIZE.2 "POSITION [400 -211]
	REPEAT 3 [ASK "WORD.SIZE.2 [LBREMOVE 0]]
	IGNORE ASK "WORD.SIZE.2 [LBAPPEND "|Random word size|]
	IGNORE ASK "WORD.SIZE.2 [LBAPPEND "|3-letter words|]
	IGNORE ASK "WORD.SIZE.2 [LBAPPEND "|4-letter words|]
	IGNORE ASK "WORD.SIZE.2 [LBAPPEND "|5-letter words|]
	IGNORE ASK "WORD.SIZE.2 [LBAPPEND "|6-letter words|]
	IGNORE ASK "WORD.SIZE.2 [LBAPPEND "|7-letter words|]
	IGNORE ASK "WORD.SIZE.2 [LBAPPEND "|8-letter words|]
	IGNORE ASK "WORD.SIZE.2 [LBAPPEND "|9-letter words|]
	IGNORE ASK "WORD.SIZE.2 [LBAPPEND "|10-letter words|]
	IGNORE ASK "WORD.SIZE.2 [LBAPPEND "|11-letter words|]
	IGNORE ASK "WORD.SIZE.2 [LBAPPEND "|12-letter words|]
	PPROP "WORD.SIZE.2 "INDEX 0

; place buttons initially disabled
	DECLARE "BUTTON "PLAY.BUTTON
	PPROP "PLAY.BUTTON "POSITION [400 30]
	PPROP "PLAY.BUTTON "TEXT "|Play|
	PPROP "PLAY.BUTTON "RUN [MAKE "PROCESS.ID LAUNCH [PLAY.GAME]]
	PPROP "PLAY.BUTTON "ENABLED FALSE

	DECLARE "BUTTON "INSTRUCTION.BUTTON
	PPROP "INSTRUCTION.BUTTON "POSITION [400 0]
	PPROP "INSTRUCTION.BUTTON "TEXT "|Instructions|
	PPROP "INSTRUCTION.BUTTON "RUN [ABOUT]
	PPROP "INSTRUCTION.BUTTON "ENABLED FALSE

	DECLARE "BUTTON "QUIT.BUTTON
	PPROP "QUIT.BUTTON "POSITION [400 -30]
	PPROP "QUIT.BUTTON "TEXT "|Quit|
	PPROP "QUIT.BUTTON "RUN [QUIT.ROUTINE]
	PPROP "QUIT.BUTTON "ENABLED FALSE

; now make the controls visible
	PPROP "SCORES "VISIBLE TRUE
END

TO DEMO.SCREEN
	MAKE "SECRET "SCATTERGRAMS
	MAKE "SCATTERED JUMBLE :SECRET
	MAKE "SOLVED.X :SOLVED.X.ANCHOR - 32 * (COUNT :SECRET) / 2
	ASSIGN.TURTLES :SCATTERED
	WAIT 3000
	AUTO.SOLVE :SECRET
	PPROP "PLAY.BUTTON "ENABLED TRUE
	PPROP "INSTRUCTION.BUTTON "ENABLED TRUE
	PPROP "QUIT.BUTTON "ENABLED TRUE
END

TO ASSIGN.TURTLES :WORD 
	SETTURTLES 1 + COUNT :WORD
	ASK 0 [HT]
	TELLALL 1 COUNT :WORD
	EACH [SETSHAPE (WORD "~ (ITEM WHO :WORD) ".PNG)]
	SETTS 1.5
	EACH [SHOWTURTLE PENUP SETPC PICK :MY.COLORS]
	EACH [PPROP WHO "SHAPELOCK TRUE]
	EACH [SETHEADING WHO * (360 / COUNT :WORD)]
	EACH [WANDER WHO]
END

TO AUTO.SOLVE :WORD
	IF EMPTY? :WORD [STOP]
	DISABLE FIRST :WORD
	AUTO.SOLVE BUTFIRST :WORD
END

TO DISABLE :LETTER
	(LOCAL "TURTLE "CURRENT.WHO)
	MAKE "CURRENT.WHO .WHO
	MAKE "TURTLE FIND :LETTER :SCATTERED
	MAKE "SCATTERED MARK :LETTER :SCATTERED
	STOP.WANDERING :TURTLE
	ASK :TURTLE [SETTS 1]
	PPROP :TURTLE "POSITION SOLVED.POSITION
	PLAY LIST PICK [O3 O4 O5] WORD 16 PICK [A B C D E F G]
	MAKE "CURRENT.WHO BUTMEMBER :TURTLE :CURRENT.WHO
	TELL :CURRENT.WHO
END

TO FIND :LETTER :WORD
	IF :LETTER = FIRST :WORD [OUTPUT 1]
	OUTPUT 1 + FIND :LETTER BUTFIRST :WORD
END

TO MARK :LETTER :WORD
	IF :LETTER = FIRST :WORD [OUTPUT WORD "- BUTFIRST :WORD]
	OUTPUT WORD FIRST :WORD MARK :LETTER BUTFIRST :WORD
END

TO SOLVED.POSITION
	LOCAL "TEMP
	MAKE "TEMP LIST :SOLVED.X :SOLVED.Y
	MAKE "SOLVED.X :SOLVED.X + :SOLVED.X.INC
	OUTPUT :TEMP
END

TO SETUP.GLOBALS
	MAKE "WORD.LIST.3 [CAT HAT BAT SAT DOG LOG HOG THE HIM HER HIS OUR TOT ROT GOT TOO \
		SIT MOP MAN SEE SON SUN SET HOP ONE PUN PIN TIN LOT FUN FAN SAP ZIP HIP RAY DIG BIG \
		FIG RIG PIG RED BED RUN NUN WIN SIP TIE TWO CRY SIN FIN CAN JAM RAN BIT FIT BEE COW \
		SET PET WET BUG RUG HUG PUT NUT BAG GAG RAG TAG LIP CAR JAR FAR PEN HEN ASK TOE ARM \
		EGG FLY DRY WHY TRY LOW SEW MIX SIX FIX]

	MAKE "WORD.LIST.4 [COLT THAT WHAT LOGO POGO GOOD LOOK MINT BOOK THEM RUIN FAIL SAFE \
		TREE SAID BOLT YELL BLUE PINK SHOW FROM PROM FAST PAST BUZZ NEST DOOR BEST VEIN PART \
		REST COOK LOOK MOST BAKE RAKE LAKE FISH DISH WISH HAND SAND BAND LAND CRAB BEAR DEAF \
		DRIP FALL TALL BALL CALL WALL BASE CASE VASE DIME TELL BELL VEST TEST NAIL RAIL SAIL \
		CART BEAM SEAM PAIL TAIL TASK DOLL PILL HILL WILL BILL FILL PAIR HAIR NOSE KNEE GATE \
		FOOT TEAR PEAR SHOW FEAR SKIN SKIP CLIP BIRD WORD MOON LAMP FAME RING SING]

	MAKE "WORD.LIST.5 [PRINT DIARY SPACE PLACE PIZZA SALAD GREEN CRIME FIGHT MIGHT LIGHT \
		SIGHT TODAY MOUSE HOUSE CREAM DREAM FLASK EARTH STILL PHOTO CHAIR THUMB ELBOW ANKLE \
		WRIST WAIST MOUTH GRAPE MELON APPLE PEACH LEMON BRUSH HEARD JEWEL EQUAL ANGEL FRUIT \
		PLANT PAINT SHEET SHIRT PANTS SOCKS RADIO WORLD GREAT GUEST FLING THING HEART BLOOD \
		UNCLE HORSE NURSE FLOOR CLOCK THROW THREE EIGHT COVER]

	MAKE "WORD.LIST.6 [MARINE PEOPLE REWIND LEGEND CAREER HOCKEY MUSEUM ARTIST SISTER \
		STEREO FINGER ORANGE YELLOW CHERRY BANANA BREEZE MIRROR BRANCH CHEESE PLANET FLOWER \
		REMOTE PILLOW BUREAU SERMON CHURCH SCREAM DRAWER HANGAR PEOPLE MOTHER FATHER NEPHEW \
		DOCTOR CANDLE BASKET TISSUE SAUCER TEMPER HEALTH]

	MAKE "WORD.LIST.7 [RECEIVE VACUUMS BEATLES PICTURE PITCHER PRINTER SPINACH SURVIVE \
		BUNDLES PLAYERS BETWEEN BUTTONS PHYSICS]

	MAKE "WORD.LIST.8 [RECEIVER HEADACHE COMEDIAN KEYBOARD BASEBALL FOOTBALL FUNCTION \
		MACARONI TERRAPIN REACHING ADDITION WHENEVER]

	MAKE "WORD.LIST.9 [COMEDIANS MACINTOSH TELEPHONE PROCEDURE SPAGHETTI ASTRONAUT \
		CARTESIAN AGREEMENT FUNCTIONS GEOGRAPHY CHEMISTRY IMPLEMENT WORKSPACE SAXOPHONE]

	MAKE "WORD.LIST.10 [ASTRONAUTS PROCEDURES MICROSCOPE BACKGROUND WINCHESTER \
		CHARACTERS TELEVISION EARTHQUAKE BEEKEEPERS]

	MAKE "WORD.LIST.11 [INTERACTIVE APPROXIMATE EVAPORATION RADIOACTIVE VACCINATION \
		INFORMATION PROGRAMMING MATHEMATICS INSTRUCTION ILLUSTRATOR ENTERTAINER HUMMINGBIRD]

	MAKE "WORD.LIST.12 [HUMMINGBIRDS NEIGHBORHOOD ENTERTAINERS CONDENSATION SUBPROCEDURE \
		APPROXIMATES INSTRUCTIONS EXPERIMENTAL ENCYCLOPEDIA]

	MAKE "MIN.WORD.SIZE 3
	MAKE "MAX.WORD.SIZE 12
	MAKE "ALREADY.USED []
	MAKE "SOLVED.X.ANCHOR 0
	MAKE "SOLVED.Y -200
	MAKE "SOLVED.X.INC 32
	MAKE "SCATTERED "||
	MAKE "CURRENT.PLAYER 1

	MAKE "MY.COLORS [ [0 0 0] [139 0 0] [255 0 0] [255 165 0] [0 255 0] [0 255 255] [0 128 0] [0 0 255] [0 0 128] [255 0 255] [128 0 128] [165 42 42] [255 192 203] [255 215 0]]

	MAKE "TOTAL.SCORE.1 0
	MAKE "TOTAL.SCORE.2 0
	MAKE "WORDS.PER.GAME 5
END

TO SETUP.REPLAY
	HALT :PROCESS.ID
	REPEAT 5 [ASK "WORD.LIST.1 [LBREMOVE 0]]
	REPEAT 5 [ASK "WORD.LIST.2 [LBREMOVE 0]]
	PPROP "SCORE.1 "TEXT 0
	PPROP "SCORE.2 "TEXT 0
	MAKE "TOTAL.SCORE.1 0
	MAKE "TOTAL.SCORE.2 0
	MAKE "ALREADY.USED []
	TELL EVERY "TURTLE
	HIDETURTLE
	WAIT 1000
	MAKE "PROCESS.ID LAUNCH [PLAY.GAME]
END

TO UNIQUE.RANDOM :WORD.LIST
	LOCAL "SELECTION
	MAKE "SELECTION ITEM (RANDOM COUNT :WORD.LIST) :WORD.LIST
	IF MEMBER? :SELECTION :ALREADY.USED [OUTPUT UNIQUE.RANDOM :WORD.LIST]
	MAKE "ALREADY.USED FPUT :SELECTION :ALREADY.USED
	OUTPUT :SELECTION
END

TO JUMBLE :WORD 
	IF (COUNT :WORD) < 2 [OUTPUT :WORD]
	OUTPUT JUMBLE1 :WORD RANDOM COUNT :WORD
END

TO JUMBLE1 :WORD :N
	IF (COUNT :WORD) < 2 [OUTPUT :WORD]
	OUTPUT WORD (ITEM :N :WORD) (JUMBLE1 (REMOVE.ITEM :N :WORD) (RANDOM ( (COUNT :WORD) - 1)))
END

TO REMOVE.ITEM :N :WORD
	IF :N < 2 [OUTPUT BUTFIRST :WORD]
	OUTPUT WORD (FIRST :WORD) (REMOVE.ITEM (:N - 1) (BUTFIRST :WORD))
END

TO CURRENT.WORD.LIST
	OUTPUT THING WORD "WORD.LIST. CURRENT.WORD.SIZE
END

TO CURRENT.WORD.SIZE
	LOCAL "INDEX
	MAKE "INDEX GPROP (WORD "WORD.SIZE. :CURRENT.PLAYER) "INDEX
	IF :INDEX = 0 \
	[OUTPUT RANDOM.BETWEEN :MIN.WORD.SIZE :MAX.WORD.SIZE] \
	[OUTPUT 2 + :INDEX]
END

TO CURRENT.SPEED
	OUTPUT ROUND GPROP (WORD "SPEED. :CURRENT.PLAYER) "VALUE
END

TO RANDOM.BETWEEN :A :B
	OUTPUT (:A - 1) + RANDOM (:B - :A + 1)
END

TO ABOUT
	IGNORE ALERT "|Welcome to ScatterGrams! \n It's a fun game of jumbled words and letters. \n The object is to type the word more quickly and accurately than your opponent to score more points. \n You can control the word size and your typing speed so keep in mind that longer words and faster typing usually mean a higher score. But, typos are penalties! \n So, fill in your names, make your selections, and press PLAY to begin the fun.|
END

TO PLAY.GAME
	PPROP "PLAY.BUTTON "RUN [SETUP.REPLAY]
	PPROP "PLAY.BUTTON "TEXT "|Restart game|
	PLAY.ROUNDS :WORDS.PER.GAME
	WAIT 1000
	GAME.DONE
END

TO PLAY.ROUNDS :ROUNDS
	IF :ROUNDS = 0 [STOP]
	MAKE "CURRENT.PLAYER 1
	PLAY.ROUND
	IF AND (:ROUNDS = 1) (:TOTAL.SCORE.2 > :TOTAL.SCORE.1) [STOP]
	MAKE "CURRENT.PLAYER 2
	PLAY.ROUND
	PLAY.ROUNDS :ROUNDS - 1
END

TO PLAY.ROUND
	GET.READY
	MAKE "SECRET UNIQUE.RANDOM CURRENT.WORD.LIST
	MAKE "SCATTERED JUMBLE :SECRET
	MAKE "SOLVED.X :SOLVED.X.ANCHOR - 32 * (COUNT :SECRET) / 2
	ASSIGN.TURTLES :SCATTERED
	PPROP WORD "SPEED. :CURRENT.PLAYER "RUN [SETVELOCITY CURRENT.SPEED]
	MAKE "TYPOS 0
	MAKE "TIME.0 MILLISECONDS
	PLAY.WORD :SECRET
END

TO PLAY.WORD :WORD
	IF EMPTY? :WORD [WORD.FINISH STOP]
	PLAY.LETTER FIRST :WORD
	PLAY.WORD BUTFIRST :WORD
END

TO PLAY.LETTER :LETTER
	WHILE [NOT EQUAL? :LETTER (UPPERCASE RC)] [
		MAKE "TYPOS :TYPOS + 1
		PLAY [M10 N56 R]
	]
	DISABLE :LETTER
END

TO WORD.FINISH
	LOCAL "PUT.WORD
	MAKE "TIME.1 MILLISECONDS
	IGNORE ASK WORD "WORD.LIST. :CURRENT.PLAYER [LBAPPEND (WORD LOWERCASE :SECRET CHAR 32 CHAR 40 WORD.SCORE CHAR 41)]
	UPDATE (WORD "TOTAL.SCORE. :CURRENT.PLAYER) WORD.SCORE
	PPROP (WORD "SCORE. :CURRENT.PLAYER) "TEXT (WORD "|Score: | (THING WORD "TOTAL.SCORE. :CURRENT.PLAYER))
END

TO WORD.SCORE
	(LOCAL "TIME.ALLOTTED "TIME.TAKEN "TIME.FACTOR "POINTS.PER.LETTER "TEMP.SCORE)
	MAKE "TIME.ALLOTTED 1500 * (COUNT :SECRET)	; 1.5 seconds per letter
	MAKE "TIME.TAKEN :TIME.1 - :TIME.0
	MAKE "TIME.FACTOR :TIME.ALLOTTED / :TIME.TAKEN
	MAKE "TEMP.SCORE ROUND (:TIME.FACTOR * (120 + COUNT :SECRET)) - (:TYPOS * 10)
	IF :TEMP.SCORE < 0 [OUTPUT 0]
	OUTPUT :TEMP.SCORE
END

TO GAME.DONE
	MAKE "SECRET GET.WINNER
	MAKE "SCATTERED JUMBLE :SECRET
	MAKE "SOLVED.X :SOLVED.X.ANCHOR - 32 * (COUNT :SECRET) / 2
	ASSIGN.TURTLES :SCATTERED
	WAIT 3000
	AUTO.SOLVE :SECRET
	TELLALL 1 COUNT :SECRET
	SETHEADING 0
	EACH [WANDER WHO]
	PPROP "PLAY.BUTTON "TEXT "|Play again|
END

TO GET.WINNER
	IF :TOTAL.SCORE.1 = :TOTAL.SCORE.2 [OUTPUT "|tie game|]
	IF :TOTAL.SCORE.1 > :TOTAL.SCORE.2 [OUTPUT GET.NAME 1]
	OUTPUT GET.NAME 2
END

TO GET.NAME :PLAYER
	LOCAL "WINNER
	MAKE "WINNER UPPERCASE GPROP WORD "NAME. :PLAYER "TEXT
	IF EMPTY? :WINNER [OUTPUT (WORD "|Player | :PLAYER "| won with Logo fun|)]
	MAKE "WINNER FORMAT.NAME :WINNER COUNT :WINNER	; was limited to :max.word.size
	IF EMPTY? :WINNER [OUTPUT (WORD "|Player | :PLAYER "| won with Logo fun|)]
	OUTPUT :WINNER
END

TO FORMAT.NAME :NAME :MAX
	IF EMPTY? :NAME [OUTPUT "||]
	IF :MAX = 0 [OUTPUT "||]
	IF DISPLAYABLE? FIRST :NAME [OUTPUT WORD (FIRST :NAME) (FORMAT.NAME BUTFIRST :NAME :MAX - 1)]
	OUTPUT FORMAT.NAME BUTFIRST :NAME :MAX
END

TO DISPLAYABLE? :LETTER
	IF :LETTER = CHAR 32 [OUTPUT TRUE]
	OUTPUT MEMBER? :LETTER "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
END

TO UPDATE :ITEM :VALUE
	MAKE :ITEM (THING :ITEM) + :VALUE
END

TO GET.READY
	IGNORE ALERT (WORD "|Player | :CURRENT.PLAYER "| -- Just press Enter when ready|)
END

TO QUIT.ROUTINE
	RESTART
END

TO WANDER :BITMAP
	PPROP "WANDERERS "WANDERING FPUT :BITMAP GPROP "WANDERERS "WANDERING
	PPROP :BITMAP "WANDER.ID LAUNCH LIST "WANDERING QUOTE :BITMAP
END

TO WANDERING :BITMAP
	ASK :BITMAP [FOREVER [FD 1 WAIT 1]]
END

TO WANDERING? :BITMAP
	OUTPUT NOT EMPTY? GPROP :BITMAP "WANDER.ID
END

TO STOP.WANDERING :BITMAP
	IF NOT WANDERING? :BITMAP THEN STOP
	LOCAL "ID
	MAKE "ID GPROP :BITMAP "WANDER.ID
	REMPROP :BITMAP "WANDER.ID
	PPROP "WANDERERS "WANDERING BUTMEMBER :BITMAP GPROP "WANDERERS "WANDERING
	HALT :ID
END 

TO WANDERERS
	OUTPUT GPROP "WANDERERS "WANDERING
END

TO STOP.WANDERERS
	FOREACH WANDERERS [STOP.WANDERING "?]
END

TO MAIN
	SETUP
END

MAIN

Procedure MAIN
Description Two player game of scrambled words.
Level Advanced
Tags Game, Controls