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 
