10 REM ** NOUGHTS & CROSSES ** 20 REM ** Written by J.Smylie ** 30 REM ** v1.0 - 1987 ** 40 REM ** Completely rewritten ** 50 REM ** v2.3 - 19/02/92 ** 60 70 MODE1:DIM P$(9):VDU 23;8202;0;0;0;:VDU19,0,7;0;19,2,7;0;19,3,7;0;:*LOAD $.GRID 80 VDU19,0,7;0;19,2,4;0;19,3,4;0; 90 ONERROR PROCERROR 100 PROCDEFINE:PROCDISPLAYCOUNTERS 110 REPEAT:PROCSHOWMOVE(0):PROCSETUP:gameover=FALSE:PROCSTART:REPEAT 120 IF mygo THEN PROCMYGO ELSE PROCYOURGO 130 PROCTESTGAMEOVER:UNTIL gameover:PROCGAMEOVER:PROCPLAYAGAIN:UNTIL playagain=FALSE 140 FORT=1TO5000:NEXTT:CLS:END 150 DEFPROCSETUP 160 FOR V=7 TO 27 STEP 7:FOR H=6 TO 20 STEP 7:PROCCHARACTER(H,V," "):NEXT:NEXT 170 FOR T=1 TO 9:P$(T)=" ":NEXT T:ENDPROC 180 DEFPROCCHARACTER(H,V,C$) 190 IF C$="X" G1$=X1$:G2$=X2$:G3$=X3$:G4$=X2$:G5$=X1$ 200 IF C$="O" G1$=O1$:G2$=O2$:G3$=O2$:G4$=O2$:G5$=O1$ 210 IF C$=" " G1$=O1$:G2$=O1$:G3$=O1$:G4$=O1$:G5$=O1$ 220 PRINTTAB(H,V);G1$;TAB(H,V+1);G2$;TAB(H,V+2);G3$;TAB(H,V+3);G4$;TAB(H,V+4);G5$:ENDPROC 230 DEFPROCDEFINE 240 VDU 23,224,255,255,255,255,255,255,255,255 250 X1$=CHR$224+" "+CHR$224 260 X2$=" "+CHR$224+" "+CHR$224+" " 270 X3$=" "+CHR$224+" " 280 O1$=CHR$224+CHR$224+CHR$224+CHR$224+CHR$224 290 O2$=CHR$224+" "+CHR$224 300 move=0:yourcounter=0:mycounter=0:ENDPROC 310 ENDPROC 320 DEFPROCYOURGO 330 oldmove=move 340 PRINTTAB(29,12);"COMPUTER":COLOUR130:COLOUR0:PRINTTAB(29,7);"OPPONENT":COLOUR128:COLOUR3 350 REPEAT:REPEAT 360 PRINTTAB(29,26);"Square ?" 370 move=GET:move=move-48:UNTIL move>=1 AND move<=9:UNTIL P$(move)=" ":PRINTTAB(29,26);" " 380 P$(move)=B$:newmove=move:move=oldmove:PROCSHOWMOVE(0):move=newmove 390 PROCCALCULATE:PROCCHARACTER(H,V,B$):mygo=TRUE:ENDPROC 400 DEFPROCMYGO 410 FORT=1TO1000:NEXTT:PRINTTAB(29,7);"OPPONENT":COLOUR130:COLOUR0:PRINTTAB(29,12);"COMPUTER":COLOUR128:COLOUR3 420 PROCSHOWMOVE(0):PROCTHINK:P$(move)=A$:PROCCALCULATE:PROCCHARACTER(H,V,A$):mygo=FALSE:ENDPROC 430 DEFPROCCALCULATE 440 IF move=1 THEN H=6:V=7:H2=31:V2=19 450 IF move=2 THEN H=13:V=7:H2=33:V2=19 460 IF move=3 THEN H=20:V=7:H2=35:V2=19 470 IF move=4 THEN H=6:V=14:H2=31:V2=21 480 IF move=5 THEN H=13:V=14:H2=33:V2=21 490 IF move=6 THEN H=20:V=14:H2=35:V2=21 500 IF move=7 THEN H=6:V=21:H2=31:V2=23 510 IF move=8 THEN H=13:V=21:H2=33:V2=23 520 IF move=9 THEN H=20:V=21:H2=35:V2=23 530 PROCSHOWMOVE(1):ENDPROC 540 DEFPROCTESTGAMEOVER 550 Iwin=FALSE:youwin=FALSE 560 IF P$(1)<>" " AND P$(2)<>" " AND P$(3)<>" " AND P$(4)<>" " AND P$(5)<>" " AND P$(6)<>" " AND P$(7)<>" " AND P$(8)<>" " AND P$(9)<>" " THEN gameover=TRUE 570 IF FNrowof(A$) THEN Iwin=TRUE:youwin=FALSE:gameover=TRUE:mycounter=mycounter+1 580 IF FNrowof(B$) THEN youwin=TRUE:Iwin=FALSE:gameover=TRUE:yourcounter=yourcounter+1 590 ENDPROC 600 DEFPROCGAMEOVER 610 IF Iwin THEN PRINTTAB(29,26);" I WIN!" 620 IF youwin THEN PRINTTAB(29,26);"YOU WIN!" 630 IF Iwin=FALSE AND youwin=FALSE THEN PRINTTAB(29,26);" A DRAW" 640 PROCDISPLAYCOUNTERS:FORT=1TO5000:NEXTT:ENDPROC 650 DEFPROCSTART 660 PRINTTAB(29,26);"I START?";:YN=GET:PRINTTAB(29,26);" " 670 IF YN=78 THEN mygo=FALSE:A$="O":B$="X":ENDPROC 680 mygo=TRUE:A$="X":B$="O":ENDPROC 690 DEFFNrowof(C$) 700 IF FNthree(1,2,3) THEN =TRUE 710 IF FNthree(4,5,6) THEN =TRUE 720 IF FNthree(7,8,9) THEN =TRUE 730 IF FNthree(1,4,7) THEN =TRUE 740 IF FNthree(2,5,8) THEN =TRUE 750 IF FNthree(3,6,9) THEN =TRUE 760 IF FNthree(1,5,9) THEN =TRUE 770 IF FNthree(3,5,7) THEN =TRUE 780 =FALSE 790 DEFFNthree(s1,s2,s3) 800 = (P$(s1)=C$ AND P$(s2)=C$ AND P$(s3)=C$) 810 820 DEFPROCTHINK 830 move=0 840 IFFNtwome(1,2,3) THEN move=3:ENDPROC 850 IFFNtwome(2,3,1) THEN move=1:ENDPROC 860 IFFNtwome(1,4,7) THEN move=7:ENDPROC 870 IFFNtwome(4,7,1) THEN move=1:ENDPROC 880 IFFNtwome(7,8,9) THEN move=9:ENDPROC 890 IFFNtwome(8,9,7) THEN move=7:ENDPROC 900 IFFNtwome(6,9,3) THEN move=3:ENDPROC 910 IFFNtwome(3,6,9) THEN move=9:ENDPROC 920 IFFNtwome(1,5,9) THEN move=9:ENDPROC 930 IFFNtwome(5,9,1) THEN move=1:ENDPROC 940 IFFNtwome(3,5,7) THEN move=7:ENDPROC 950 IFFNtwome(7,5,3) THEN move=3:ENDPROC 960 IFFNtwome(3,9,6) THEN move=6:ENDPROC 970 IFFNtwome(8,5,2) THEN move=2:ENDPROC 980 IFFNtwome(4,5,6) THEN move=6:ENDPROC 990 IFFNtwome(6,5,4) THEN move=4:ENDPROC 1000 IFFNtwome(3,7,5) THEN move=5:ENDPROC 1010 IFFNtwome(1,9,5) THEN move=5:ENDPROC 1020 IFFNtwome(2,8,5) THEN move=5:ENDPROC 1030 IFFNtwome(4,6,5) THEN move=5:ENDPROC 1040 IFFNtwome(1,3,2) THEN move=2:ENDPROC 1050 IFFNtwome(2,5,8) THEN move=8:ENDPROC 1060 IFFNtwome(7,9,8) THEN move=8:ENDPROC 1070 IFFNtwome(1,7,4) THEN move=4:ENDPROC 1080 IFP$(5)=B$ AND P$(1)=" " AND RND(10)<7 THEN move=1:GOTO 1100 1090 IFP$(5)=B$ AND P$(3)=" " AND RND(10)<7 THEN move=3 1100 IFP$(5)=" " AND RND(10)<9 THEN move=5 1110 IFFNtwoyou(1,2,3) THEN move=3 1120 IFFNtwoyou(2,3,1) THEN move=1 1130 IFFNtwoyou(1,4,7) THEN move=7 1140 IFFNtwoyou(4,7,1) THEN move=1 1150 IFFNtwoyou(7,8,9) THEN move=9 1160 IFFNtwoyou(8,9,7) THEN move=7 1170 IFFNtwoyou(6,9,3) THEN move=3 1180 IFFNtwoyou(3,6,9) THEN move=9 1190 IFFNtwoyou(1,5,9) THEN move=9 1200 IFFNtwoyou(5,9,1) THEN move=1 1210 IFFNtwoyou(3,5,7) THEN move=7 1220 IFFNtwoyou(7,5,3) THEN move=3 1230 IFFNtwoyou(3,9,6) THEN move=6 1240 IFFNtwoyou(8,5,2) THEN move=2 1250 IFFNtwoyou(4,5,6) THEN move=6 1260 IFFNtwoyou(6,5,4) THEN move=4 1270 IFFNtwoyou(3,7,5) THEN move=5 1280 IFFNtwoyou(1,9,5) THEN move=5 1290 IFFNtwoyou(2,8,5) THEN move=5 1300 IFFNtwoyou(4,6,5) THEN move=5 1310 IFFNtwoyou(1,3,2) THEN move=2 1320 IFFNtwoyou(2,5,8) THEN move=8 1330 IFFNtwoyou(7,9,8) THEN move=8 1340 IFFNtwoyou(1,7,4) THEN move=4 1350 IF move<>0 THEN ENDPROC 1360 REPEAT:move=RND(9):UNTIL P$(move)=" ":ENDPROC 1370 DEFFNtwoyou(p1,p2,p3) 1380 =(P$(p1)=B$ AND P$(p2)=B$ AND P$(p3)=" ") 1390 DEFFNtwome(p1,p2,p3) 1400 =(P$(p1)=A$ AND P$(p2)=A$ AND P$(p3)=" ") 1410 1420 DEFPROCPLAYAGAIN 1430 REPEAT:PRINTTAB(29,26);"ANOTHER?":YN=GET:UNTIL YN=89 OR YN=78 1440 IF YN=78 playagain=FALSE:PRINTTAB(29,26);" BYE! ":ENDPROC 1450 PRINTTAB(29,7);"OPPONENT":PRINTTAB(29,12);"COMPUTER":playagain=TRUE:ENDPROC 1460 DEFPROCSHOWMOVE(C) 1470 COLOUR(128+(3*C)):COLOUR(3-(3*C)) 1480 IFmove>0 THEN PRINTTAB(H2,V2);move 1490 COLOUR128:COLOUR3:ENDPROC 1500 1510 DEFPROCDISPLAYCOUNTERS 1520 PRINTTAB(32,9);yourcounter:PRINTTAB(32,14);mycounter:ENDPROC 1530 1540 DEFPROCERROR 1550 REPEAT:PRINTTAB(29,26);" EXIT ? ":G=GET:UNTIL G=78 OR G=89 1560 IF G=78 THEN GOTO 110 1570 PRINTTAB(29,26);" O.K. ":GOTO 140:ENDPROC