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