home *** CD-ROM | disk | FTP | other *** search
- 100 REM ** SQUARE **
- 110 REM
- 120 REM WRITTEN BY MAC OGLESBY
- 130 REM AS DESCRIBED IN VOL. 1, ISSUE 3
- 140 REM OF CALCULATORS-COMPUTERS MAGAZINE
- 150 REM
- 160 CS$=CHR$(126)+CHR$(28) 'CURSOR CONTROL CODES TO CLEAR SCREEN
- 170 DEFINT A-Z
- 180 PRINTCS$;"ENTER PASSWORD";:INPUTA$:Z=0
- 190 A=0:FORI=1TOLEN(A$):A=A+ASC(MID$(A$,I,1)):NEXT:A=RND(-A)
- 200 DIM Q(50),S$(50),S(24,12),U(12),V(50)
- 210 P$(1)="X":P$(2)="O":F=1
- 220 FOR R0=0 TO 4:FOR C0=0 TO 4:D$(R0,C0)=".":NEXTC0:NEXTR0
- 230 INPUT"WANT INSTRUCTIONS FOR 'SQUARE'";A$
- 240 IFLEFT$(A$,1)="N"THEN400
- 250 PRINTCS$; 'CLEAR SCREEN
- 260 PRINT" THE GAME OF SQUARE IS FOR 1 OR 2 PLAYERS. THE NORMAL"
- 270 PRINT"BOARD LOOKS LIKE THIS AT THE START:":GOSUB2000
- 280 PRINT" THE PLAYERS GO IN TURN AND CHOOSE ANY UNOCCUPIED POINT"
- 290 PRINT"(SHOWN AS A DOT). EACH PLAYER HAS 12 MARKERS (X'S OR O'S)"
- 300 PRINT"WHICH ARE USED TO IDENTIFY CHOSEN POINTS.":PRINT
- 310 INPUT" ENTER 'C' TO CONTINUE";A$:PRINT
- 320 PRINT" THE WINNER IS THE FIRST PLAYER WHO HAS CHOSEN 4 POINTS"
- 330 PRINT"WHICH FORM THE CORNERS OF A SQUARE."
- 340 PRINT" TO CHOOSE A POINT, TYPE 2 DIGITS (0 TO 4) SEPARATED BY A"
- 350 PRINT"COMMA. THE FIRST DIGIT TELLS THE DISTANCE OVER (TO T";
- 360 PRINT"HE RIGHT)":PRINT"FROM POINT 0,0 (THE ORIGIN). THE SECOND";
- 370 PRINT" DIGIT TELLS THE DISTANCE UP.":PRINT
- 380 PRINT"REMEMBER: OVER,UP.":PRINT
- 390 INPUT" ENTER 'C' TO CONTINUE";A$:PRINT
- 400 PRINT:INPUT"DO YOU WANT TO PLAY THE EXPERTS' GAME";A$
- 410 B0=1:IFLEFT$(A$,1)="Y"THENB0=2
- 420 IFB0=1THEN440
- 430 D$(2,2)=" ":N=38:GOTO450
- 440 N=50
- 450 IFZ=1THENGOTO490ELSEPRINT:INPUT"HOW MANY PLAYERS (1 OR 2)";P0
- 460 IFP0=2THEN510
- 470 IF P0=1THEN480ELSEPRINT"PLEASE ENTER 1 OR 2":GOTO450
- 480 PRINTCS$;"OK, I WILL PLAY THE X'S":PRINT
- 490 INPUT"DO YOU WANT TO GO FIRST";A$:F=1
- 500 IFLEFT$(A$,1)="Y"THENF=2
- 510 PRINTCS$;"OK...HERE WE GO..."
- 520 IFZ=1THEN940
- 530 RESTORE:FORJ=0TO24:READS(J,0):NEXT
- 540 DATA 4,7,8,7,4,7,10,11,10,7,8,11,12,11,8,7,10,11,10,7,4,7,8,7,4
- 550 FORJ=0TO24:FORK=1TOS(J,0):READS(J,K):NEXTK:NEXTJ
- 560 DATA 1,13,35,43
- 570 DATA 1,2,15,20,28,31,36
- 580 DATA 2,3,21,24,29,43,44,47
- 590 DATA 3,4,16,25,30,31,35
- 600 DATA 4,13,36,44
- 610 DATA 1,5,15,24,30,32,37
- 620 DATA 1,2,5,14,22,25,38,39,47,48
- 630 DATA 2,3,15,16,17,23,26,32,33,39,40
- 640 DATA 3,4,6,14,20,27,37,40,47,49
- 650 DATA 4,6,16,21,28,33,38
- 660 DATA 5,7,20,26,29,43,45,48
- 670 DATA 5,7,15,17,18,21,27,31,34,39,41
- 680 DATA 39,40,41,42,43,44,45,46,47,48,49,50
- 690 DATA 6,8,16,17,19,22,24,31,34,40,42
- 700 DATA 6,8,23,25,29,44,46,49
- 710 DATA 7,9,18,22,28,32,35
- 720 DATA 7,9,10,14,23,24,36,41,48,50
- 730 DATA 10,11,17,18,19,20,25,32,33,41,42
- 740 DATA 8,11,12,14,21,26,35,42,49,50
- 750 DATA 8,12,19,27,30,33,36
- 760 DATA 9,13,37,45
- 770 DATA 9,10,18,26,30,34,38
- 780 DATA 10,11,22,27,29,45,46,50
- 790 DATA 11,12,19,23,28,34,37
- 800 DATA 12,13,38,46
- 810 FORJ=1TON:READS$(J):NEXT
- 820 DATA 00011110,01021211,02031312,03041413,10112120
- 830 DATA 13142423,20213130,23243433,30314140,31324241
- 840 DATA 32334342,33344443,00044440,11133331
- 850 DATA 01122110,03142312,12233221,21324130,23344332
- 860 DATA 01133220,02143321,11234230,12244331
- 870 DATA 02233110,03243211,12334120,13344221
- 880 DATA 01144330,02244220,03344110
- 890 DATA 01032321,10123230,12143432,21234341
- 900 DATA 00033330,01043431,10134340,11144441
- 910 DATA 11122221,12132322,21223231,22233332
- 920 DATA 00022220,02042422,20224240,22244442
- 930 DATA 02132211,11223120,13243322,22334231
- 940 IFA(1)<>89THEN960
- 950 IFB0=2THEN960ELSEPRINT:GOTO970
- 960 GOSUB2000
- 970 T=T+1
- 980 REM ** MAIN MOVE LOOP: J=121212... OR J=212121...
- 990 FORJ=FTO3-FSTEP3-2*F
- 1000 IFP0=2THEN1730
- 1010 IFJ=2THEN1730
- 1020 REM ** GENERATE COMPUTER'S MOVE
- 1030 IFT<>1THEN1100
- 1040 IFD$(2,2)<>"."THEN1060
- 1050 R1=2:C1=2:GOTO1710
- 1060 IFF=1THEN1080
- 1070 Q0=9:GOTO1130
- 1080 R1=1+INT(RND(1)*3):C1=1+INT(RND(1)*3)
- 1090 IFD$(R1,C1)<>"."THENGOTO1080ELSEGOTO1710
- 1100 IFT<>2THEN1380
- 1110 IFF=1THEN1130
- 1120 Q0=19
- 1130 K9=0
- 1140 FORJ1=1TON:IFQ(J1)<>1+Q0THEN1160
- 1150 K9=K9+1:U(K9)=J1
- 1160 NEXTJ1
- 1170 IFK9=0THEN1370
- 1180 FORJ2=K9TO1STEP-1:T9=1+INT(RND(1)*J2):J1=U(T9)
- 1190 FORK1=1TO8STEP2:R1=VAL(MID$(S$(J1),K1,1))
- 1200 C1=VAL(MID$(S$(J1),K1+1,1))
- 1210 IFD$(R1,C1)<>"."THEN1320
- 1220 IFQ0+T<3THEN1240
- 1230 GOTO1710
- 1240 S0=5*R1+C1:M0=0:FORJ3=1TOS(S0,0)
- 1250 IFB0=1THEN1280
- 1260 IFS(S0,J3)<=38THEN1280
- 1270 GOTO1310
- 1280 IFQ(S(S0,J3))>1THEN1300
- 1290 M0=M0+1
- 1300 NEXTJ3
- 1310 IFM0<8-B0THENGOTO1320ELSEGOTO1710
- 1320 NEXTK1
- 1330 IFJ2=T9THEN1350
- 1340 T8=U(J2):U(J2)=U(T9):U(T9)=T8
- 1350 NEXTJ2
- 1360 REM *** AS A LAST RESORT, PICK ANY VACANT POINT
- 1370 R1=RND(1)*5:C1=RND(1)*5:IFD$(R1,C1)<>"."THENGOTO1370ELSEGOTO1710
- 1380 IFT=3THEN1430
- 1390 REM ** SEE IF 'X' CAN COMPLETE A SQUARE
- 1400 FORJ1=1TON:IFQ(J1)<>3THENGOTO1410ELSEGOTO1190
- 1410 NEXTJ1
- 1420 REM ** SEE IF 'O' CAN COMPLETE A SQUARE
- 1430 FORJ1=1TON:IFQ(J1)<>30THENGOTO1440ELSEGOTO1190
- 1440 NEXTJ1
- 1450 REM ** CAN 'X' CHOOSE A 3RD CORNER?
- 1460 K9=0:FORJ1=1TON:IFQ(J1)<>2THEN1480
- 1470 K9=K9+1:U(K9)=J1
- 1480 NEXTJ1
- 1490 IFK9=0THEN1700
- 1500 FORI0=1TO2:FORJ0=K9TO1STEP-1:M9=1+INT(RND(1)*J0):J1=U(M9):T9=0
- 1510 FORK1=1TO8STEP2:R1=VAL(MID$(S$(J1),K1,1))
- 1520 C1=VAL(MID$(S$(J1),K1+1,1)):IFD$(R1,C1)<>"."THEN1540
- 1530 T9=T9+1:R(T9)=R1:C(T9)=C1
- 1540 NEXTK1
- 1550 FORJ2=1TO2:FORJ3=1TO50:V(J3)=Q(J3):NEXTJ3:S0=5*R(J2)+C(J2)
- 1560 FORJ3=1TOS(S0,0):V(S(S0,J3))=V(S(S0,J3))+1:NEXTJ3
- 1570 S0=5*R(3-J2)+C(3-J2)
- 1580 FORJ3=1TOS(S0,0):V(S(S0,J3))=V(S(S0,J3))+10:NEXTJ3
- 1590 FORJ3=1TON:IFV(J3)<>4-I0THEN1610
- 1600 R1=R(J2):C1=C(J2):GOTO1710
- 1610 NEXTJ3
- 1620 NEXTJ2
- 1630 IFJ0=M9THEN1650
- 1640 T8=U(J0):U(J0)=U(M9):U(M9)=T8
- 1650 NEXTJ0
- 1660 NEXTI0
- 1670 REM ** NO GOOD MOVE AVAILABLE...PICK ANY 3RD CORNER
- 1680 J1=U(1+INT(RND(1)*K9)):GOTO1190
- 1690 REM ** SEE IF WE CAN ANNOY THE HUMAN
- 1700 Q0=I9:GOTO1130
- 1710 PRINT"THE ";P$(J);"'S MOVE TO ";STR$(C1);",";STR$(R1):GOTO1780
- 1720 REM ** GET PLAYER'S CHOICE
- 1730 IFT>1THEN1750
- 1740 PRINT"THE ";P$(J);"'S MOVE TO WHICH POINT";:GOTO1760
- 1750 PRINTP$(J);"'S CHOICE";
- 1760 INPUTC1,R1
- 1770 IFD$(R1,C1)<>"."THEN1850
- 1780 D$(R1,C1)=P$(J)
- 1790 REM ** Q() TELLS WHO OWNS CORNERS OF WHICH SQUARES
- 1800 S0=5*R1+C1:FORJ1=1TOS(S0,0):Q(S(S0,J1))=Q(S(S0,J1))+1+(J-1)*9
- 1810 IFQ(S(S0,J1))<>4+(J-1)*36THEN1830
- 1820 PRINT:PRINT"*** THE ";P$(J);"'S WIN!! ***":GOTO1910
- 1830 NEXTJ1
- 1840 GOTO1880
- 1850 PRINT"** ILLEGAL POINT! **":GOTO1870
- 1860 PRINT"YOU MUST TYPE 2 DIGITS (0 TO 4) SEPARATED BY A COMMA!"
- 1870 PRINT"** INPUT IGNORED! PLEASE TRY AGAIN...":GOTO1750
- 1880 NEXTJ
- 1890 IFT<12THEN1970
- 1900 PRINT:PRINT"THE GAME IS A DRAW; NEITHER PLAYER MADE A SQUARE!"
- 1910 FORK1=1TO8STEP2:R1=VAL(MID$(S$(S(S0,J1)),K1,1))
- 1920 C1=VAL(MID$(S$(S(S0,J1)),K1+1,1)):D$(R1,C1)=CHR$(64):NEXT:GOSUB2000
- 1930 INPUT"WANT TO PLAY AGAIN";A$:IFLEFT$(A$,1)<>"Y"THENEND
- 1940 Z=1:FORJ2=0TO4:FORJ3=0TO4:D$(J2,J3)=".":NEXTJ3:NEXTJ2
- 1950 FORJ2=1TO50:Q(J2)=0:V(J2)=0:NEXTJ2:FORJ2=1TO12:U(J2)=0:NEXTJ2
- 1960 T=0:K9=0:GOTO400
- 1970 GOSUB2000
- 1980 GOTO970
- 1990 REM ** PRINT THE BOARD
- 2000 PRINT:FORR0=4TO0STEP-1:PRINTSTR$(R0);" ";
- 2010 FORC0=0TO4:PRINTD$(R0,C0);:IFC0=4THEN2030
- 2020 PRINT" ";
- 2030 NEXTC0:PRINT:IFR0=0THEN2050
- 2040 PRINT:PRINT
- 2050 NEXTR0:PRINT:PRINT" 0 1 2 3 4":PRINT:RETURN
- 2060 END
- NEXTC0:PRINT:IFR0=0THEN2050
- 2040 PRINT:PRINT
- 2050 NEXTR0:PRINT:PRINT" 0 1 2 3 4":PRINT