:SMART.BAS * FOR MSDOS GW BASIC MACHINES *:BY STEVE KELLEY: ,!: "SMART-TAC-TOE"( 2 PZ: AHG< P(),Q1(),Q2(),Q3(),Q4(,),Q5(),A(),P1(,)FA()" ":A()"X":A()"O"::FOR Z=0 TO 2:FOR Z1=1 TO 10:READ Z2:A(Z)=A(Z)+CHR$(Z2):NEXT Z1,ZP Z : Q1A(Z): Q1B(Z): Z:E1()Z Z : Q2(Z): Z d R2 : X : Q4(R2,X): X,R2= n X : Q5(X): X:QG_ x:" Use data on disk? Y/N ";x }A$(): A"" }  A"Y" A"y"  : A"N" A"n" QS:  } "A:DATATAC.TXT" AS 1: #,QG,QH,QC,U1"  ,:"Rest easy; about 50 seconds to load ..."T R :#,P1(,R),P1(,R),P1(,R): R: :" Enter "(")"D"(")" as MOVE to record new data to disk."; " Press ENTER to continue...";C : **NEW GAME**+ QGQG:Q3():Q3(): X :P(X): X: PB(): PB()N : **MAIN LOOP**T m ,):" | |"; ,):" ---+---+--- " ; ,):" | | "; ,):" ---+---+---";  ,):" | | "; : :+ ,: "1 2 3";: ,:"4 5 6";: ,: "7 8 9";n X : Q1A(X),Q1B(X): A(P(X));: X : **PRINT PIECES**  ,:"# Games: ";QG;" I won:";QC;" You won:";QH;" Level of play:";U1;  Z1  : Z  : **CHECK FOR WIN**  (PB(Z1) Q2(Z))Q2(Z) Q3(Z1)ZF " Z,Z1: (Q3())(Q3()) ,y , PB()PB() : **CHECK FOR DRAW** 6 QT QT : QT:  @: ***HUMAN'S TURN*** JC: C "" QS :**RETURN CONTROL TO KEYBOARD?**'O ,: " ";HT ,: "Make your MOVE ";r^S(() ): QS p:S(A)h A "D"  : *CODE FOR RECORD ON DISK?*r "A:DATATAC.TXT" OUTPUT AS 1:#,QG;QH;QC;U1w ,:"[ummmmm, this take 'bout 65 seconds ... ]";D| R :#,P1(,R);P1(,R);P1(,R): R: ,:" "; S S J P(S) P(S):PB()PB() Q5(S):  ,: " ";# ,: "NO NO NO...";: Z (QS): Z: J)Z: ***COMPUTER'S TURN***~ ,: " "; ,: "My turn ";R2PB():PB(): X :PB(P(Q4(R2,X)))PB(P(Q4(R2,X))) Q5(X): X"QPB()PB():R1Q: **GENERATE HASH CODE**L PB()P1(,Q) PB()P1(,Q)  P1(,Q) Q  R2R2: R2  : DQ(QR1) :  P1(,Q) : **CONCEDE IF NO MOVES**: Z :(P1(,Q) Q5(Z)) XZ:Z  ZJP(Q4(R2,X)):Q3Q:Q2X: *PUT O IN CURRENT POSITION**&PB():PB(): X :PB(P(X))PB(P(X)) Q5(X): X0 :: *SIMILAR MOVE NOT FOUND*DU1U1:P1(,Q)PB() PB():P1(,Q)PB():P1(,Q)PB()N:3X Z : (P1(,Q) Q5(Z)) XZ:Z;b ZdlP(X):PB()PB() Q5(X):Q3Q:Q2Xnv : *COMPUTER LOSE*P1(,Q3)P1(,Q3) Q5(Q2): **MASK OFF LOSING MOVE**QHQH > ,: " ";N ,: " I lose ";: QH " again ";t U1 " - BUT I'm learning"; QS p : *HUMAN LOSE*P1(,Q3)((Q5(Q2))) : *MASK OFF NON-WINNNING MOVES** QCQC >I ,: " ";u ,: " I win";: QC " again";  : **KAT'S GAME** ,: " "; QCQH C "you" : C "I"'  ,:"At least "C" didn't lose!!";1* \4: **DISPLAY WIN**s> Z  (QS)H X  : (Q5(X) Q2(Q3()Q3())) Q1A(X),Q1B(X): A();R X: X : Q1A(X),Q1B(X): A(P(X));: X\ Z:.f: **TIMED INPUT ROUTINE**8pA"":\z Z  :B: B"" Z'x Z: B"" QS:  B() (A) A(A,(A)): B;: p B( )  B"D" B"d" r B"Q" B"q"  (B)0 (B) 9 B;:AAB* z0`: **DATA FOR CHARACTERS** 6,43,6,47,6,51,8,43,8,47,8,51,10,43,10,47,10,51 7,56,448,73,146,292,273,84: **DATA FOR MATRIX INVERSIONS** 1,2,3,4,5,6,7,8,9,3,2,1,6,5,4,9,8,7D 1,4,7,2,5,8,3,6,9,3,6,9,2,5,8,1,4,7n 9,8,7,6,5,4,3,2,1,7,8,9,4,5,6,1,2,3$ 7,4,1,8,5,2,9,6,3,9,6,3,8,5,2,7,4,1.: *DATA FOR POWERS OF TWO**8 1,2,4,8,16,32,64,128,256