This Tic-Tac-Toe plays a straight game of noughts and crosses, but the computer has a personality. It wakes up grumbling (“HUH? … Can’t I get a little rest?”), agrees to play “that stupid game”, explains how the board is numbered, and makes asides about organic units while you type the square for your X. It keeps count of games won and drawn (“cat” games), and cat graphics (the “PUSSYPUSS” characters) decorate the screens.
The program credits “Copyright 1972 (FORTRAN) / Copyright 1982 (BASIC) / William J. Pedersen”. It came from TTSUC library disk L-43, a collection of Pedersen’s WIDJUP programs; a copy on the WIDJUP issue of the UPDATE magazine disk is damaged.
Program Analysis
Structure
Lines 500 onward define the user-defined graphics from DATA BIN ... lines. The move tables are held in the program’s saved variables, and line 3500 is the author’s own save-and-verify routine for the program.
Notable Techniques
- The graphics are defined in binary with
BINliterals, so the bit patterns can be read in the listing. - Pauses between the computer’s remarks are timed so the dialogue reads like a reluctant opponent.
This copy came from a Larken disk; it needed no changes for tape apart from its name. It was tested in ZEsarUX: the opening dialogue and the start of a game work.
Source Code
500 REM PUSSYPUSS
501 RESTORE 501: DATA BIN 0,BIN 11,BIN 1,BIN 1,BIN 1,BIN 1,BIN 10000000,BIN 1000000
502 DATA BIN 0,BIN 0,BIN 10000000,BIN 1000000,BIN 100111,BIN 11000,BIN 10100000,BIN 1000000
503 DATA BIN 0,BIN 1,BIN 11,BIN 101,BIN 11001001,BIN 110001,BIN 1010,BIN 100
504 DATA BIN 0,BIN 10000000,BIN 0,BIN 0,BIN 0,BIN 0,BIN 10,BIN 100
505 DATA BIN 100000,BIN 10000,BIN 1000,BIN 100,BIN 10,BIN 10000001,BIN 1100010,BIN 11010
506 DATA BIN 10000000,BIN 10011100,BIN 10101010,BIN 10001000,BIN 10001000,BIN 0,BIN 10000011,BIN 1
507 DATA BIN 10,BIN 1110010,BIN 10101010,BIN 100010,BIN 100010, BIN 1,BIN 10000010,BIN 0
508 DATA BIN 1000,BIN 10000,BIN 100000,BIN 1000000,BIN 10000000,BIN 11,BIN 10001100,BIN 10110000
509 DATA BIN 110,BIN 101,BIN 1100,BIN 110010,BIN 11000001,BIN 0,BIN 0,BIN 0
510 DATA BIN 1,BIN 100000,BIN 11000,BIN 111,BIN 10000000,BIN 1110000,BIN 1000,BIN 111
511 DATA BIN 0,BIN 1001,BIN 110000,BIN 11000000,BIN 11,BIN 11100,BIN 100000,BIN 11000000
512 DATA BIN 11000000,BIN 1000000,BIN 1100000,BIN 10011000,BIN 110,BIN 1,BIN 0,BIN 0
515 FOR N=0 TO 95: READ A: POKE USR "a"+N,A: NEXT N
520 REM PRINT '''" abcd"'" efgh"'" ijkl"
600 RANDOMIZE : PRINT AT 15,0;" PRESS ANY KEY. ": PAUSE 0: LET Nwon=0: LET Ncat=0
1000 REM TIC-TAC-TOE
1010 REM PROLOGUE Part I
1020 BORDER 0: PAPER 0: CLS : PAUSE 240: PRINT INK 7;''''" HUH? ";: PAUSE 60: PRINT INK 7;" What's that?"'': PAUSE 120: PRINT INK 7;" Can't I get a little rest?"'': PAUSE 240: PRINT INK 7;" Oh, it's some idiot hammering at the keyboard."''''TAB 6;: PAUSE 300: PRINT INK 7; FLASH 1;" GO AWAY! "
1030 PAUSE 600: PAPER 7: CLS : INK 0: PRINT ''" The idiot is still there.": PAUSE 60: PRINT '" He wants to play.";: PAUSE 180: PRINT " How sweet.": PAUSE 240: PRINT '" It computes. That stupid game"''TAB 6;"TIC-TAC-TOE."'': PAUSE 120: PRINT " I suppose I must humor him."
1040 BORDER 6: PAUSE 240: CLS : LET D=80: LET E=30: GO SUB 4000: GO SUB 5000: PRINT AT 15,11; INK 1;"X";AT 20,0; INK 0;"It's your move."
1998 PAUSE 1200
1999 REM PROLOGUE Part II
2000 CLS : PRINT " Oh?....You don't know how?..andyou want the first move?"' INK 5'" (*?*@#! What I have to...)"' INK 4'"NOW HEAR THIS! I don't flash mytransistors twice."' INK 2'"YOU'LL BE ""X""."; INK 1;" I'LL BE ""O""."
2010 PRINT '"The arena is laid out like this:"'''TAB 8;"A1 A2 A3"''TAB 8;"B1 B2 B3"''TAB 8;"C1 C2 C3"''
2015 LET D=83: LET E=30: GO SUB 4000: LET MXTP=INT (8*RND)+1: LET GHOST=MXTP
2060 PRINT AT 19,0;" Just type in where you want the ""X"". Then press ENTER.": PAUSE 1200
2070 CLS : PRINT INK 5'''''''"(Organic units are so helpless.)": LET H$=" If this blob thinks it's going to win, it's bonkers! "
2080 FOR N=1 TO 68: PRINT PAPER 5; INK 2;AT 11,6;H$(N TO N+12): PAUSE 8: NEXT N: PRINT AT 11,0;,,
2100 REM INITIALIZATION
2105 LET D=80: LET E=30: GO SUB 5000
2110 PRINT AT 10,0,,,,,,,,,,,,,,,,,,,,,,
2111 GO SUB 4000: GO SUB 5050: LET NOW=1: FOR N=1 TO 3: FOR K=1 TO 3: LET G$(N,K,2)=B$(MXTP,3*N+K-3): LET G$(N,K,1)=" ": NEXT K: NEXT N
2499 REM ACCEPT INPUT
2500 PRINT AT 20,0;"It's your move.",,: REM AT 12,1;GHOST;",";MXTP: FOR N=1 TO 3: FOR K=1 TO 3: PRINT AT 13+N,K;G$(N,K,2);: NEXT K: NEXT N
2504 INPUT LINE H$: IF LEN H$<2 THEN GO TO 3200
2509 REM WRONG KEYS
2510 IF H$(1)<"A" OR H$(1)>"C" OR H$(2)<"1" OR H$(2)>"3" THEN GO TO 3210
2514 REM WRONG PLAY
2515 LET Row=CODE H$(1)-64: LET Col=VAL H$(2)
2517 LET H$=G$(Row,Col,1): IF H$<>" " THEN GO TO 3225
2530 LET Spot=VAL G$(Row,Col,2)
2540 PRINT AT 10,20,AT 20,0,,
2600 REM condenser
2610 FOR m=1 TO 9: LET C(m)=0: NEXT m
2620 FOR m=1 TO 3: FOR n=1 TO 3: LET H$=G$(n,m,1): IF H$<>" " THEN GO TO 2640
2630 LET It=VAL G$(n,m,2): LET C(It)=It
2640 NEXT n: NEXT m
2645 LET G$(Row,Col,1)="X": PRINT AT 11+2*Row,5+3*Col; INK 2;"X"
2660 LET It=0: FOR m=1 TO 9: IF C(m)<>0 THEN LET C(m-It)=C(m): GO TO 2680
2670 LET It=It+1
2680 NEXT m
2690 FOR n=1 TO 9: IF C(n)=Spot THEN LET Image=n-1: GO TO 2695
2691 NEXT n
2693 REM DECODE
2695 LET MXOO=CODE S$(NOW+Image,1)
2696 LET MXTT=CODE S$(NOW+Image,2): IF MXTT=0 THEN LET MXTT=1
2697 LET MXPP=CODE S$(NOW+Image,3)
2698 LET MODE=CODE S$(NOW+Image,4)
2699 REM PRINT AT 1,0;"MXTP=";MXTP'"NOW =";NOW;" "'"IMAG=";IMAGE'"S$(";NOW+IMAGE;") "'"MXOO=";MXOO'"MXTT=";MXTT'"MXPP=";MXPP;" "'"MODE=";MODE;" "
2700 LET NOW=MXPP
2705 REM WRITE
2710 GO SUB 5050: FOR m=1 TO 3: FOR n=1 TO 3: IF VAL G$(n,m,2)=MXOO THEN LET G$(n,m,1)="O": PRINT AT 11+2*n,5+3*m; INK 1;"O"
2720 NEXT n: NEXT m
2800 LET MXTP=GHOST: LET GHOST=VAL T$(MXTT,MXTP)
2810 FOR m=1 TO 3: FOR n=1 TO 3: LET G$(m,n,2)=B$(GHOST,3*m+n-3): NEXT n: NEXT m
2900 REM MODEX Part I
2910 GO TO 2920+10*MODE
2920 GO TO 2500
2930 PRINT AT 10,20; INK 4;"Nice play.",: GO TO 2500
2940 PRINT AT 10,20; INK 1;" DUMB!",: GO TO 2500
2950 PRINT AT 10,20; INK 1;"Ha! Ha! Ha!",: GO TO 2500
2960 PRINT INK 6;AT 12,22;"abcd";AT 13,22;"efgh";AT 14,22;"ijkl": GO TO 2500
2980 PRINT INK 6-MODE;AT 12,22;"abcd";AT 13,22;"efgh";AT 14,22;"ijkl"
2985 LET Ncat=Ncat+1: PRINT AT 20,0,AT 10,20;"Cat's game.",: GO TO 3095
3020 RESTORE 3020: DATA "3","9","7": GO SUB 3600: GO TO 3091
3030 RESTORE 3030: DATA "1","9","5": GO SUB 3600: GO TO 3091
3040 RESTORE 3030: DATA "1","8","7": GO SUB 3600: GO TO 3091
3050 RESTORE 3050: DATA "2","9","6": GO SUB 3600: GO TO 3091
3060 RESTORE 3060: DATA "3","4","5": GO SUB 3600: GO TO 3091
3070 RESTORE 3070: DATA "1","2","3": GO SUB 3600: GO TO 3091
3080 RESTORE 3080: DATA "8","9","4": GO SUB 3600: GO TO 3091
3090 RESTORE 3090: DATA "5","6","7": GO SUB 3600
3091 LET Nwon=Nwon+1: PRINT AT 10,20;"I win.",''TAB 20;"You lose."
3092 BEEP .7,1: PAUSE 6: BEEP .5,1: PAUSE 6: BEEP .1,1: PAUSE 6: BEEP .7,1: PAUSE 6: BEEP .5,4: PAUSE 6: BEEP .1,3: PAUSE 6
3093 BEEP .5,3: PAUSE 6: BEEP .1,1: PAUSE 6: BEEP .5,1: PAUSE 6: BEEP .1,0: PAUSE 6: BEEP 1,1
3095 PRINT PAPER 6;AT 16,18;"Kitty got ";Ncat,AT 17,18;" !I! won ";Nwon,AT 18,18;" You won "; FLASH 1;" 0 "; FLASH 0;" "
3100 PRINT AT 20,0;"Try again?",,
3102 INPUT "Yes or No? "; LINE H$
3104 IF LEN H$ THEN IF (H$(1)="y" OR H$(1)="Y") THEN GO TO 2110
3109 CLS : PRINT AT 12,4;"Have a nice day."''" (So I can get back to sleep.)": PAUSE 360: BORDER 0: PAPER 0: CLS : PAUSE 600: INK 0: PAPER 7: BORDER 7: CLS
3110 PRINT '''"Copyright 1972 (FORTRAN)"'"Copyright 1982 (BASIC)"'"William J. Pedersen"
3111 PRINT ' " This version of an old favoriteis unique in several ways."'" It uses matrix operations as a strategy solving method. This permits the computer response to be somewhat unpredictable andmore variations in the play."
3112 PRINT '" Side 2 of this cassette has an explanation of what makes this program tick. Those of you who are mathematically inclined willfind it interesting. It also provides tips on how to make theprograms you write entertaining." : STOP : CLS : GO TO 2100
3200 PRINT AT 20,0,;"WHERE?",: BEEP 2,-6: GO TO 2500
3210 PRINT AT 20,0;: GO SUB (3211+INT (10*RND)): BEEP 3,-8: GO TO 2500
3211 PRINT " My God! Where is ";H$;"?",: RETURN
3212 PRINT " Cool, man. ";H$;" Real cool.",: RETURN
3213 PRINT " ";H$;"? Well - nobody's rpefetc. ",: RETURN
3214 PRINT " What game you playin'? ";H$;" ^",: RETURN
3215 PRINT " ";H$;" is a bummer. ",: RETURN
3216 PRINT " ";H$;" Is that your IQ? ",: RETURN
3217 PRINT " Ha Ha ";H$;" Ooh Ha Ha ",: RETURN
3218 PRINT " You found it! The ";H$;" key.",: RETURN
3219 PRINT " I saw a frog eat a ";H$;" once.",: RETURN
3220 PRINT " Have you tried the CAPS LOCK?": PAUSE 300: RETURN
3225 PRINT AT 20,0;: GO SUB (3226+INT (5*RND)): BEEP 3,-7: GO TO 2500
3226 PRINT " Goody! Right on top of an ";H$;".",: RETURN
3227 PRINT " Isn't there an ";H$;" there?",: RETURN
3228 PRINT " Don't be silly. An ";H$;" is there.",: RETURN
3229 PRINT " Add an ";H$;". Stir briskly.",: RETURN
3230 PRINT " You really want X";CHR$ 8; OVER 1;"O?", OVER 0: RETURN
3500 CLS : PRINT ''"Saving program TIC-TAC-TOE.": SAVE "TTT" LINE 1: PRINT "Program TIC-TAC-TOE is saved.",,,"Continue to VERIFY.": STOP : PRINT "VERIFYING.": VERIFY "": PRINT "VERIFIED.": STOP
3600 REM SLASH
3601 FOR l=1 TO 3: READ W$: FOR m=1 TO 3: FOR n=1 TO 3: IF G$(n,m,2)=W$ THEN PRINT AT 11+2*n,5+3*m; FLASH 1; INK 1;"O"
3602 NEXT n: NEXT m: NEXT l: RETURN
4000 REM DRAW #
4020 PLOT D,E: DRAW 0,43
4030 PLOT D+24,E: DRAW 0,43
4040 PLOT D-22,E+14: DRAW 68,0
4050 PLOT D-22,E+30: DRAW 68,0
4060 RETURN
5000 REM BUSY COMPUTER
5001 PRINT AT 0,0; PAPER 5,,,TAB 11; PAPER 2; INK 6;" "; PAPER 5,,TAB 12; INK 0; PAPER 6;":::::"; PAPER 5,,,,,,,,,
5002 PLOT 0,103: DRAW 255,0
5003 INK 1: PLOT 32,105: DRAW 46,0: DRAW 0,65: DRAW -46,0: DRAW 0,-65: PLOT 33,106: DRAW 44,0: DRAW 0,63: DRAW -44,0: DRAW 0,-63
5004 PLOT 152,105: DRAW 46,0: DRAW 0,65: DRAW -46,0: DRAW 0,-65: PLOT 153,106: DRAW 44,0: DRAW 0,63: DRAW -44,0: DRAW 0,-63
5005 INK 2: CIRCLE 55,152,12: CIRCLE 175,152,12
5006 CIRCLE 55,124,12: CIRCLE 175,124,12
5007 INK 0: CIRCLE 55,152,3: CIRCLE 55,152,2: CIRCLE 175,152,3: CIRCLE 175,152,2
5008 INK 0: CIRCLE 55,124,3: CIRCLE 55,124,2: CIRCLE 175,124,3: CIRCLE 175,124,2
5009 INK 4: PLOT 80,135: DRAW 71,0
5010 PLOT 80,131: DRAW 71,0: DRAW 0,-1: DRAW -71,0
5011 PLOT 80,167: DRAW 71,0: DRAW 0,-1: DRAW -71,0
5012 INK 0: PLOT 95,136: DRAW 0,7: DRAW 42,0: DRAW 0,-7
5014 FOR J=1 TO 2: GO SUB 5050: NEXT J
5015 INK 0: RETURN
5050 REM OVER 1: FOR N=1 TO 30: PLOT INK 6, PAPER 8,2*INT (27*RND)+89,INT (6*RND)+153: DRAW INK 6, PAPER 8,1,0: BEEP .015,2*INT (10*RND): NEXT N: OVER 0
5100 RETURN
5999 STOP
7000 REM GHOST ARRAY DISPLAY
7005 CLS : PRINT " GHOST ARRAY DISPLAY "
7011 PRINT '"+++ X++ +X+ O++ XXO"'"+++ +O+ +O+ +X+ +O+"'"+++ +++ +++ +++ +++"
7012 PRINT '"XOX XO+ +XO ++X +X+"'"+O+ +O+ XO+ XO+ OO+"'"+++ ++X +++ O++ +X+"
7013 PRINT '"OX+ X+O +X+ XOX XOX"'"+X+ +X+ +X+ XO+ OO+"'"+O+ ++O OO+ O++ +X+"
7014 PRINT '"OXX OXX XXO XOX OXO"'"+O+ XO+ +O+ +O+ XO+"'"XO+ O++ +XO OX+ ++X"
7015 PRINT '"+X+ XXO +XO O+X OX+ X++"'"XOX +X+ XXO XXO XXO OXX"'"OO+ +OO +O+ O++ +O+ O+O"
7500 STOP
8000 FOR N=0 TO 7: PRINT PAPER N;" ";: NEXT N: PRINT '" ";
8005 FOR N=0 TO 7: PRINT PAPER N; BRIGHT 1;" ";: NEXT N: PRINT ': GO TO 8000
9000 REM LET F$="": FOR N=1 TO 96: INPUT "BINARY: ";X: POKE N+65367,X: LET F$=F$+CHR$ X
9010 PRINT AT 4,14;"abcd";TAB 14;"efgh";TAB 14;"ijkl";TAB 0;N
9020 NEXT N
9030 STOP
9900 CLS : FOR m=1 TO 114: PRINT m;TAB 5;: FOR n=1 TO 4: PRINT CODE S$(m,n);" ";: NEXT n: PRINT : NEXT m: STOP
9910 FOR N=1 TO 8: PRINT B$(N),T$(N): NEXT N: STOP
9930 REM LET Z$=B$(6): LET B$(6)=B$(8): LET B$(8)=Z$: STOP
9950 LPRINT " TIC-TAC-TOE Solution Array ": FOR m=1 TO 114: LPRINT m;TAB 5;: FOR n=1 TO 4: LPRINT CODE S$(m,n);" ";: NEXT n: LPRINT TAB 24;2920+10*CODE S$(m,4)
9951 NEXT m: LPRINT " End of Array "'''': STOP
9960 FOR N=1 TO 8: LPRINT B$(N),T$(N): NEXT N: STOPNote: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.


