10 'SMART.BAS * FOR MSDOS GW BASIC MACHINES * BY STEVE KELLEY 15 'CodeWorks magazine 3838 S. Warner St., Tacoma, WA 98409 206-475-2219 (voice) 205-475-2356 (modem) 20 'Adapted for the Model 100 by David Dunn Thomas - 70526,1117 25 'Adapted for the NEC8201A by Mark Schneider - 75026, 154 30 SCREEN,0:CLS:PRINT:PRINT TAB(13);"SMART-TAC-TOE" 40 REM 50 DEFINT P-Z: DEFSTR A-H 60 DIM P(9),Q1(9),Q2(8),Q3(2),Q4(8,9),Q5(9),A(2),P1(2,1023) 70 A(0)=" ":A(1)="X":A(2)="O" 80 FOR Z=1 TO 9:READ Q1(Z):NEXT Z:E1=CHR$(30) 90 FOR Z=1 TO 8:READ Q2(Z):NEXT Z 100 FOR R2=1 TO 8:FOR X=1 TO 9:READ Q4(R2,X):NEXT X,R2 110 FOR X=1 TO 9:READ Q5(X):NEXT X:QG=-1 120 PRINT:PRINT"Use data on Chipmunk disk ? Y/N"; 125 A=INPUT$(1):IFA=""THEN125 127 IF A="Y"ORA="y"THEN140ELSEIFA="N"ORA="n"THENQS=0:GOTO160 130 GOTO125 140 OPEN"0:DATAC.TX"FORINPUTAS1:INPUT #1,QG,QH,QC,U1 145 LOCATE0,4:PRINT"Rest easy; about 40 seconds ..." 150 FOR R=0 TO 1023:INPUT#1,P1(0,R),P1(1,R),P1(2,R):NEXT R:CLOSE 160 PRINT:PRINT"Enter "+CHR$(34)+"D"+CHR$(34)+" as MOVE to record new data to disk."; 170 INPUT " Press ENTER to continue...";C 180 ' **NEW GAME** 190 QG=QG+1:Q3(1)=0:Q3(2)=0:FOR X=1 TO 9:P(X)=0:NEXT X: PB(1)=0: PB(2)=0 200 ' **MAIN LOOP** 210 CLS 230 LOCATE26,1:PRINT" | |"; 232 LOCATE26,2:PRINT" ---+---+--- " ; 234 LOCATE26,3:PRINT" | | "; 236 LOCATE26,4:PRINT" ---+---+---"; 238 LOCATE26,5:PRINT" | | "; 240 ' 242 ' 245 LOCATE19,2:PRINT"1 2 3";:LOCATE19,3:PRINT"4 5 6";:LOCATE19,4:PRINT"7 8 9"; 250 FOR X=1 TO 9:LOCATE(Q1(X))-INT((Q1(X))/40)*40,INT((Q1(X))/40):PRINTA(P(X));:NEXT X ' **PRINT PIECES** 260 LOCATE1,0:PRINT"# Games:";QG;:LOCATE1,1:PRINT"I won: ";QC;:LOCATE1,2:PRINT"You won:";QH;:LOCATE1,6:PRINT"Level of play:";U1; 270 FOR Z1 = 1 TO 2:FOR Z=1 TO 8 ' **CHECK FOR WIN** 280 IF (PB(Z1) AND Q2(Z))=Q2(Z)THEN Q3(Z1)=Z 290 NEXT Z,Z1:ON SGN (Q3(1))+SGN(Q3(2))*2 GOTO 650,730 300 IF PB(1)+PB(2)=511 THEN 790' **CHECK FOR DRAW** 310 IF QT=0 THEN QT=1 ELSE QT=0:GOTO 430 320 ' ***HUMAN'S TURN*** 330 C=INKEY$:IF C <>""THEN QS=0 '**RETURN CONTROL TO KEYBOARD?** 335 LOCATE1,7:PRINT" "; 340 LOCATE1,7:PRINT"Make your MOVE "; 350 S=INT(RND(9)*10):IF QS=0 THEN GOSUB 880:S=VAL(A) 360 IF A <> "D" THEN 390 ' *CODE FOR RECORD ON DISK?* 370 OPEN "0:DATAC.TX"FOROUTPUTAS1:PRINT#1,QG;QH;QC;U1 375 LOCATE1,7:PRINT"[umm, this takes 'bout 45 seconds...]"; 380 FOR R=0 TO 1023:PRINT#1,P1(0,R);P1(1,R);P1(2,R):NEXT R:CLOSE 385 LOCATE0,7:PRINTSPACE$(39); 390 IF S<1 OR S>9 THEN 330 400 IF P(S)=0 THEN P(S)=1:PB(1)=PB(1) OR Q5(S):GOTO 250 405 LOCATE1,7:PRINT" "; 410 LOCATE1,7:PRINT"NO NO NO...";:FOR Z=1 TO 500*(1-QS):NEXT Z:GOTO 330 415 STOP 420 ' ***COMPUTER'S TURN*** 430 LOCATE1,7:PRINT" "; 435 LOCATE1,7:PRINT"My turn "; 440 R2=8 450 PB(1)=0:PB(2)=0:FOR X=1 TO 9:PB(P(Q4(R2,X)))=PB(P(Q4(R2,X)))OR Q5(X):NEXT X 460 Q=PB(1)+PB(2)+1:R1=2*Q+1' **GENERATE HASH CODE** 470 IF PB(1)=P1(1,Q) AND PB(2)=P1(2,Q) THEN 500 480 IF P1(1,Q)=0 AND Q<> 1 THEN R2=R2-1:IF R2>=1 THEN 450 ELSE 580 490 Q=(Q+R1) AND 1023:GOTO 470 500 IF P1(0,Q)=511 THEN 650' **CONCEDE IF NO MOVES** 510 ' 520 FOR Z=1 TO 9:IF(P1(0,Q) AND Q5(Z))=0 THEN X=Z:Z=9 530 NEXT Z 540 P(Q4(R2,X))=2:Q3=Q:Q2=X' *PUT O IN CURRENT POSITION** 550 PB(1)=0:PB(2)=0:FOR X=1 TO 9:PB(P(X))=PB(P(X)) OR Q5(X):NEXT X 560 GOTO 250 570 ' *SIMILAR MOVE NOT FOUND* 580 U1=U1+1:P1(0,Q)=PB(1) OR PB(2):P1(1,Q)=PB(1):P1(2,Q)=PB(2) 590 ' 600 FOR Z=1 TO 9:IF (P1(0,Q) AND Q5(Z))=0 THEN X=Z:Z=9 610 NEXT Z 620 P(X)=2:PB(2)=PB(2) OR Q5(X):Q3=Q:Q2=X 630 GOTO 210 640 ' *COMPUTER LOSE* 650 P1(0,Q3)=P1(0,Q3) OR Q5(Q2)' **MASK OFF LOSING MOVE** 660 QH=QH+1 670 GOSUB 830 675 LOCATE1,7:PRINT" "; 680 LOCATE1,7:PRINT" I lose ";:IF QH<>1 THEN PRINT" again "; 690 IF U1>10 THEN PRINT" - BUT I'm learning"; 700 IF QS=0 THEN GOSUB 880 705 CLS 710 GOTO 190 720 ' *HUMAN LOSE* 730 P1(0,Q3)=(NOT(Q5(Q2))) AND 511' *MASK OFF NON-WINNNING MOVES** 740 QC=QC+1 750 GOSUB 830 755 LOCATE1,7:PRINT" "; 760 LOCATE1,7:PRINT" I win";:IF QC<>1 THEN PRINT" again"; 770 GOTO 700 780 ' **KAT'S GAME** 785 LOCATE1,7:PRINT" "; 790 IF QC>QH THEN C = "you" ELSE C= "I" 800 LOCATE1,7:PRINT"At least "+C+" didn't lose!!"; 810 GOTO 700 820 ' **DISPLAY WIN** 830 FOR Z = 1 TO 7*(1-QS) 840 FOR X = 1 TO 9:IF (Q5(X) AND Q2(Q3(1)+Q3(2)))<>0 THEN LOCATE(Q1(X))-INT((Q1(X))/40)*40,INT((Q1(X))/40):PRINT A(0); 850 NEXT X:FOR X=1 TO 9:LOCATE(Q1(X))-INT((Q1(X))/40)*40,INT((Q1(X))/40):PRINTA(P(X));:NEXT X 860 NEXT Z:RETURN 870 ' **TIMED INPUT ROUTINE** 880 A="": 890 FOR Z=1 TO 3000:B=INKEY$:IF B<>"" THEN Z=10000 900 NEXT Z:IF B="" THEN QS=1:GOTO 950 910 IF B=CHR$(8) AND LEN(A)>0 THEN A=LEFT$(A,LEN(A)-1):PRINT B;:GOTO 880 920 IF B=CHR$(13) THEN 950 922 IFB="D"ORB="d"THEN370 925 IFB="Q"ORB="q"THENMENU 930 IF ASC(B)>=48 AND ASC (B) <=57 THEN PRINT B;:A=A+B 940 GOTO 890 950 RETURN 960 ' **DATA FOR CHARACTERS** 1000 DATA 68,72,76,148,152,156,228,232,236 1010 DATA 7,56,448,73,146,292,273,84 1020 ' **DATA FOR MATRIX INVERSIONS** 1030 DATA 1,2,3,4,5,6,7,8,9,3,2,1,6,5,4,9,8,7 1040 DATA 1,4,7,2,5,8,3,6,9,3,6,9,2,5,8,1,4,7 1050 DATA 9,8,7,6,5,4,3,2,1,7,8,9,4,5,6,1,2,3 1060 DATA 7,4,1,8,5,2,9,6,3,9,6,3,8,5,2,7,4,1 1070 ' *DATA FOR POWERS OF TWO** 1080 DATA 1,2,4,8,16,32,64,128,256