## Tic Tac Toe

American Embassy School Grade 9 student Manit
developed the classic Tic Tac Toe game in *Terrapin Logo* as a contest
between the computer and a human player. The person goes first, clicking
on a square to mark it with an X. The computer follows playing the O
role. Manit has programmed the computer to be a clever Tic Tac Toe
player and hard to beat.

This program utilizes basic artificial intelligence in Terrapin Logo to provide the computer strategy. Classic turtle graphics are used to draw the Tic Tac Toe board. Interaction is achieved by reading the mouse location and button status.

Manit explains the testing procedures used in developing the program.

I ran several tests on this game, first I played like a novice and saw if the computer could actually win, this test proved to be successful. Then gradually I improved my level of play and saw whether the computer could block of corner tricks etc.

Another test I ran was I played each square and saw whether the computer would play the square it was supposed to, this was tedious but it was a must I also tested for the clicking function. This proved to me a major head ache because I had changed the origin so it proved to be a bit tricky as the co-ordinates of the board and mouse were different. In the end it worked out.

Start Terrapin Logo, and load them into workspace or into an editor and use Edit/Define to define them into workspace. Alternately, open an editor, and paste the procedures into the editor. Then define the procedures with Edit/Define. Type TICTACTOE to begin and see if you can beat the strategy Manit developed for the computer player!

#### TicTacToe.lgo

```
TO CLICK1
PU
SETXY MOUSE
IF (AND (AND 50 <= XCOR XCOR <= 150) (AND -50 <= YCOR YCOR <= 50)) [DRAW.X]
IF (AND (AND -50 <= XCOR XCOR <= 50) (AND 50 <= YCOR YCOR <= 150)) [DRAW.X11]
IF (AND (AND 50 <= XCOR XCOR <= 150) (AND 50 <= YCOR YCOR <= 150)) [DRAW.X12]
IF (AND (AND 150 <= XCOR XCOR <= 250) (AND 50 <= YCOR YCOR <= 150)) [DRAW.X13]
IF (AND (AND -50 <= XCOR XCOR <= 50) (AND -50 <= YCOR YCOR <= 50)) [DRAW.X01]
IF (AND (AND 150 <= XCOR XCOR <= 250) (AND -50 <= YCOR YCOR <= 50)) [DRAW.X03]
IF (AND (AND -50 <= XCOR XCOR <= 50) (AND -150 <= YCOR YCOR <= -50)) [DRAW.XB1]
IF (AND (AND 50 <= XCOR XCOR <= 150) (AND -150 <= YCOR YCOR <= -50)) [DRAW.XB2]
IF (AND (AND 150 <= XCOR XCOR <= 250) (AND -150 <= YCOR YCOR <= -50)) [DRAW.XB3]
END
TO POINT
IF BUTTON? [PU SETXY MOUSE PD STOP]
POINT
END
TO GETTIME
PU SETXY [300 100] HT PD SETPC 0
MAKE "T TIME
SETFONT "TIME 14 1
TT :T WAIT 1000
SETPC 15 (STAMPOVAL 100 30 "TRUE)
GETTIME
END
TO O11
MAKE "A1 "2
MAKE "CM "0
PU
SETPOS [-50 100]
PD
STAMPOVAL 50 50
END
TO O12
MAKE "A2 "2
MAKE "CM "0
PU
SETPOS [50 100]
PD
STAMPOVAL 50 50
END
TO O21
MAKE "A4 "2
MAKE "CM "0
PU
SETPOS [-50 0]
PD
STAMPOVAL 50 50
END
TO O13
MAKE "A3 "2
MAKE "CM "0
PU
SETPOS [150 100]
PD
STAMPOVAL 50 50
PD
END
TO O23
MAKE "A6 "2
MAKE "CM "0
PU
SETPOS [150 0]
PD
STAMPOVAL 50 50
END
TO O31
MAKE "A7 "2
MAKE "CM "0
PU
SETPOS [-50 -100]
PD
STAMPOVAL 50 50
END
TO O32
MAKE "A8 "2
MAKE "CM "0
PU
SETPOS [50 -100]
PD
STAMPOVAL 50 50
END
TO O33
MAKE "A9 "2
MAKE "CM "0
PU
SETPOS [150 -100]
PD
STAMPOVAL 50 50
END
TO CHECKSQUARE
CLEARTEXT
IF :A1 = 1 THEN PR [SQUARE 1]
IF :A2 = 1 THEN PR [SQUARE 2]
IF :A3 = 1 THEN PR [SQUARE 3]
IF :A4 = 1 THEN PR [SQUARE 4]
IF :A5 = 1 THEN PR [SQUARE 5]
IF :A6 = 1 THEN PR [SQUARE 6]
IF :A7 = 1 THEN PR [SQUARE 7]
IF :A8 = 1 THEN PR [SQUARE 8]
IF :A9 = 1 THEN PR [SQUARE 9]
END
TO DRAW.O
PU
SETPOS [51 0]
PD
STAMPOVAL 50 50
END
TO DRAW.X
PU
SETPOS [50 0]
PD
SETHEADING 45 FD 70 BK 140 SETPOS [51 0] LT 90 FD 70 BK 140
MAKE "A5 "1
END
TO RESETBOARD
MAKE "A1 "0
MAKE "A2 "0
MAKE "A3 "0
MAKE "A4 "0
MAKE "A5 "0
MAKE "A6 "0
MAKE "A7 "0
MAKE "A8 "0
MAKE "A9 "0
END
TO SHOWRESULT
PR [WHAT IS GOING ON?? ! YOU HAVE BEEN BEATEN ME ! !]
TOPLEVEL
END
TO BOARD
HT
CS
SETBG "YELLOW
PU
SETORIGIN [50 0]
HOME
PD
FD 150
BK 150
BK 150
FD 150
BK 50
LT 90
FD 100
BK 100
RT 90
FD 100
RT 90
RT 180
FD 100
BK 200
RT 90
FD 100
BK 300
FD 100
LT 90
RT 180
FD 100
BK 200
FD 100
BK 100
LT 90
FD 100 RT 90 FD 200
PU
SETPOS [-540 150]
PD
SETFONT "TIMES 14 1
SETPC "BLACK
TT [YOU ARE NOW FACING THE IMPOSSIBLE]
PU
HOME
CLEARTEXT
RESETBOARD
MAKEMOVE
WAIT 200
COMPUTERSMOVE
MAKEMOVE
WAIT 200
COMPUTERSMOVE
MAKEMOVE
WAIT 200
COMPUTERSMOVE
MAKEMOVE
WAIT 200
COMPUTERSMOVE
MAKEMOVE
WAIT 200
COMPUTERSMOVE
MAKEMOVE
END
TO CLICK
PU
SETXY MOUSE
IF (AND (AND 50 <= XCOR XCOR <= 150) (AND -50 <= YCOR YCOR <= 50)) [DRAW.X]
IF (AND (AND -50 <= XCOR XCOR <= 50) (AND 50 <= YCOR YCOR <= 150)) [DRAW.X11]
IF (AND (AND 50 <= XCOR XCOR <= 150) (AND 50 <= YCOR YCOR <= 150)) [DRAW.X12]
IF (AND (AND 150 <= XCOR XCOR <= 250) (AND 50 <= YCOR YCOR <= 150)) [DRAW.X13]
IF (AND (AND -50 <= XCOR XCOR <= 50) (AND -50 <= YCOR YCOR <= 50)) [DRAW.X01]
IF (AND (AND 150 <= XCOR XCOR <= 250) (AND -50 <= YCOR YCOR <= 50)) [DRAW.X03]
IF (AND (AND -50 <= XCOR XCOR <= 50) (AND -150 <= YCOR YCOR <= -50)) [DRAW.XB1]
IF (AND (AND 50 <= XCOR XCOR <= 150) (AND -150 <= YCOR YCOR <= -50)) [DRAW.XB2]
IF (AND (AND 150 <= XCOR XCOR <= 250) (AND -150 <= YCOR YCOR <= -50)) [DRAW.XB3]
END
TO COMPUTERSMOVE
MAKE "CM "1
IF (AND (AND :A1 = 2 :A2 = 2) (AND :A3 = 0 :CM = 1)) [O13]
IF (AND (AND :A1 = 2 :A2 = 0) (AND :A3 = 2 :CM = 1)) [O12]
IF (AND (AND :A1 = 0 :A2 = 2) (AND :A3 = 2 :CM = 1)) [O11]
IF (AND (AND :A4 = 2 :A5 = 2) (AND :A6 = 0 :CM = 1)) [O23]
IF (AND (AND :A4 = 2 :A5 = 0) (AND :A6 = 2 :CM = 1)) [OCENTRE]
IF (AND (AND :A4 = 0 :A5 = 1) (AND :A6 = 2) :CM = 1) [O21]
IF (AND (AND :A7 = 2 :A8 = 2) (AND :A9 = 0 :CM = 1)) [O33]
IF (AND (AND :A7 = 2 :A7 = 0) (AND :A9 = 2 :CM = 1)) [O32]
IF (AND (AND :A7 = 0 :A8 = 2) (AND :A9 = 2 :CM = 1)) [O31]
IF (AND (AND :A1 = 0 :A4 = 2) (AND :A7 = 2 :CM = 1)) [O11]
IF (AND (AND :A1 = 2 :A4 = 2) (AND :A7 = 0 :CM = 1)) [O31]
IF (AND (AND :A1 = 2 :A4 = 2) (AND :A7 = 0 :CM = 1)) [O21]
IF (AND (AND :A2 = 0 :A5 = 2) (AND :A8 = 2 :CM = 1)) [O12]
IF (AND (AND :A2 = 2 :A5 = 0) (AND :A8 = 2 :CM = 1)) [OCENTRE]
IF (AND (AND :A2 = 2 :A5 = 2) (AND :A8 = 0 :CM = 1)) [O32]
IF (AND (AND :A3 = 0 :A6 = 2) (AND :A9 = 2 :CM = 1)) [O13]
IF (AND (AND :A3 = 2 :A6 = 0) (AND :A9 = 2 :CM = 1)) [O23]
IF (AND (AND :A3 = 2 :A6 = 2) (AND :A9 = 0 :CM = 1)) [O33]
IF (AND (AND :A1 = 0 :A5 = 2) (AND :A9 = 2 :CM = 1)) [O11]
IF (AND (AND :A1 = 2 :A5 = 0) (AND :A9 = 2 :CM = 1)) [OCENTRE]
IF (AND (AND :A1 = 2 :A5 = 2) (AND :A9 = 0 :CM = 1)) [O33]
IF (AND (AND :A3 = 0 :A5 = 2) (AND :A7 = 2 :CM = 1)) [O13]
IF (AND (AND :A3 = 2 :A5 = 0) (AND :A7 = 2 :CM = 1)) [OCENTRE]
IF (AND (AND :A3 = 2 :A5 = 2) (AND :A7 = 0 :CM = 1)) [O31]
IF (AND (AND :A1 = 1 :A2 = 1) (AND :A3 = 0 :CM = 1)) [O13]
IF (AND (AND :A1 = 1 :A2 = 0) (AND :A3 = 1 :CM = 1)) [O12]
IF (AND (AND :A1 = 0 :A2 = 1) (AND :A3 = 1 :CM = 1)) [O11]
IF (AND (AND :A4 = 1 :A5 = 1) (AND :A6 = 0 :CM = 1)) [O23]
IF (AND (AND :A4 = 1 :A5 = 0) (AND :A6 = 1 :CM = 1)) [OCENTRE]
IF (AND (AND :A4 = 0 :A5 = 1) (AND :A6 = 1) :CM = 1) [O21]
IF (AND (AND :A7 = 1 :A8 = 1) (AND :A9 = 0 :CM = 1)) [O33]
IF (AND (AND :A7 = 1 :A7 = 0) (AND :A9 = 1 :CM = 1)) [O32]
IF (AND (AND :A7 = 0 :A8 = 1) (AND :A9 = 1 :CM = 1)) [O31]
IF (AND (AND :A1 = 0 :A4 = 1) (AND :A7 = 1 :CM = 1)) [O11]
IF (AND (AND :A1 = 1 :A4 = 0) (AND :A7 = 1 :CM = 1)) [O21]
IF (AND (AND :A1 = 1 :A4 = 1) (AND :A7 = 0 :CM = 1)) [O31]
IF (AND (AND :A2 = 0 :A5 = 1) (AND :A8 = 1 :CM = 1)) [O12]
IF (AND (AND :A2 = 1 :A5 = 0) (AND :A8 = 1 :CM = 1)) [OCENTRE]
IF (AND (AND :A2 = 1 :A5 = 1) (AND :A8 = 0 :CM = 1)) [O32]
IF (AND (AND :A3 = 0 :A6 = 1) (AND :A9 = 1 :CM = 1)) [O13]
IF (AND (AND :A3 = 1 :A6 = 0) (AND :A9 = 1 :CM = 1)) [O23]
IF (AND (AND :A3 = 1 :A6 = 1) (AND :A9 = 0 :CM = 1)) [O33]
IF (AND (AND :A1 = 0 :A5 = 1) (AND :A9 = 1 :CM = 1)) [O11]
IF (AND (AND :A1 = 1 :A5 = 0) (AND :A9 = 1 :CM = 1)) [OCENTRE]
IF (AND (AND :A5 = 1 :A5 = 1) (AND :A9 = 0 :CM = 1)) [O33]
IF (AND (AND :A3 = 0 :A5 = 1) (AND :A7 = 1 :CM = 1)) [O13]
IF (AND (AND :A3 = 1 :A5 = 0) (AND :A7 = 1 :CM = 1)) [OCENTRE]
IF (AND (AND :A3 = 1 :A5 = 1) (AND :A7 = 0 :CM = 1)) [O31]
IF (AND :A5 = 0 :CM = 1) [OCENTRE]
IF (AND (AND :A1 = 1 :A9 = 1) (AND :A2 = 0 :CM = 1)) [O12]
IF (AND (AND :A1 = 1 :A9 = 1) (AND :A4 = 0 :CM = 1)) [O21]
IF (AND (AND :A1 = 1 :A9 = 1) (AND :A6 = 0 :CM = 1)) [O23]
IF (AND (AND :A1 = 1 :A9 = 1) (AND :A8 = 0 :CM = 1)) [O32]
IF (AND (AND :A3 = 1 :A7 = 1) (AND :A2 = 0 :CM = 1)) [O12]
IF (AND (AND :A3 = 1 :A7 = 1) (AND :A4 = 0 :CM = 1)) [O21]
IF (AND (AND :A3 = 1 :A7 = 1) (AND :A6 = 0 :CM = 1)) [O23]
IF (AND (AND :A3 = 1 :A7 = 1) (AND :A8 = 0 :CM = 1)) [O32]
IF (AND :A1 = 0 :CM = 1) [O11]
IF (AND :A3 = 0 :CM = 1) [O13]
IF (AND :A7 = 0 :CM = 1) [O31]
IF (AND :A9 = 0 :CM = 1) [O33]
IF (AND :A2 = 0 :CM = 1) [O12]
IF (AND :A4 = 0 :CM = 1) [O21]
IF (AND :A6 = 0 :CM = 1) [O24]
IF (AND :A8 = 0 :CM = 1) [O32]
IF (:CM = 1) [RESULTDRAW]
END
TO SELECT.ICON
POINT
WAIT 50
CLICK
END
TO TC
CS
PU
FD 100 SETPC 12 PD
(STAMPOVAL 20 20 "TRUE)
PU HOME
MOVECONTROL
END
TO DRAW.X01
PU
SETPOS [0 50]
PD
SETHEADING 225
FD 140 BK 70
RT 90
FD 70 BK 140
MAKE "A4 "1
END
TO MOVECONTROL
MAKE "K RC
IF :K = CHAR 193 FD 5
IF :K = CHAR 194 BK 5
IF :K = "Q [PR [OVER] WAIT CS STOP]
IF :K = CHAR 196 RT 10
IF :K = CHAR 195 LT 10
MAKE "C BASECOLOR (DOTCOLOR)
IF :C = 12 [PR [COLLISION] HOME SETPC "BLACK STOP]
MOVECONTROL
END
TO DRAW.X03
MAKE "A6 "1
PU
SETPOS [100 50]
PD
SETHEADING 135
FD 140
BK 70
LT 90
FD 70 BK 140
END
TO DRAW.X11
MAKE "A1 "1
PU SETPOS [0 50]
SETHEADING 0
PD
LT 45
FD 140
BK 70
RT 90
FD 70 BK 140
END
TO DRAW.X12
MAKE "A2 "1
PU SETPOS [0 50]
SETHEADING 90
PD
LT 45
FD 140
BK 70
RT 90
FD 70 BK 140
END
TO MAKEMOVE
CHECKRESULT
SELECT.ICON
CHECKSQUARE
END
TO DRAW.X13
MAKE "A3 "1
PU
SETPOS [100 50]
PD
SETHEADING 45
FD 140
BK 70
RT 90 FD 70 BK 140
END
TO OCENTRE
MAKE "A5 "2
MAKE "CM "0
PU
SETPOS [50 0]
PD
STAMPOVAL 50 50
END
TO DRAW.XB1
PU
MAKE "A7 "1
SETPOS [0 -50]
PD
SETHEADING 225
FD 140
BK 70
RT 90
FD 70 BK 140
END
TO DRAW.XB2
MAKE "A8 "1
PU
SETPOS [0 -50]
SETHEADING 135
PD
FD 140 BK 70
LT 90
FD 70 BK 140
END
TO DRAW.XB3
MAKE "A9 "1
PU
SETPOS [100 -50]
SETHEADING 135
PD
FD 140
BK 70
LT 90
FD 70
BK 140
END
TO CHECKRESULT
IF (AND (AND :A1 = 1 :A2 = 1) (:A3 = 1)) [SHOWRESULT]
IF (AND (AND :A4 = 1 :A5 = 1) (:A6 = 1)) [SHOWRESULT]
IF (AND (AND :A7 = 1 :A8 = 1) (:A9 = 1)) [SHOWRESULT]
IF (AND (AND :A1 = 1 :A4 = 1) (:A7 = 1)) [SHOWRESULT]
IF (AND (AND :A2 = 1 :A5 = 1) (:A8 = 1)) [SHOWRESULT]
IF (AND (AND :A3 = 1 :A6 = 1) (:A9 = 1)) [SHOWRESULT]
IF (AND (AND :A1 = 1 :A5 = 1) (:A9 = 1)) [SHOWRESULT]
IF (AND (AND :A3 = 1 :A5 = 1) (:A7 = 1)) [SHOWRESULT]
IF (AND (AND :A1 = 2 :A2 = 2) (:A3 = 2)) [SHOWLIKELYRESULT]
IF (AND (AND :A4 = 2 :A5 = 2) (:A6 = 2)) [SHOWLIKELYRESULT]
IF (AND (AND :A7 = 2 :A8 = 2) (:A9 = 2)) [SHOWLIKELYRESULT]
IF (AND (AND :A1 = 2 :A4 = 2) (:A7 = 2)) [SHOWLIKELYRESULT]
IF (AND (AND :A2 = 2 :A5 = 2) (:A8 = 2)) [SHOWLIKELYRESULT]
IF (AND (AND :A3 = 2 :A6 = 2) (:A9 = 2)) [SHOWLIKELYRESULT]
IF (AND (AND :A1 = 2 :A5 = 2) (:A9 = 2)) [SHOWLIKELYRESULT]
IF (AND (AND :A3 = 2 :A5 = 2) (:A7 = 2)) [SHOWLIKELYRESULT]
END
TO TICTACTOE
CS
SETBG "GREEN
PU
SETPOS [-100 100]
PD
SETFONT "TIMES 32 1
SETPC "WHITE
TT [TIC TAC TOE]
PU
SETPOS [-175 50]
SETPC "BLACK
PD
TT [BY MANIT BHARANY]
PU SETPOS [-350 0]
PD
SETFONT "TIMES 14 1
SETPC "AQUA
TT [1. IT IS A ONE PLAYER GAME 2. PLACE YOUR BET AT THE START GAME]
PU SETPOS [-530 -25]
PD
SETFONT "TIMES 13 1
TT [3. IF YOU WIN YOU DOUBLE YOUR MONEY, IF YOU LOSE YOU LOSE YOUR MONEY AND IF YOU DRAW YOU GET YOUR MONEY BACK]
PU SETPOS [-560 -50]
PD
TT [4.THE PLAYER ALWAYS STARTS FIRST,THEN THE COMPUTER,THEN THE PLAYER AND SO ON.IN OTHER WORDS TAKE TURNS ALTERNATELY]
PU SETPOS [-425 -75]
PD
TT [5. YOU CAN PLACE YOUR SHAPE ANYWHERE ON THE GRID AS LONG AS THE SQUARE IS NOT OCCUPIED]
PU SETPOS [-375 -100]
PD
TT [6. THE GAME IS WON IF EITHER THE COMPUTER OR THE PLAYER FORMS A STRAIGHT LINE]
PU SETPOS [-275 -125]
PD
TT [IF NONE MANAGE TO DO SO THE GAME IS DEEMED TO BE A DRAW.]
PU SETPOS [-125 -175]
PD
SETFONT "TIMES 26 1
SETPC "BLACK
TT [HIT X TO BEGIN]
LABEL "START
MAKE "BEGIN RC
IF :BEGIN = "X BOARD
GO "START
END
TO SHOWLIKELYRESULT
PR [HEH HEH HEH WHAT IS GOING ON?? ! YOU HAVE BEEN BEATEN ! !]
TOPLEVEL
END
TO RESULTDRAW
PR [THIS MATCH ENDS IN A DRAW]
TOPLEVEL
END
MAKE "C "0
MAKE "K "Q
MAKE "T [13 44 14]
MAKE "BEGIN "X
MAKE "A1 "1
MAKE "A2 "1
MAKE "A3 "2
MAKE "A4 "2
MAKE "A5 "1
MAKE "A6 "1
MAKE "A7 "1
MAKE "A8 "2
MAKE "A9 "2
MAKE "CM "1
MAKE "|A1"| "0
```

- Procedure: TICTACTOE
- Description: Play Tic Tac Toe against the computer
- Level: Intermediate
- Tags: Game, Tic Tac Toe