10 REM 5/72 CONTRIBUTED BY GREG THAGARD, MENLO COLLEGE 20 PRINT "DO YOU NEED INSTRUCTIONS"; 30 C$="" 40 INPUT C$[1,4] 50 IF C$[1,1]="N" THEN 210 55 PRINT 60 PRINT "GOMOKU IS A TRADITIONAL JAPANESE GAME PLAYED ON A 19X19 BOARD." 65 PRINT "THE OBJECT IS TO OCCUPY FIVE ADJACENT POINTS IN A STRAIGHT LINE" 70 PRINT "(HORIZONTAL, VERTICAL, OR DIAGONAL) ANYWHERE ON THE BOARD." 75 PRINT 80 PRINT "THIS PROGRAM PLAYS GOMOKU ON A 9X9 BOARD." 85 PRINT "EACH MOVE IS A TWO-DIGIT NUMBER - THE FIRST DIGIT IS THE ROW" 90 PRINT "AND THE SECOND IS THE COLUMN." 95 PRINT 100 PRINT "YOU CAN CHANGE THE CURRENT BOARD-PRINTING OPTION BY ADDING" 105 PRINT "A THIRD DIGIT TO THE MOVE NUMBER:" 110 PRINT 115 PRINT " 0 SUPPRESS PRINTING ENTIRELY" 120 PRINT " 1 PRINT ONLY THE OCCUPIED POINTS" 125 PRINT " 2 PRINT THE ENTIRE BOARD" 130 PRINT 135 PRINT "(FOR EXAMPLE, IF YOU MOVE 372 THEN YOUR MOVE IS " 140 PRINT "THE POINT AT ROW 3, COLUMN 7 AND THE ENTIRE BOARD WILL BE" 145 PRINT "PRINTED UNTIL YOU CHANGE THE PRINT OPTION.)" 210 D1=1 215 PRINT 220 PRINT "DO YOU WANT TO MOVE FIRST"; 230 INPUT C$[5,10] 240 IF C$[5,5]="N" THEN 260 250 D1=-1 260 MAT S=ZER 270 A9=1 280 MAT Y=ZER 290 Q9=0 300 DIM A[9,9],B[9,9],C[9,9],S[31,2],Y[9,9],A$[9],B$[9],C$[10] 310 A$="123456789" 320 S[1,1]=1 330 G2=0 340 G3=0 350 S[1,2]=1 360 S[2,1]=3 370 S[7,2]=3 380 S[3,1]=11 390 S[13,2]=11 400 S[4,1]=43 410 S[19,2]=43 420 S[5,1]=168421. 430 S[25,2]=168421. 440 S[6,1]=3.36842E+06 450 S[31,2]=3.36842E+06 460 REM THIS IS THE BEGINNING OF THE GAME. 470 G1=1 480 Q1=0 500 REM CLEAR THE BOARD FOR A NEW GAME 510 FOR J4=1 TO 9 520 FOR I4=1 TO 9 530 B[J4,I4]=0 540 NEXT I4 550 NEXT J4 560 IF C$[1,1]#"Y" THEN 600 570 IF C$[5,5]#"Y" THEN 600 580 GOSUB 2550 590 C$="" 600 F3=0 610 D1=D1*(-1) 620 IF D1=1 THEN 700 630 J4=5 640 I4=5 650 REM HERE TO SHOE THE COMPUTER MOVE 660 PRINT "I MOVE TO";J4;I4 670 B[I4,J4]=1 680 GOSUB 2550 690 GOSUB 1440 700 IF F3=-1 THEN 1180 710 REM HERE TO PROMPT THE USER FOR HIS MOVE 720 PRINT "WHAT IS YOUR MOVE"; 730 GOSUB 2440 740 IF I3>9 OR I3<1 OR J3>9 OR J3<1 THEN 2150 750 IF B[I3,J3]>0 THEN 2190 760 B[I3,J3]=6 770 REM ENTRY NOW MADE ON THE BOARD. CALCULATE ITS VALUE. 780 GOSUB 1440 790 IF F3=1 THEN 1400 800 Y4=0 810 C4=0 820 FOR I4=1 TO 9 830 FOR J4=1 TO 9 840 IF Y[I4,J4] <= Y4 THEN 880 850 Y4=Y[I4,J4] 860 I5=I4 870 J5=J4 880 IF C[I4,J4] <= C4 THEN 920 890 C4=C[I4,J4] 900 I6=I4 910 J6=J4 920 NEXT J4 930 NEXT I4 940 IF Y4 >= 16800 THEN 1140 950 C4=0 960 FOR M8=1 TO 9 970 FOR M9=1 TO 9 980 C[M8,M9]=C[M8,M9]+A9*Y[M8,M9] 990 IF C[M8,M9] <= C4 THEN 1030 1000 C4=C[M8,M9] 1010 N8=M8 1020 N9=M9 1030 NEXT M9 1040 NEXT M8 1050 IF C4=0 THEN 1110 1060 I4=N8 1070 J4=N9 1080 REM GOSUB 2310 1090 REM GO TO PRINT THE BOARD 1100 GOTO 650 1110 REM HERE FOR A DRAW. 1120 PRINT "THIS IS A DRAW GAME" 1130 GOTO 1350 1140 REM HERE FOR THE WINNING MOVE 1150 I4=I5 1160 J4=J5 1170 GOTO 650 1180 REM HERE FOR COMPUTER WINS. 1190 PRINT "I WIN THE GAME" 1200 G2=G2+1 1210 IF G2<3 THEN 1340 1220 PRINT "THAT MAKES";G2;" GAMES IN A ROW" 1230 PRINT "I HAVE JUST MADE A DOWNWARD ADJUSTMENT IN MY ABILITY" 1240 A9=A9*.9 1250 IF G2=4 THEN 1290 1260 IF G2=5 THEN 1310 1270 IF G2>5 THEN 1330 1280 GOTO 1340 1290 PRINT "PLEASE TRY THIS TIME" 1300 GOTO 1340 1310 PRINT "YOU MUST NOT BE CONCENTRATING" 1320 GOTO 1340 1330 PRINT "ARE YOU SURE YOU KNOW HOW TO PLAY THIS GAME?" 1340 REM LETS TRY A NEW GAME. 1350 G1=G1+1 1360 PRINT "WILL YOU PLAY ANOTHER GAME"; 1370 INPUT C$ 1380 IF C$[1,1]="Y" THEN 210 1390 STOP 1400 REM HERE FOR USER WINS. 1410 PRINT "YOU WIN GAME NO. ";G1 1420 G2=0 1430 GOTO 1340 1440 REM CALCULATE THE VALUES OF ALL THE SQUARES ON THE BOARD. 1450 FOR J4=1 TO 9 1460 FOR I4=1 TO 9 1470 C[J4,I4]=0 1480 Y[J4,I4]=0 1490 NEXT I4 1500 NEXT J4 1510 FOR J4=1 TO 9 1520 FOR I4=1 TO 5 1530 K4=I4+4 1540 I9=0 1550 I8=0 1560 FOR M4=I4 TO K4 1570 I8=I8+B[J4,M4] 1580 I9=I9+B[M4,J4] 1590 NEXT M4 1600 IF I8=5 OR I9=5 THEN 1620 1610 GOTO 1650 1620 F3=-1 1630 REM GOSUB 2220 1640 RETURN 1650 IF I8=30 OR I9=30 THEN 1670 1660 GOTO 1690 1670 F3=1 1680 GOTO 1630 1690 I8=I8+1 1700 I9=I9+1 1710 FOR M4=I4 TO K4 1720 IF B[J4,M4]=0 THEN 1740 1730 GOTO 1760 1740 C[J4,M4]=C[J4,M4]+S[I8,2] 1750 Y[J4,M4]=Y[J4,M4]+S[I8,1] 1760 IF B[M4,J4]=0 THEN 1780 1770 GOTO 1800 1780 C[M4,J4]=C[M4,J4]+S[I9,2] 1790 Y[M4,J4]=Y[M4,J4]+S[I9,1] 1800 NEXT M4 1810 NEXT I4 1820 NEXT J4 1830 REM TRY TO ASSIGN VALUES TO THE DIAGONALS NOW. 1840 FOR J4=1 TO 5 1850 FOR I4=1 TO 5 1860 I8=0 1870 I9=0 1880 FOR M4=1 TO 5 1890 K4=J4+M4-1 1900 L4=I4+M4-1 1910 K5=10-K4 1920 I8=I8+B[K4,L4] 1930 I9=I9+B[K5,L4] 1940 NEXT M4 1950 IF I8=5 OR I9=5 THEN 1620 1960 IF I8=30 OR I9=30 THEN 1670 1970 I8=I8+1 1980 I9=I9+1 1990 FOR M4=1 TO 5 2000 K4=J4+M4-1 2010 L4=I4+M4-1 2020 K5=10-K4 2030 IF B[K4,L4]=0 THEN 2050 2040 GOTO 2070 2050 C[K4,L4]=C[K4,L4]+S[I8,2] 2060 Y[K4,L4]=Y[K4,L4]+S[I8,1] 2070 IF B[K5,L4]=0 THEN 2090 2080 GOTO 2110 2090 C[K5,L4]=C[K5,L4]+S[I9,2] 2100 Y[K5,L4]=Y[K5,L4]+S[I9,1] 2110 NEXT M4 2120 NEXT I4 2130 NEXT J4 2140 GOTO 1630 2150 REM MOVE IS OFF BOARD 2170 PRINT "YOUR MOVE ";J3;I3;" IS OFF THE BOARD " 2180 GOTO 700 2190 REM HERE IF SQUARE IS OCCUPIED 2200 PRINT "SQUARE ";J3;I3;" ALREADY OCCUPIED" 2210 GOTO 700 2220 PRINT "BOARD POSITIONS" 2230 MAT A=B 2240 GOSUB 2860 2250 PRINT 2260 PRINT "VALUE TABLE C. USED BY USER " 2270 MAT A=C 2280 GOSUB 2860 2290 PRINT 2300 PRINT "VALUE TABLE Y. USED BY THE COMPUTER." 2310 MAT A=Y 2320 GOSUB 2860 2330 RETURN 2340 PRINT "COMBINED TABLE. USED FOR FINDING THE BEST MOVE." 2350 MAT A=C 2360 GOSUB 2860 2370 PRINT "BOARD POSITIONS." 2380 MAT A=B 2390 GOSUB 2860 2400 PRINT "BEST VALUE IS";C4;" AT ";J4;I4;" OR ";N9;N8 2410 RETURN 2420 PRINT A9 2430 PRINT C4,I4,I6,J4,J6 2440 INPUT Q9 2450 IF Q9<100 THEN 2500 2460 J3=INT(Q9/100) 2470 I3=INT(Q9/10)-J3*10 2480 Q1=Q9-10*I3-100*J3 2490 RETURN 2500 J3=INT(Q9/10) 2510 I3=Q9-J3*10 2540 RETURN 2550 IF Q1=0 THEN 2850 2560 PRINT 2570 PRINT " "'29'31 2580 PRINT " "; 2590 FOR I=1 TO 9 2600 PRINT " "A$[I,I]" "; 2610 NEXT I 2620 PRINT 2630 FOR I=1 TO 9 2640 K=9 2650 FOR J=9 TO 1 STEP -1 2660 IF B[J,I] <> 0 THEN 2680 2670 NEXT J 2680 IF Q1=2 THEN 2700 2690 K=J 2700 PRINT A$[I,I];" "; 2710 FOR J=1 TO K 2720 IF B[J,I]=1 THEN 2770 2730 IF B[J,I]=6 THEN 2790 2740 IF Q1#2 THEN 2810 2750 PRINT " + "; 2760 GOTO 2820 2770 PRINT " C "; 2780 GOTO 2820 2790 PRINT " Y "; 2800 GOTO 2820 2810 PRINT " "; 2820 NEXT J 2830 PRINT 2840 NEXT I 2850 RETURN 2860 FOR A=1 TO 9 2870 FOR A1=1 TO 9 2880 PRINT A[A1,A]; 2890 NEXT A1 2900 PRINT 2910 NEXT A 2920 RETURN 2930 END