10  REM 5/72 CONTRIBUTED BY GREG THAGARD, MENLO COLLEGE
11  REM FROM 5-5-84ICL/A000, CONVERTED TO PT BASIC IN 2008...
12  REM REMOVED STRINGS, REWORDED PROMPTS TO INPUT NUMERIC
13  REM ADDED NUMBER PRINT SUB AT 9400, MOD'D FOR FORMATTING
14  REM CHANGED DISPLAY PIECES, IN PRINT SUBS AT LNS. 3000+
15  REM MOVED INIT CODE TO BEGINNING, PRINTS BOARD AS DEFAULT
16  REM LIMITED TO 3 LOSER REMARKS.
30  DIM A[9,9],B[9,9],C[9,9],S[31,2],Y[9,9]
31  LET G1=G2=0
32  REM Q1 IS DEFAULT PRINT MODE
33  LET Q1=2
34  REM A9 IS COMPUTER ABILITY
35  LET A9=1
40  PRINT "ENTER 1 FOR INSTRUCTIONS  ";
45  INPUT Z5
50  IF Z5#1 THEN 210
55  PRINT 
60  PRINT "GOMOKU IS A TRADITIONAL JAPANESE GAME PLAYED ON A 19X19";
62  PRINT " BOARD."
65  PRINT "THE OBJECT IS TO OCCUPY FIVE ADJACENT POINTS IN A";
66  PRINT " 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 - ";
86  PRINT "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 (DEFAULT)"
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.)"
150  PRINT 
155  PRINT "ON THE BOARD,";
156  GOSUB 3080
157  PRINT "= YOU,";
158  GOSUB 3050
159  PRINT "= ME, AND (IF OPT.2)";
160  GOSUB 3020
161  PRINT "= EMPTY."
200  PRINT 
205  REM RESTART TO PLAY AGAIN
210  LET D1=1
215  PRINT 
220  PRINT "ENTER 1 TO MOVE FIRST  ";
230  INPUT Z6
240  IF Z6#1 THEN 260
250  LET D1=-1
260  MAT S=ZER
280  MAT Y=ZER
290  LET Q9=0
320  LET S[1,1]=1
340  LET G3=0
350  LET S[1,2]=1
360  LET S[2,1]=3
370  LET S[7,2]=3
380  LET S[3,1]=11
390  LET S[13,2]=11
400  LET S[4,1]=43
410  LET S[19,2]=43
420  LET S[5,1]=168421.
430  LET S[25,2]=168421.
440  LET S[6,1]=3.36842E+06
450  LET S[31,2]=3.36842E+06
460  REM THIS IS THE BEGINNING OF THE GAME.
500  REM CLEAR THE BOARD FOR A NEW GAME
510  FOR J4=1 TO 9
520  FOR I4=1 TO 9
530  LET B[J4,I4]=0
540  NEXT I4
550  NEXT J4
570  IF Z6#1 THEN 600
580  GOSUB 2550
590  LET Z5=Z6=0
600  LET F3=0
610  LET D1=D1*(-1)
620  IF D1=1 THEN 700
630  LET J4=5
640  LET I4=5
650  REM HERE TO SHOE THE COMPUTER MOVE
660  PRINT "I MOVE TO ";
661  LET Z9=J4
662  GOSUB 9400
663  LET Z9=I4
664  GOSUB 9400
665  PRINT 
670  LET 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  LET 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  LET Y4=0
810  LET C4=0
820  FOR I4=1 TO 9
830  FOR J4=1 TO 9
840  IF Y[I4,J4] <= Y4 THEN 880
850  LET Y4=Y[I4,J4]
860  LET I5=I4
870  LET J5=J4
880  IF C[I4,J4] <= C4 THEN 920
890  LET C4=C[I4,J4]
900  LET I6=I4
910  LET J6=J4
920  NEXT J4
930  NEXT I4
940  IF Y4 >= 16800 THEN 1140
950  LET C4=0
960  FOR M8=1 TO 9
970  FOR M9=1 TO 9
980  LET C[M8,M9]=C[M8,M9]+A9*Y[M8,M9]
990  IF C[M8,M9] <= C4 THEN 1030
1000  LET C4=C[M8,M9]
1010  LET N8=M8
1020  LET N9=M9
1030  NEXT M9
1040  NEXT M8
1050  IF C4=0 THEN 1110
1060  LET I4=N8
1070  LET 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  LET I4=I5
1160  LET J4=J5
1170  GOTO 650
1180  REM HERE FOR COMPUTER WINS.
1190  PRINT "I WIN THE GAME"
1200  LET G2=G2+1
1210  IF G2<3 THEN 1340
1220  PRINT "THAT MAKES ";
1221  LET Z9=G2
1222  GOSUB 9400
1223  PRINT " GAMES IN A ROW"
1230  PRINT "I HAVE JUST MADE A DOWNWARD ADJUSTMENT IN MY ABILITY"
1240  LET A9=A9*.9
1250  IF G2=4 THEN 1290
1260  IF G2=5 THEN 1310
1269  REM 1270 WAS IF G2>5 BUT ONCE IS ENOUGH
1270  IF G2=6 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  LET G1=G1+1
1360  PRINT "ENTER 1 TO PLAY ANOTHER GAME  ";
1370  INPUT Z5
1380  IF Z5=1 THEN 210
1390  STOP 
1400  REM HERE FOR USER WINS.
1410  PRINT "YOU WIN GAME NO.";G1
1420  LET 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  LET C[J4,I4]=0
1480  LET Y[J4,I4]=0
1490  NEXT I4
1500  NEXT J4
1510  FOR J4=1 TO 9
1520  FOR I4=1 TO 5
1530  LET K4=I4+4
1540  LET I9=0
1550  LET I8=0
1560  FOR M4=I4 TO K4
1570  LET I8=I8+B[J4,M4]
1580  LET I9=I9+B[M4,J4]
1590  NEXT M4
1600  IF I8=5 OR I9=5 THEN 1620
1610  GOTO 1650
1620  LET F3=-1
1630  REM GOSUB 2220
1640  RETURN 
1650  IF I8=30 OR I9=30 THEN 1670
1660  GOTO 1690
1670  LET F3=1
1680  GOTO 1630
1690  LET I8=I8+1
1700  LET I9=I9+1
1710  FOR M4=I4 TO K4
1720  IF B[J4,M4]=0 THEN 1740
1730  GOTO 1760
1740  LET C[J4,M4]=C[J4,M4]+S[I8,2]
1750  LET Y[J4,M4]=Y[J4,M4]+S[I8,1]
1760  IF B[M4,J4]=0 THEN 1780
1770  GOTO 1800
1780  LET C[M4,J4]=C[M4,J4]+S[I9,2]
1790  LET 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  LET I8=0
1870  LET I9=0
1880  FOR M4=1 TO 5
1890  LET K4=J4+M4-1
1900  LET L4=I4+M4-1
1910  LET K5=10-K4
1920  LET I8=I8+B[K4,L4]
1930  LET 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  LET I8=I8+1
1980  LET I9=I9+1
1990  FOR M4=1 TO 5
2000  LET K4=J4+M4-1
2010  LET L4=I4+M4-1
2020  LET K5=10-K4
2030  IF B[K4,L4]=0 THEN 2050
2040  GOTO 2070
2050  LET C[K4,L4]=C[K4,L4]+S[I8,2]
2060  LET Y[K4,L4]=Y[K4,L4]+S[I8,1]
2070  IF B[K5,L4]=0 THEN 2090
2080  GOTO 2110
2090  LET C[K5,L4]=C[K5,L4]+S[I9,2]
2100  LET 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 ";
2171  LET Z9=J3
2172  GOSUB 9400
2173  LET Z9=I3
2174  GOSUB 9400
2175  PRINT " IS OFF THE BOARD "
2180  GOTO 700
2190  REM HERE IF SQUARE IS OCCUPIED
2200  PRINT "SQUARE ";
2201  LET Z9=J3
2202  GOSUB 9400
2203  LET Z9=I3
2204  GOSUB 9400
2205  PRINT " 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  LET J3=INT(Q9/100)
2470  LET I3=INT(Q9/10)-J3*10
2480  LET Q1=Q9-10*I3-100*J3
2490  RETURN 
2500  LET J3=INT(Q9/10)
2510  LET I3=Q9-J3*10
2540  RETURN 
2550  IF Q1=0 THEN 2850
2560  PRINT 
2580  PRINT "  ";
2590  FOR I=1 TO 9
2600  PRINT " ";
2601  LET Z9=I
2602  GOSUB 9400
2603  PRINT " ";
2610  NEXT I
2620  PRINT 
2630  FOR I=1 TO 9
2640  LET 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  LET K=J
2700  LET Z9=I
2701  GOSUB 9400
2702  PRINT " ";
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  GOSUB 3020
2760  GOTO 2820
2770  GOSUB 3050
2780  GOTO 2820
2790  GOSUB 3080
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 
3000  REM SUBS FOR PRINTING PIECES
3010  REM EMPTY POSITION...
3020  PRINT " . ";
3030  RETURN 
3040  REM COMPUTER PIECE...
3050  PRINT " X ";
3060  RETURN 
3070  REM PLAYER PIECE...
3080  PRINT " O ";
3090  RETURN 
9395  REM *** INTEGER PRINT SUBROUTINE ***
9396  REM UP TO 6 DIGITS -999999 TO 999999, NO SPACES PRINTED
9397  REM NUMBER TO PRINT IN Z9, Z8 AND Z7 USED FOR TEMPS
9398  REM IF OUT OF RANGE JUST PRINTS
9399  REM IF NOT INTEGER JUST PRINTS
9400  IF ABS(Z9) <= 999999. THEN 9405
9401  IF Z9=INT(Z9) THEN 9405
9402  PRINT Z9
9403  RETURN 
9405  IF Z9 >= 0 THEN 9420
9410  PRINT "-";
9420  LET Z8=ABS(Z9)
9430  LET Z8=INT(Z8)
9440  IF Z8<10 THEN 9560
9450  IF Z8<100 THEN 9530
9460  IF Z8<1000 THEN 9500
9461  IF Z8<10000 THEN 9470
9462  IF Z8<100000. THEN 9466
9463  LET Z7=INT(Z8/100000.)
9464  LET Z8=Z8-Z7*100000.
9465  GOSUB 9700
9466  LET Z7=INT(Z8/10000)
9467  LET Z8=Z8-Z7*10000
9468  GOSUB 9700
9470  LET Z7=INT(Z8/1000)
9480  LET Z8=Z8-Z7*1000
9490  GOSUB 9700
9500  LET Z7=INT(Z8/100)
9510  LET Z8=Z8-Z7*100
9520  GOSUB 9700
9530  LET Z7=INT(Z8/10)
9540  LET Z8=Z8-Z7*10
9550  GOSUB 9700
9560  LET Z7=Z8
9570  GOSUB 9700
9580  RETURN 
9695  REM DIGIT PRINT SUBROUTINE, DIGIT IN Z7
9700  IF Z7=1 THEN 9810
9710  IF Z7=2 THEN 9830
9720  IF Z7=3 THEN 9850
9730  IF Z7=4 THEN 9870
9740  IF Z7=5 THEN 9890
9750  IF Z7=6 THEN 9910
9760  IF Z7=7 THEN 9930
9770  IF Z7=8 THEN 9950
9780  IF Z7=9 THEN 9970
9790  PRINT "0";
9800  RETURN 
9810  PRINT "1";
9820  RETURN 
9830  PRINT "2";
9840  RETURN 
9850  PRINT "3";
9860  RETURN 
9870  PRINT "4";
9880  RETURN 
9890  PRINT "5";
9900  RETURN 
9910  PRINT "6";
9920  RETURN 
9930  PRINT "7";
9940  RETURN 
9950  PRINT "8";
9960  RETURN 
9970  PRINT "9";
9980  RETURN 
9999  END 

