10 REM PROGRAM EUREKA 20 REM Version B.1.0 30 REM Author Alan Gray 40 REM BEEBUG 1993 50 REM Program subject to copyright 60 : 70 MODE 7 80 VDU19,7,0,0;0;0; 100 DIM tag(6),m$(9),rn(6),sc%(8) 110 b$=CHR$132+CHR$157+CHR$131 120 r$=CHR$129+CHR$157+CHR$135 130 cy$=CHR$134+CHR$157+CHR$132 140 d$=CHR$141 150 topsc%=100 160 FOR j=1 TO 9:READ m$(j):NEXT 170 REPEAT 180 FOR j%=1 TO 8:sc%(j%)=0:NEXT 190 n%=0 200 REPEAT 210 n%=n%+1 220 FOR j%=1 TO 6:tag(j%)=0:NEXT 230 PROCscreen(8) 240 PRINTTAB(3,4)"Try to match the target using" 250 PRINTTAB(3,5)"A B C D E F and / only once" 260 PRINTTAB(3,6)"combined with ( ) + - and *" 270 PRINTTAB(3,7)"Complying with BBC Basic syntax" 280 A=RND(4) 290 REPEAT:B=RND(4):UNTIL B<>A 300 C=RND(6)+4:D=RND(6)+4 310 REPEAT:E=RND(6)+4:UNTIL E<>D 320 F=RND(4)*25 330 IF F=25 T%=RND(499)+100 ELSE T%=RND(899)+100 340 rn(1)=A:rn(2)=B:rn(3)=C 350 rn(4)=D:rn(5)=E:rn(6)=F 360 PRINTTAB(16,9);"Round ";n%; 370 PRINTTAB(3,11);"Target number= ";T% 380 PRINTTAB(3,15);"To correct input errors" 390 PRINTTAB(3,16);"Press delete key,which" 400 PRINTTAB(3,17);"erases the whole line." 410 FOR j=1 TO 6 420 PRINTTAB(32,10+j);CHR$(64+j);"=";rn(j) 430 NEXT 440 f$="":pos=0:pdiv=0:br1=0:br2=0 450 TIME=0:nc=0:pc=0 460 PRINTTAB(0,21); 470 REPEAT 480 ch=GET:ok=0:test=-1 490 IF ch=127 THEN ch=7:PROCdel 500 IF ch>64 AND ch<71 THEN PROCvar 510 IF ch>41 AND ch<46 THEN PROCoper 520 IF ch=40 OR ch=41 THEN PROCbrac 530 IF ch=47 THEN PROCdiv 540 IF ok THEN PROCformula 550 IF ch=13 AND pos=0 THEN ch=7:PROCerr(9) 560 IF ch=13 AND pc=3 THEN ch=7:PROCerr(7) 570 IF ch=13 AND br1<>br2 THEN ch=7:PROCerr(2) 580 UNTIL ch=13 590 time%=TIME/100 600 IF pdiv>0 THEN PROCchdiv 610 FOR L%=15 TO 17:PRINTTAB(3,L%);SPC(25):NEXT 620 PROCscore 630 sc%(n%)=score 640 PRINTTAB(3,24)"PRESS ANY KEY TO CONTINUE"; 650 w=GET 660 UNTIL n%=8 670 CLS:PROCtable 680 UNTIL FALSE 690 END 700 : 1000 DEFPROCscreen(s%) 1010 CLS 1020 FOR j=0 TO 2:PRINTcy$:NEXT 1030 FOR j=3 TO s%:PRINTb$:NEXT 1040 FOR j=s%+1 TO 19:PRINTr$:NEXT 1050 FOR j=20 TO 22:PRINTcy$:NEXT 1060 PRINTTAB(16,1)d$;"EUREKA" 1070 PRINTTAB(16,2)d$;"EUREKA" 1080 ENDPROC 1090 : 1100 DEFPROCdel 1110 FOR j=1 TO pos 1120 PRINTTAB(j+7,21);" " 1130 PRINTTAB(j+7,22);" " 1140 NEXT 1150 f$=" ":pos=0:pdiv=0:br1=0:br2=0:nc=0:pc=0 1160 FOR j=1 TO 6:tag(j)=0:NEXT 1170 FOR j=1 TO 6 1180 PRINTTAB(28,10+j);r$:NEXT 1190 ENDPROC 1200 : 1210 DEFPROCformula 1220 f$=f$+CHR$(ch):pos=pos+1 1230 PRINTTAB(6,21)d$;TAB(pos+7,21);CHR$(ch) 1240 PRINTTAB(6,22)d$;TAB(pos+7,22);CHR$(ch) 1250 ENDPROC 1260 : 1270 DEFPROCvar 1280 IF pc=2 OR pc=4 THEN PROCerr(8):ENDPROC 1290 IF tag(ch-64)=0 THEN ok=-1:pc=4:tag(ch-64)=1:nc=nc+1 ELSE PROCerr(5) 1300 IF ok PRINTTAB(28,ch-54);b$ 1310 ENDPROC 1320 : 1330 DEFPROCoper 1340 IF nc=6 THEN PROCerr(1):ENDPROC 1350 IF ch=44 ENDPROC 1360 IF pc=2 OR pc=4 THEN ok=-1:pc=3 1370 ENDPROC 1380 : 1390 DEFPROCdiv 1400 IF pdiv>0 THEN PROCerr(3):ENDPROC 1410 IF pc=0 OR pc=1 OR pc=3 THEN PROCerr(8):ENDPROC 1420 IF pdiv=0 THEN pdiv=pos+1:ok=-1:pc=3 1430 ENDPROC 1440 : 1450 DEFPROCchdiv 1460 test=-1 1470 den$=MID$(f$,pdiv+1,1) 1480 num$=MID$(f$,pdiv-1,1) 1490 IF den$="(" THEN n=pdiv+1:PROCfcb 1500 IF num$=")" THEN n=pdiv-1:PROCfob 1510 den%=EVAL(den$) 1520 IF den%=0 THEN test=0:PROCerr(4):END 1530 IF NOT test PROCerr(1):ENDPROC 1540 div$=num$+"/"+den$ 1550 num=EVAL(div$) 1560 IF ABS(num-INT(num))<.0001 THEN test=-1 ELSE test=0:PROCerr(6):ENDPROC 1570 ENDPROC 1580 : 1590 DEFPROCfcb 1600 REPEAT 1610 n=n+1 1620 IF MID$(f$,n,1)="(" THEN PROCfcb 1630 UNTIL MID$(f$,n,1)=")" OR n=LEN(f$) 1640 IF MID$(f$,n,1)=")" THEN den$=MID$(f$,pdiv+1,n) 1650 ENDPROC 1660 : 1670 DEFPROCfob 1680 REPEAT 1690 n=n-1 1700 IF MID$(f$,n,1)=")" THEN PROCfob 1710 UNTIL MID$(f$,n,1)="(" OR n=1 1720 IF MID$(f$,n,1)="(" THEN num$=MID$(f$,pdiv-1) 1730 ENDPROC 1740 : 1750 DEFPROCbrac 1760 IF br2=br1 AND ch=41 PROCerr(8):ENDPROC 1770 IF ch=40 AND (pc=2 OR pc=4)PROCerr(8):ENDPROC 1780 IF ch=41 AND (pc=1 OR pc=3)PROCerr(8):ENDPROC 1790 IF br1<3 AND ch=40 br1=br1+1:ok=-1:pc=1 1800 IF br2top% top%=sc%(j%) 2120 IF sc%(j%)>0 THEN bon=bon+bon 2130 NEXT 2140 PRINTTAB(4,13)"Total ",tot% 2150 tot%=tot%+bon 2160 IF tot%>topsc% THEN topsc%=tot% 2170 PRINTTAB(4,15)"Bonus ",bon 2180 PRINTTAB(4,17)"Score ",tot% 2190 PRINTTAB(4,21)" Another game? Y/N" 2200 REPEAT:an$=GET$:UNTIL an$="Y" OR an$="N" 2210 IF an$="N" END 2220 ENDPROC 2230 : 2240 DATA "All Variables have been used" 2250 DATA "Missing bracket" 2260 DATA "Only one divide allowed" 2270 DATA "You can't divide by zero" 2280 DATA "That variable already used" 2290 DATA "Division not integer" 2300 DATA "You can't end with an operator" 2310 DATA "You can't enter that character" 2320 DATA "You pressed RETURN by mistake"