0 REM << RR26-1 >> 10 REM 15 REM RUPERT REPORT #26 20 REM ELMAC PLAYS NIM 25 REM 30 PRINT CHR$(147); 40 :REM - - - - - - - - 50 :REM INITIALIZE 55 :REM - - - - - - - - 60 DIM A(3,4,5,12),M(6,3) 70 FALSE=0 : TRUE=NOT FALSE 80 BK$="[157][157][157][157][157][157][157][157][157][157]" 90 SP$=" " 100 L$="======================================" 105 POKE53280,0:POKE53281,6 110 PRINT "ELMAC "TAB(53)"PLAYS NIM" : PRINT 120 OPEN 15,8,15 :REM DISK ERROR CHANNEL 125 :REM - - - - - - - - - - - - 130 REM - - BEGIN NEW GAME - - 140 :REM - - - - - - - - - - - - 150 :REM READ KEYBOARD 160 GOSUB 2110 170 :REM PLAYER CHOSEN YET? 180 IF PL=0 THEN 160 190 :REM MOVE ARRAY FILLED YET? 200 IF F0=1 THEN 230 210 :REM FILL MOVE ARRAY INITIALLY 220 PRINT : PRINT "THINKING ..." : GOSUB 1580 : F0=1 230 IF NOT MDCHG THEN 300 240 :REM NEW GAME IN NEW MODE 250 PRINT CHR$(147); : LL=5 : GOSUB 2400 : MDCHG=FALSE 260 :REM 270 :REM <><><> MAIN GAME LOOP <><><><> 280 :REM 290 :REM NEW GAME IN PREVIOUS MODE 300 X=3 : Y=4 : Z=5 : MN=0 310 :REM DOES ELMAC GO FIRST? 320 IF RND(0)<.5 THEN 380 330 :REM OTHER PLAYER'S MOVE 340 ON PL GOSUB 810,1790 350 :REM DID OTHER PLAYER WIN? 360 IF X+Y+Z=0 THEN WIN=FALSE :GOTO 460 370 :REM ELMAC'S TURN 380 GOSUB 530 390 :REM DID ELMAC LOSE? 400 IF TM=0 THEN WIN=FALSE : GOTO 460 410 :REM DID ELMAC MAKE LAST MOVE? 420 IF X+Y+Z=0 THEN WIN=TRUE : GOTO 460 430 :REM READY FOR NEXT MOVE 440 GOTO 340 450 :REM GO TO GAME OVER ROUTINE 460 GOSUB 970 470 :REM HAS ANY KEY BEEN PRESSED? 480 GET R$ : IF R$<>"" THEN 160 490 :REM START NEXT GAME, SAME MODE 500 GOTO 300 510 :REM <><><> END OF GAME LOOP <><><> 520 :REM - - - - - - - - - - 530 REM ELMAC'S MOVE 540 :REM - - - - - - - - - - 550 :REM HOW MANY VALID MOVES? 560 TM=A(X,Y,Z,0) 570 :REM RETURN IF NO VALID MOVES; ELMAC LOST 580 IF TM=0 THEN 790 590 :REM SELECT NEXT MOVE 600 RN=INT(RND(0)*TM)+1 610 :REM STEP THRU THE CHOICES TO FIND THE SELECTED MOVE 620 CT=0 : FOR P=1 TO 12 630 CT=CT+A(X,Y,Z,P) : MV=P 640 :REM FOUND MOVE VALUE (MV=1 TO 12) 650 IF CT>=RN THEN P=12 660 NEXT P 670 :REM RECORD THE MOVE 680 MN=MN+1 : M(MN,0)=MV : M(MN,1)=X 690 M(MN,2)=Y : M(MN,3)=Z 700 :REM SAVE THE BOARD 710 X0=X : Y0=Y : Z0=Z 720 :REM MV STORES THE SELECTED MOVE 730 IF MV<4 THEN X=X-MV : GOTO 770 740 IF MV<8 THEN Y=Y-MV+3 : GOTO 770 750 Z=Z-MV+7 760 :REM SHOW BOARD AFTER MOVE 770 PRINT "ELMAC: ";X;Y;Z 780 :REM NEXT MOVE 790 RETURN 800 :REM - - - - - - - - - - - 810 REM RANDOM PLAYER 820 :REM - - - - - - - - - - - 830 :REM PICK RANDOM MOVE 840 ROW=INT(RND(0)*3)+1 850 IF ROW=1 THEN MAX=X 860 IF ROW=2 THEN MAX=Y 870 IF ROW=3 THEN MAX=Z 880 :REM IF ROW EMPTY, TRY AGAIN 890 IF MAX=0 THEN 840 900 NUM=INT(RND(0)*MAX)+1 910 IF ROW=1 THEN X=X-NUM 920 IF ROW=2 THEN Y=Y-NUM 930 IF ROW=3 THEN Z=Z-NUM 940 PRINT "RANDOM:";X;Y;Z 950 RETURN 960 :REM - - - - - - - - - - 970 REM GAME OVER 980 :REM - - - - - - - - - - 990 :REM INCREMENT NUMBER OF GAMES 1000 NG=NG+1 1010 IF WIN=TRUE THEN 1110 1020 :REM > > ELMAC LOST! < < 1030 :REM PUNISH THE LAST MOVE 1040 LAST=A(X0,Y0,Z0,MV) 1050 A(X0,Y0,Z0,MV)=0 1060 A(X0,Y0,Z0,0)=A(X0,Y0,Z0,0)-LAST 1070 :REM INCREMENT NUMBER OF LOSSES 1080 NL=NL+1 1090 :REM UPDATE SCREEN 1100 GOTO 1220 1110 :REM > > ELMAC WON! < < 1120 :REM INCREMENT NUMBER OF WINS 1130 NW=NW+1 1140 :REM REWARD ALL WINNING MOVES 1150 FOR J=1 TO MN 1160 X1=M(J,1) : Y1=M(J,2) : Z1=M(J,3) 1170 M1=M(J,0) 1180 A(X1,Y1,Z1,M1)=A(X1,Y1,Z1,M1)+1 1190 A(X1,Y1,Z1,0)=A(X1,Y1,Z1,0)+1 1200 NEXT J 1210 :REM UPDATE SCREEN 1220 IF PL=1 THEN 1260 1230 IF WIN THEN PRINT "ELMAC WON. PRESS ANY KEY." 1240 IF NOT WIN THEN PRINT "YOU WON. PRESS ANY KEY." 1250 GET R$ : IF R$="" THEN 1250 1260 FOR J=1 TO 8 : PRINT SP$ : NEXT J :LL=1 : GOSUB 2400 1270 WSTRK=WSTRK+1 1280 IF NOT WIN THEN WSTRK=0 1290 IF WSTRK>WMAX THEN WMAX=WSTRK 1300 PRINT "# GAMES, WINS, LOSSES % WIN" 1310 PRINT TAB(2)NG;TAB(9)NW;TAB(16)NL;TAB(25)LEFT$(STR$(100*NW/NG)+" ",7) 1320 PRINT "CURRENT/LONGEST WIN STREAK ";BK$;WSTRK;"/";WMAX : PRINT L$ 1330 :REM READY FOR NEW GAME 1340 RETURN 1350 :REM - - - - - - - - - - - - - - - 1360 REM DISPLAY & SAVE MOVE ARRAY 1370 :REM - - - - - - - - - - - - - - - 1375 :REM DISPLAY MOVE ARRAY 1380 PRINT CHR$(147) 1390 FOR I=0 TO 3 : FOR J=0 TO 4 1400 FOR K=0 TO 5 : PRINT "";I;J;K;"[146]" 1410 FOR P=0 TO 12 : PRINT A(I,J,K,P); : NEXT P 1420 PRINT :GET R$ :IF R$<>"" THEN I=3 :J=4 : K=5 1430 NEXT K : NEXT J : NEXT I 1440 :REM SAVE MOVE ARRAY TO DISK 1450 INPUT "SAVE THIS ARRAY (Y/N)";A$ 1460 IF A$<>"Y" THEN 1560 1470 INPUT "WHAT FILENAME";F$ 1480 :REM CREATE MOVE ARRAY IF IT'S NOT ALREADY LOADED 1490 IF F0=0 THEN PRINT "ONE MOMENT ..." : GOSUB 1580 : F0=1 1500 OPEN 1,8,8,F$+",S,W" : GOSUB 2500 1510 FOR I=0 TO 3 : FOR J=0 TO 4 1520 FOR K=0 TO 5 : FOR P=0 TO 12 1530 PRINT#1,A(I,J,K,P) 1540 NEXT P,K,J,I 1550 PRINT#1 : CLOSE 1 1560 RETURN 1570 :REM - - - - - - - - - - - - - - - 1580 REM FILL MOVE ARRAY INITIALLY 1590 :REM - - - - - - - - - - - - - - - 1600 FOR X=0 TO 3 : FOR Y=0 TO 4 1610 FOR Z=0 TO 5 1620 A(X,Y,Z,0)=X+Y+Z 1630 IF X<>0 THEN FOR P=1 TO X : A(X,Y,Z,P)=1 : NEXT P 1640 IF Y<>0 THEN FOR P=4 TO Y+3:A(X,Y,Z,P)=1:NEXT P 1650 IF Z<>0 THEN FOR P=8 TO Z+7:A(X,Y,Z,P)=1:NEXT P 1660 NEXT Z,Y,X 1670 RETURN 1680 :REM - - - - - - - - - - - - - - - 1690 REM FILL MOVE ARRAY FROM FILE 1700 :REM - - - - - - - - - - - - - - - 1710 INPUT"LOAD FROM WHAT FILE";F$ 1720 OPEN 1,8,8,F$+",S,R" : GOSUB 2500 1730 FOR I=0 TO 3 : FOR J=0 TO 4 1740 FOR K=0 TO 5 : FOR P=0 TO 12 1750 INPUT#1,A(I,J,K,P) 1760 NEXT P,K,J,I : CLOSE 1 1770 RETURN 1780 :REM - - - - - - - - 1790 REM USER PLAYS 1800 :REM - - - - - - - - 1810 B(1)=X : B(2)=Y : B(3)=Z 1820 FOR J=1 TO 5 : PRINT SP$ :NEXT J 1830 LL=10 : GOSUB 2400 1840 PRINT "ROW 1 =";X 1850 PRINT "ROW 2 =";Y 1860 PRINT "ROW 3 =";Z 1870 PRINT " " 1880 PRINT ""SP$"[145]" 1890 INPUT "PICK FROM WHICH ROW";RW$ 1900 :REM M = BACK TO MENU & RESTART 1910 IF RW$="M" THEN 160 1920 RW=VAL(RW$) 1930 IF RW<1 OR RW>3 THEN 1820 1940 :REM 0 = EMPTY ROW 1950 IF B(RW)=0 THEN 1820 1960 LL=17 : GOSUB 2400 1970 PRINT SP$"[145]" 1980 PRINT "TAKE HOW MANY FROM ROW";RW; 1990 INPUT TK$ : IF TK$="M" THEN 160 2000 TK=VAL(TK$) 2010 :REM TAKE TOO MANY? 2020 IF TK>B(RW) THEN 1960 2030 :REM CHOOSE A DIFFERENT ROW 2040 IF TK<1 THEN 1820 2050 B(RW)=B(RW)-TK 2060 X=B(1) : Y=B(2) : Z=B(3) 2070 LL=5 : GOSUB 2400 2080 PRINT "USER: ";X;Y;Z 2090 RETURN 2100 :REM - - - - - - - - - - 2110 REM READ KEYBOARD 2120 :REM - - - - - - - - - - 2130 PRINT : PRINT SP$,SP$ : PRINT L$ 2140 PRINT "PRESS FOR RANDOM COMPUTER TO PLAY AGAINST ELMAC" 2150 PRINT"PRESS

TO PLAY AGAINST ELMAC " 2160 PRINT "PRESS TO LOAD THE MOVE ARRAY FROM DISK" 2170 PRINT "PRESS TO DISPLAY THE MOVE ARRAY " 2180 PRINT "PRESS TO SAVE THE MOVE ARRAY TO DISK" : PRINT : PRINT 2190 GET R$ : IF R$="" THEN 2190 2200 PRINT R$ 2205 :REM MODE CHANGE 2210 MDCHG=TRUE 2220 :REM RANDOM COMPUTER PLAYS 2230 IF R$="C" THEN PL=1 : RETURN 2240 :REM USER PLAYS 2250 IF R$="P" THEN PL=2 : RETURN 2255 :REM DISPLAY THE MOVE ARRAY 2260 IF R$<>"D" THEN 2290 2270 IF F0=0 THEN PRINT "THINKING..." : GOSUB 1580 : F0=1 2280 GOSUB 1360 : RETURN 2285 :REM SAVE THE MOVE ARRAY 2290 IF R$="S" THEN GOSUB 1450 :RETURN 2300 :REM LOAD THE MOVE ARRAY 2310 IF R$="L" THEN GOSUB 1690 : F0=1 : RETURN 2320 GOTO 2130 :REM BAD KEY 2400 REM LOCATE CURSOR AT COLUMN ONE OF LINE LL (LL=1 TO 24) 2410 POKE 214,LL-1 : PRINT 2420 RETURN 2500 REM CHECK DISK ERROR STATUS 2510 INPUT#15,EN,EM$,ET,ES 2520 IF EN<20 THEN 2550 2530 PRINT EN;EM$;ET;ES : CLOSE 15 : CLOSE 1 : GOTO 120 2540 :REM NO ERROR 2550 RETURN