10 REM GOMOK.ECB 11 REM ...5/72 CONTRIBUTED BY GREG THAGARD 12 DIM A(9,9),B(9,9),C(9,9),Y(9,9),S(31,2),A$(9),P$(3) 13 PRINT "&K&J" 14 PRINT TAB(15);"G O M O K U": PRINT 20 PRINT " DO YOU NEED INSTRUCTIONS (Y OR N)"; 40 INPUT (1,0)" ---=>",D$: LET D$=D$+"N" 50 IF D$(1,1)="N" THEN 210 ELSE PRINT 60 PRINT " GOMOKU IS AN EXPANDED VERSION OF TIC-TAC-TOE, ON A 9X9" 70 PRINT " (INSTEAD OF 3X3) BOARD;" 80 PRINT " A WINNING STRING IS 5 (INSTEAD OF 3) IN A ROW" 90 PRINT " EITHER HORIZONTAL, VERTICAL, OR IN EITHER DIAGONAL," 100 PRINT " AS IN TIC-TAC-TOE." 110 PRINT 120 PRINT " WHEN IT IS YOUR TURN TO MOVE, ENTER A 2 DIGIT NUMBER" 130 PRINT " (11 TO 99) WHERE THE FIRST PLACE REPRESENTS THE ROW" 140 PRINT " IN WHICH YOU WISH TO PLAY, AND THE SECOND IS THE COLUMN" 150 PRINT 155 INPUT (1,0)"*** TYPE ANY LETTER when ready to see more ---=>",Z$ 156 PRINT "&K&J" 160 PRINT " PRINT OPTIONS ARE IMPLEMENTED BY ADDING A THIRD DIGIT TO" 165 PRINT " THE MOVE NUMBER;" 170 PRINT " A '0' TO SUPPRESS PRINTING OF THE BOARD," 180 PRINT " A '1' TO ALLOW ONLY A PARTIAL BOARD TO BE PRINTED, OR " 185 PRINT " A '2' TO RESTORE PRINTING OF THE COMPLETE BOARD." 186 PRINT " A SINGLE DIGIT 0, 1, OR 2 WILL RESET THE PRINT OPTION " 187 PRINT " AND THEN PRINT THE BOARD. " 188 PRINT 190 PRINT " WE WILL ALTERNATE MOVING FIRST; AFTER EVERY MOVE I " 200 PRINT " WILL THINK FOR A SHORT TIME." 210 PRINT 220 PRINT " DO YOU WANT TO MOVE FIRST (Y OR N)"; 230 INPUT (1,0)" ---=>",C$: LET C$=C$+"N" 235 IF C$(1,1)="N" THEN LET D1=1 ELSE LET D1=-1 250 FOR I=1 TO 25: LET S(I,1)=0: LET S(I,2)=0: NEXT I 260 FOR I=1 TO 9 270 FOR J=1 TO 9: LET Y(I,J)=0: NEXT J 280 NEXT I 285 DATA 1,2,9,9,0,0 290 READ A9,Q1,J9,I9,G1,G2 300 LET A$="123456789": LET P$="+CY" 320 DATA 1,3,11,43,168421,3.36842E+06 330 DATA 1,3,11,43,168421,3.36842E+06 340 FOR I=1 TO 6: READ S(I,1): NEXT I 350 READ S(1,2),S(7,2),S(13,2),S(19,2),S(25,2),S(31,2) 460 REM...THIS IS THE BEGINNING OF THE GAME 470 LET G1=G1+1 500 REM...CLEAR THE BOARD FOR A NEW GAME 510 FOR I=1 TO 9 520 FOR J=1 TO 9: LET B(I,J)=0: NEXT J 530 NEXT I 560 IF D$(1,1)<>"Y" THEN 600 570 IF C$(1,1)<>"Y" THEN 600 580 GOSUB 2560 590 LET D$=" " 600 LET F3=0 610 LET D1=-D1 620 IF D1=1 THEN 710 630 LET J4=5: LET I4=5 650 REM...Here to show the computor move 660 PRINT " I MOVE TO ";A$(I4,I4);A$(J4,J4); 670 LET B(I4,J4)=1 680 GOSUB 1440 690 IF F3=-1 THEN 1180 700 IF C4+Y4=0 THEN 1110 705 GOSUB 2550 710 REM...HERE TO PROMPT THE USER FOR HIS MOVE 720 PRINT " WHAT IS YOUR MOVE"; 730 GOSUB 2440 740 IF (I3-1)*(9-I3)<0 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 930 IF C4+Y4=0 THEN 1110 940 IF Y4>=16800 THEN 650 1060 LET I4=I8: LET J4=J8 1080 REM...GOSUB 2310 1090 REM...GO TO PRINT THE BOARD 1100 GOTO 650 1110 REM...HERE FOR A DRAW 1120 PRINT " This game is a draw...": PRINT 1130 GOTO 1340 1180 REM...HERE FOR COMPUTER WINS 1190 PRINT " , AND WIN THE GAME" 1193 GOSUB 2560 1200 LET 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 LET 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. 1360 PRINT " WILL YOU PLAY ANOTHER GAME (Y OR N)"; 1370 INPUT (1,0)" ---=>",C$: LET C$=C$+"N" 1380 IF C$(1,1)="Y" THEN 470 ELSE 9999 1400 REM...HERE FOR USER WINS. 1410 PRINT " YOU WIN GAME NO.";G1 1413 GOSUB 2560 1420 LET G2=0 1430 GOTO 1340 1440 REM...CALCULATE THE VALUES OF ALL THE SQUARES ON THE BOARD. 1450 FOR I=1 TO 9 1460 FOR J=1 TO 9: LET Y(I,J)=0: LET C(I,J)=0: NEXT J 1465 NEXT I 1470 LET F1=1: LET F2=1 1500 REM...TRY THE HORIZONTAL WAYS OF WINNING 1501 FOR I=1+2 TO I9-2 1502 FOR J=1 TO J9 1503 LET L1=B(I-2,J)+B(I-1,J)+B(I,J)+B(I+1,J)+B(I+2,J) 1504 FOR M=-2 TO 2 1505 IF B(I+M,J)<>0 THEN 1509 1506 LET Y(I+M,J)=Y(I+M,J)+S(L1+1,1) 1507 LET C(I+M,J)=C(I+M,J)+S(L1+1,2) 1509 NEXT M 1511 LET F1=F1*SGN(L1-5) 1512 LET F2=F2*SGN(L1-30) 1518 NEXT J 1519 NEXT I 1520 REM...TRY THE VERTICAL WAYS OF WINNING 1521 FOR I=1 TO I9 1522 FOR J=1+2 TO J9-2 1523 LET L2=B(I,J-2)+B(I,J-1)+B(I,J)+B(I,J+1)+B(I,J+2) 1524 FOR M=-2 TO 2 1525 IF B(I,J+M)<>0 THEN 1529 1526 LET Y(I,J+M)=Y(I,J+M)+S(L2+1,1) 1527 LET C(I,J+M)=C(I,J+M)+S(L2+1,2) 1529 NEXT M 1531 LET F1=F1*SGN(L2-5) 1532 LET F2=F2*SGN(L2-30) 1538 NEXT J 1539 NEXT I 1540 REM...TRY THE DIAGONAL WAYS OF WINNING 1541 FOR I=1+2 TO I9-2 1542 FOR J=1+2 TO J9-2 1543 LET L3=B(I+2,J+2)+B(I+1,J+1)+B(I,J)+B(I-1,J-1)+B(I-2,J-2) 1544 LET L4=B(I+2,J-2)+B(I+1,J-1)+B(I,J)+B(I-1,J+1)+B(I-2,J+2) 1545 FOR M=-2 TO 2 1546 IF B(I+M,J+M)<>0 THEN 1549 1547 LET Y(I+M,J+M)=Y(I+M,J+M)+S(L3+1,1) 1548 LET C(I+M,J+M)=C(I+M,J+M)+S(L3+1,2) 1549 IF B(I+M,J-M)<>0 THEN 1559 1557 LET Y(I+M,J-M)=Y(I+M,J-M)+S(L4+1,1) 1558 LET C(I+M,J-M)=C(I+M,J-M)+S(L4+1,2) 1559 NEXT M 1561 LET F1=F1*SGN((L3-5)*(L4-5)) 1562 LET F2=F2*SGN((L3-30)*(L4-30)) 1568 NEXT J 1569 NEXT I 1580 LET F3=ABS(F1)-ABS(F2) 1800 REM...FIND THE MAXIMUMS 1810 LET Y4=0 1815 LET C4=0 1820 FOR I=1 TO I9 1830 FOR J=1 TO J9 1840 IF Y(I,J)<=Y4 THEN 1875 1850 LET Y4=Y(I,J) 1860 LET I4=I: LET I7=I: LET J4=J: LET J7=J 1875 LET C(I,J)=C(I,J)+A9*Y(I,J) 1880 IF C(I,J)",Q9 2450 IF Q9<100 THEN 2500 2453 IF Q9>=1000 THEN 2430 2460 LET I3=INT(Q9/100) 2470 LET J3=INT(Q9/10)-I3*10 2480 LET Q1=Q9-100*I3-10*J3 2490 RETURN 2500 LET I3=INT(Q9/10) 2510 LET J3=Q9-10*I3 2520 ON Q9+1 GOTO 2550,2545,2545,2220,2340,2400 2530 IF Q9<0 THEN 1360 2540 RETURN 2545 LET Q1=Q9 2550 IF Q1=0 THEN 2850 2560 PRINT 2580 PRINT " "; 2590 FOR I=1 TO 9 2600 PRINT ".";A$(I,I);"."; 2610 NEXT I 2620 PRINT 2630 LET I=1 2640 PRINT A$(I,I);"."; 2642 LET K=9 2644 IF Q1<>1 THEN 2700 2650 FOR K=9 TO 1 STEP -1 2660 IF B(I,K)<>0 THEN 2700 2670 NEXT K 2700 FOR J=1 TO K 2710 IF B(I,J)+(Q1-1)<>0 THEN 2750 2720 PRINT " "; 2730 GOTO 2820 2750 PRINT " ";P$((B(I,J)+9)/5,(B(I,J)+9)/5);" "; 2820 NEXT J 2830 PRINT 2840 LET I=I+1: IF I<10 THEN 2640 2842 PRINT 2850 RETURN 9999 END