home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.whtech.com
/
ftp.whtech.com.tar
/
ftp.whtech.com
/
club100
/
gam
/
smartt.ba
< prev
next >
Wrap
Text File
|
2006-10-19
|
5KB
|
121 lines
1 'SMARTT.BA from CodeWorks Magazine by Steve Kelly, written for GW Basic
2 'Adapted for the M100 by Dave Thomas, modified by Robert Benson
40 CLS:PRINT:PRINTTAB(13);"SMART-TAC-TOE"
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(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):IF A="" GOTO125
130 IF A="Y" OR A="y" GOTO140 ELSE IF A="N" OR A="n" GOTO160
135 GOTO125
140 QS=1:OPEN"0:DATAC.TX" FOR INPUT AS1:INPUT#1,QG,QH,QC,U1
145 PRINT@160,"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 PRINT@ 66," | | ";
232 PRINT@106," ---+---+---";
234 PRINT@146," | | ";
236 PRINT@186," ---+---+---";
238 PRINT@226," | | ";
240 FOR X=1 TO 9:PRINT@Q1(X),CHR$(27)"p" X CHR$(27)"q";:NEXT X
250 FOR X=1 TO 9:IF A(P(X))=" " GOTO255 ELSE PRINT@Q1(X),A(P(X));
255 NEXT X' *PRINT PIECES*
260 PRINT@1,"# Games:";QG;:PRINT@41,"I won: ";QC;:PRINT@81,"You won:";QH;:PRINT@241,"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 GOTO650,730
300 IF PB(1)+PB(2)=511 GOTO785' *CHECK FOR DRAW*
310 IF QT=0 THEN QT=1 ELSE QT=0:GOTO430
320 '***HUMAN'S TURN***
330 C=INKEY$:IF C<>"" THEN QS=0' *RETURN CONTROL TO KEYBOARD?*
335 GOSUB880
340 PRINT@306,"Hit Q to exit";:PRINT@281,"Make your MOVE ";
345 S=INT(RND(9)*10):IF S=0 GOTO345 ELSE IF QS<>0 GOTO390
350 '**TIMED INPUT ROUTINE**
351 T=0
352 B=INKEY$
353 IF B=CHR$(8) AND LEN(A)>0 THEN A=LEFT$(A,LEN(A)-1):PRINT B;:GOTO351
354 IF B=CHR$(13) GOTO390
355 IF B="D" OR B="d" GOTO370
356 IF B="Q" OR B="q" THEN MENU
357 IF VAL(B)=>1 AND VAL(B)<=9 THEN PRINT B;:S=VAL(B):GOTO390
358 IF T=180 GOTO390 ELSE T=T+1:GOTO352
360 '**CODE FOR RECORD ON DISK?**
370 OPEN"0:DATAC.TX" FOR OUTPUT AS1:PRINT#1,QG;QH;QC;U1
375 PRINT@281,"[umm, this takes `about 45 seconds...]";
380 FOR R=0 TO 1023:PRINT#1,P1(0,R);P1(1,R);P1(2,R):NEXT R:CLOSE
385 PRINT@280,SPACE$(39);
390 IF P(S)=0 THEN P(S)=1:PB(1)=PB(1) OR Q5(S):GOTO250
400 IF T=180 GOTO345 ELSE GOSUB880
410 PRINT@281,"NO NO NO...";:FOR Z=1 TO 500*(1-QS):NEXT Z
415 GOTO330
420 '***COMPUTER'S TURN***
430 GOSUB880
435 PRINT@281,"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) GOTO500
480 IF P1(1,Q)=0 AND Q<>1 THEN R2=R2-1:IF R2>=1 GOTO450 ELSE 580
490 Q=(Q+R1) AND 1023:GOTO470
500 IF P1(0,Q)=511 GOTO650' *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 GOTO250
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 GOTO230
640 '**COMPUTER LOSE**
650 P1(0,Q3)=P1(0,Q3) OR Q5(Q2)' *MASK OFF LOSING MOVE*
660 QH=QH+1
670 GOSUB830
680 GOSUB880
690 PRINT@281,"I lose";:IF QH<>1 THEN PRINT " again";
700 IF U1>10 THEN PRINT" - BUT I'm learning";
710 IF QS=0 GOTO810
720 '**HUMAN LOSE**
730 P1(0,Q3)=(NOT(Q5(Q2))) AND 511' *MASK OFF NON-WINNNING MOVES*
740 QC=QC+1
750 GOSUB830
755 GOSUB880
760 PRINT@281,"I win";:IF QC<>1 THEN PRINT" again";
770 IF QS=0 GOTO810
780 '**KAT'S GAME**
785 GOSUB880
790 IF QC>QH THEN C="you" ELSE C="I"
800 PRINT@281,"At least "C" didn't lose!!";
810 FOR T=1 TO 4500:NEXT T:CLS:GOTO190
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 PRINT@Q1(X)," ";
850 NEXT X
860 FOR X=1 TO 9:IF A(P(X))<>" X " AND A(P(X))<>" O "GOTO870 ELSE PRINT@Q1(X),A(P(X));
870 NEXT X:NEXT Z:RETURN
880 PRINT@281,CHR$(27)"K";:RETURN
900 '**DATA FOR CHARACTERS**
1000 DATA 67,71,75,147,151,155,227,231,235
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