Tic-Tac-Toe (WIDJUP)

Developer(s): William J. Pedersen
Date: 1982
Type: Program
Platform(s): TS 2068
Tags: Game

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 BIN literals, 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.

Related Content

Image Gallery

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: STOP

Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.