Now you can improve your memory and have fun at the same time with this program which emulates the 'Simon' hand-held toys.
The BBC Micro will generate an ever-growing sequence of tones and colours which you must imitate. You use the cursor keys to repeat the sequence which the computer has just played. It will then add a further tone/colour to the sequence, and you must repeat it from the beginning.
10 REM SIMPLE SIMON 20 30 MODE 2 40 ON ERROR GOTO 1680 50 PROC_INITIALISE 60 70 REPEAT 80 PROC_SHOWOFF 90 PROC_NEWGAME 100 REPEAT 110 PROC_GENERATESEQUENCE 120 PROC_FOLLOWSEQUENCE 130 UNTIL WRONG OR CHEAT 140 IF WRONG THEN PROC_SHOWSEQUENCE 150 UNTIL NOT FN_ANOTHER 160 170 MODE 7 180 PROC_RESTORE 190 END 200 210 DEF PROC_SHOWOFF 220 *FX 15 230 pressed=FALSE 240 REPEAT 250 FOR actual=0 TO 7 260 FOR logical=3 TO 9 STEP 2 270 VDU 19,logical,(actual+(logi cal/2)) MOD 8,0,0,0 280 NEXT logical 290 PROC_BUZZ(1+(RND(40)MOD4),25) 300 IF NOT INKEY(0) THEN pressed=T RUE 310 IF pressed THEN actual=7 320 PROC_DELAY(25) 330 NEXT actual 340 UNTIL pressed 350 VDU 19,3,1,0,0;19,5,2,0,0;19,7,3,0 ,0;1,9,4,0,0; 360 ENDPROC 370 380 DEF PROC_DRAW 390 VDU 19,0,7,0,0;19,1,0;0;19,3,0;0;1 9,5,0;0;19,7,0;0;19,9,0;0; 400 VDU 29,512;512; 410 PX%=0:PY%=0:CX%=50:CY%=50 420 FOR A%=0 TO 90 STEP 9 430 sin=SINRAD(A%):cos=COSRAD(A%) 440 X%=500*sin:Y%=500*cos 450 GCOL 1,1 460 MOVE 0,0:MOVE PX%,PY%:PLOT 85,X% ,Y% 470 MOVE 0,0:MOVE -PX%,PY%:PLOT 85,- X%,Y% 480 MOVE 0,0:MOVE PX%,-PY%:PLOT 85,X %,-Y% 490 MOVE 0,0:MOVE -PX%,-PY%:PLOT 85, -X%,-Y% 500 PX%=X%:PY%=Y%:X%=50+400*sin:Y%=5 0+400*cos 510 GCOL 0,3:MOVE -50,50:MOVE -CX%,C Y%:PLOT 85,-X%,Y% 520 GCOL 0,5:MOVE 50,50:MOVE CX%,CY% :PLOT 85,X%,Y% 530 GCOL 0,7:MOVE 50,-50:MOVE CX%,-C Y%:PLOT 85,X%,-Y% 540 GCOL 0,9:MOVE -50,-50:MOVE -CX%, -CY%:PLOT 85,-X%,-Y% 550 CX%=X%:CY%=Y% 560 NEXT A% 570 VDU 29,0;0;5 580 GCOL 0,6 590 MOVE 320,544:PRINT"SIMPLE" 600 MOVE 352,500:PRINT"SIMON" 610 VDU 4,19,3,1,0,0;19,5,2,0,0;19,7,3 ,0,0;19,9,4,0,0; 620 ENDPROC 630 640 DEF PROC_INITIALISE 650 VDU 23,0,10,32,0;0;0; 660 vol=-10:REM sound volume 670 PROC_BUZZ(0,500) 680 PROC_DRAW 690 max=19 700 DIM colour%(max) 710 *FX 4 1 720 *FX 11 0 730 ENDPROC 740 750 DEF PROC_DELAY(delay) 760 LOCAL finishtime 770 finishtime=TIME+delay 780 REPEAT UNTIL TIME>=finishtime 790 ENDPROC 800 810 DEF PROC_NEWGAME 820 WRONG=FALSE:CHEAT=FALSE 830 end=0 840 PROC_BUZZ(0,1275) 850 COLOUR 6:COLOUR 129 860 PRINT TAB(13,1);"READY!" 870 REPEAT UNTIL GET$="Y" 880 PROC_BUZZ(0,0) 890 COLOUR 128 900 PRINT TAB(13,1);"[spc6]" 910 ENDPROC 920 930 DEF PROC_GENERATESEQUENCE 940 current=0 950 REPEAT 960 IF current=end THEN colour%(curr ent)=1+(RND(40) MOD 4) 970 PROC_FLASH(colour%(current),40) 980 current=current+1 990 UNTIL current>end 1000 end=current 1010 IF current>max THEN CHEAT=TRUE 1020 COLOUR 6:COLOUR 129 1030 PRINT TAB(17,1);end 1040 ENDPROC 1050 1060 DEF PROC_FOLLOWSEQUENCE 1070 *FX 15 1 1080 FOR digit=0 TO end-1 1090 REPEAT 1100 key=INKEY(500) 1110 UNTIL (key>=136 AND key<=139) OR key=TRUE 1120 col=key-135 1130 IF col<>colour%(digit) THEN WRON G=TRUE 1140 IF WRONG THEN digit=end-1 1150 IF NOT WRONG THEN PROC_FLASH(col ,30) 1160 NEXT digit 1170 IF WRONG THEN PROC_BUZZ(0,250):PRO C_DELAY(300) 1180 PROC_DELAY(50) 1190 ENDPROC 1200 1210 DEF PROC_SHOWSEQUENCE 1220 FOR current=0 TO end-1 1230 PROC_FLASH(colour%(current),30) 1240 NEXT 1250 PROC_DELAY(150) 1260 ENDPROC 1270 1280 DEF PROC_BUZZ(col,dur) 1290 IF col<1 THEN SOUND &110,vol,3,dur /5:SOUND &111,0,101,dur/5:ENDPROC 1300 SOUND &12,vol,48+(12*col),dur/5 1310 ENDPROC 1320 1330 DEF PROC_FLASH(colour,delay) 1340 VDU 19,1+(2*colour),0;0; 1350 PROC_BUZZ(colour,delay) 1360 PROC_DELAY(delay) 1370 VDU 19,1+(2*colour),colour,0,0; 1380 PROC_DELAY(delay) 1390 ENDPROC 1400 1410 DEF FN_ANOTHER 1420 COLOUR 6 1430 FOR out=1 TO 2 1440 IF CHEAT THEN 1500 1450 PRINT TAB(15,0);"You" 1460 PRINT TAB(12,1);"finished" 1470 PRINT TAB(13,2);end-1;" run"; 1480 IF end-1<>1 THEN PRINT"s" 1490 GOTO 1510 1500 PRINT TAB(13,0);"CHEAT!" 1510 PRINT TAB(14,27);"Would" 1520 PRINT TAB(15,28);"you" 1530 PRINT TAB(14,29);"like" 1540 PRINT TAB(12,30);"to play" 1550 PRINT TAB(12,31);"again ?"; 1560 *FX 15 1 1570 IF out=1 THEN REPEAT key$=GET$:U NTIL key$="Y" OR key$="N" 1580 COLOUR 128:COLOUR 0 1590 NEXT 1600 IF key$="Y" THEN =TRUE ELSE =FALSE 1610 1620 DEF PROC_RESTORE 1630 *FX 4 1640 *FX 12 1650 *FX 15 0 1660 ENDPROC 1670 1680 MODE 7 1690 PROC_RESTORE 1700 REPORT:PRINT" AT LINE ";ERL
Mastercode
This clever computer implementation of the ever-popular 'coloured pegs in holes, deduce the code' game is now ready to challenge your wits. Full instructions are within the program.
10 REM Mastercode 20 30 MODE 7 40 PROC_init 50 REPEAT 60 PROC_new_game 70 REPEAT 80 PROC_guess 90 PROC_display 100 UNTIL correct OR guess%=10 110 UNTIL NOT FN_another 120 *FX 4 130 END 140 150 DEF PROC_init 160 VDU 23,0,10,32,0;0;0; 170 *FX 4 1 180 DIM play%(9),comp%(9),temp%(9) 190 ENDPROC 200 210 DEF PROC_new_game 220 FOR A%=1 TO 9 230 play%(A%)=-1:comp%(A%)=-1 240 NEXT 250 CLS 260 PRINT TAB(12,0);CHR$(141);"[fs1]Ma stercode[fs7]" 270 PRINT TAB(12,1);CHR$(141);"[fs1]Ma stercode[fs7]" 280 PRINT'CHR$(141);"[fs3]Instructions :" 290 PRINT CHR$(141);"[fs3]Instructions :"' 300 PRINT"[fs6][spc3][ [fs3]Moves cur sor to the left" 310 PRINT"[fs6][spc3]] [fs3]Moves cur sor to the right" 320 PRINT"[fs6] ^[fs3]&[fs6]v[fs3]Chan ges colour" 330 PRINT"[fs6]RETURN[fs3]Enters the g uess" 340 PRINT''"[fs2]How many holes (3-9) ? "; 350 REPEAT H$=GET$ 360 H%=VAL(H$) 370 UNTIL H%>2 AND H%<10 380 PRINT H$ 390 FOR A%=1 TO H% 400 comp%(A%)=RND(8)-1 410 NEXT 420 guess%=0 430 CLS 440 PRINT TAB(7,0);"[fs3]Mastercode";T AB(25,1);"[fs1]STATUS" 450 FOR A%=1 TO H% 460 PRINT TAB(2+2*A%,2);A%; 470 NEXT 480 ENDPROC 490 500 DEF PROC_guess 510 guess%=guess%+1 520 PRINT TAB(0,23);"[fs1]Move ";guess %;"[fs3]Your guess ?"; 530 PRINT TAB(0,1+2*guess%);"[fs1]";gu ess%;"[fs7]"; 540 P%=1 550 FOR A%=1 TO H% 560 play%(A%)=0 570 VDU 31,1+2*A%,1+2*guess%,32,32 580 NEXT 590 REPEAT 600 PRINT TAB(2+2*P%,2+2*guess%);"^" ; 610 K%=GET 620 PRINT TAB(2+2*P%,2+2*guess%);" " 630 IF K%=136 THEN P%=P%-1 640 IF K%=137 THEN P%=P%+1 650 IF P%=0 THEN P%=H% 660 IF P%=H%+1 THEN P%=1 670 IF K%=138 THEN play%(P%)=play%(P %)-1 680 IF K%=139 THEN play%(P%)=play%(P %)+1 690 IF play%(P%)=-1 THEN play%(P%)=7 700 IF play%(P%)=8 THEN play%(P%)=0 710 PRINT TAB(1+2*P%,1+2*guess%); 720 IF play%(P%)=0 THEN VDU 32,32 EL SE VDU 144+play%(P%),255 730 UNTIL K%=13 740 PRINT TAB(0,2+2*guess%);SPC(39); 750 PRINT TAB(0,23);SPC(39); 760 ENDPROC 770 780 DEF PROC_display 790 W%=0:V%=0 800 FOR A%=1 TO H% 810 temp%(A%)=comp%(A%) 820 NEXT 830 FOR S%=1 TO H% 840 IF play%(S%)=comp%(S%) THEN V%=V %+1:play%(S%)=100:temp%(S%)=50 850 NEXT 860 FOR S%=1 TO H% 870 FOR T%=1 TO H% 880 IF play%(S%)=temp%(T%) AND S%< >T% THEN W%=W%+1:temp%(T%)=89:play%(T%)= 99 890 NEXT T% 900 NEXT S% 910 PRINT TAB(22,1+2*guess%);STRING$(V %,"[fs2]O");STRING$(W%,"[fs3]O"); 920 IF V%=H% THEN correct=TRUE ELSE co rrect=FALSE 930 ENDPROC 940 950 DEF FN_another 960 PRINT TAB(0,22); 970 IF correct THEN PRINT"[fs1]You gue ssed it in ";guess%;" go(es)." ELSE PRIN T"[fs1]Sorry. No more moves allowed." 980 PRINT'"Another Go ?"; 990 REPEAT K$=GET$ 1000 UNTIL K$="Y" OR K$="N" 1010 CLS 1020 =(K$="Y")
Barrage
In this fine two-player game you'll find yourself facing a great screen display of a barrage in the form of a mountain. You're told the wind speed and direction, and the aim of the game is, of course, to lob shells over the mountain to try and destroy each other's tanks.
10 REM BARRAGE 20 MODE 1 30 PROC_initialise 40 REPEAT 50 PROC_initialiseplay 60 PROC_drawlandscape 70 REPEAT 80 REPEAT 90 PROC_play 100 UNTIL hit 110 PROC_scores 120 UNTIL destroyed 130 UNTIL NOT FN_anothergame 140 END 150 160 REM PROCedures 170 180 DEF PROC_initialise 190 DIM hght%(1),kill%(1),skill%(1),ta nk%(1),name$(1) 200 VDU 19,0,4,0,0,0 210 VDU 19,2,0,0,0,0 220 VDU 19,3,2,0,0,0 230 VDU 23,128,0,7,15,15,255,255,127,3 1, 23,129,4,200,240,240,254,255,252,248 240 VDU 23,130,32,19,15,15,127,255,63, 31, 23,131,0,224,240,240,255,255,252,248 250 VDU 23,132,&40,&A0,&40,0,0,0,0,0 260 VDU 23,133,-1,-1,-1,-1,-1,-1,-1,-1 270 VDU 23,0,10,32,0;0;0; 280 *FX 9 2 290 *FX 10 2 300 rnd=RND(-TIME) 310 g=9.81 320 COLOUR 3 330 PRINT''"Skill level's"' 340 RESTORE 1980 350 FOR level=1 TO 5 360 READ SKILL$ 370 PRINT level;") ";SKILL$ 380 NEXT 390 FOR player%=0 TO 1 400 COLOUR player%+1 410 PRINT'"Player ";player%+1;"'s na me :"; 420 INPUT""name$(player%):name$(play er%)=LEFT$(name$(player%),10) 430 IF name$(player%)="" THEN name$( player%)="PLAYER "+STR$(player%+1) 440 PRINT'name$(player%);"'s skill l evel 1-5"'"(novice to expert) :"; 450 REPEAT KEY$=GET$ 460 UNTIL KEY$>"0" AND KEY$<"6" 470 RESTORE 1980 480 FOR level=1 TO VAL(KEY$) 490 READ SKILL$ 500 NEXT 510 PRINT SKILL$ 520 skill%(player%)=VAL(KEY$) 530 NEXT 540 PRINT''"Press SPACE BAR to play"; 550 REPEAT UNTIL GET=32 560 COLOUR 128:COLOUR 1 570 ENDPROC 580 DEF PROC_drawlandscape 590 VDU 26,16 600 VDU 24,0;0;1279;1023;29,0;128; 610 GCOL 0,3 620 hght%(0)=RND(100) 630 height=hght%(0) 640 maxh=hght%(0) 650 step=30 660 FOR xcord=0 TO 1279 STEP step 670 MOVE xcord,-128 680 MOVE xcord+step,-128 690 PLOT 85,xcord,height 700 IF xcord>minx AND xcord<midx THE N height=height+RND(40) 710 IF xcord>midx AND xcord<maxx THE N height=height-RND(40) 720 IF height<0 THEN height=0 730 PLOT 85,xcord+step,height 740 IF height>maxh THEN maxh=height 750 NEXT xcord 760 IF height>0 THEN hght%(1)=height E LSE hght%(1)=0 770 VDU 5,18,0,1,25,4,tank%(0);hght%(0 )+32;128,129 780 VDU 18,0,2,25,4,tank%(1);hght%(1)+ 32;130,131,4 790 GCOL 0,2 800 ENDPROC 810 DEF PROC_initialiseplay 820 destroyed=FALSE 830 minx=100+RND(200) 840 midx=540+RND(200) 850 maxx=1179-RND(200) 860 tank%(0)=RND(minx-64) 870 tank%(1)=maxx+RND(1215-maxx) 880 kill%(0)=0 890 kill%(1)=0 900 first=RND(2)-1 910 ENDPROC 920 DEF PROC_play 930 COLOUR 131 940 hit=FALSE 950 wind=RND(30)-15 960 COLOUR 0:VDU 28,0,31,39,28 970 PRINT TAB(9,0);"WIND SPEED ";ABS(w ind);" Kmh "; 980 IF wind<0 THEN PRINT"WEST " 990 IF wind>0 THEN PRINT"EAST " 1000 IF wind=0 THEN PRINT"[spc6]" 1010 VDU 28,0,31,39,29 1020 FOR player%=first TO 1 1030 first=0 1040 REPEAT 1050 CLS:COLOUR player%+1 1060 VDU 5,18,0,1,25,4,tank%(0);hgh t%(0)+32;128,129,18,0,2,25,4,tank%(1);hg ht%(1)+32;130,131,4 1070 PRINT name$(player%);"'s go." 1080 INPUT"Angle of elevation 10[fs 4]-69[fs4] :"ANG 1090 UNTIL ANG>9 AND ANG<70 1100 ANG=RAD(ANG) 1110 VDU 28,0,31,39,31 1120 REPEAT 1130 INPUT"Velocity 1-19 kmh :";VEL 1140 UNTIL VEL>0 AND VEL<20 1150 PRINT"Velocity 1-19 kmh :";VEL; 1160 VDU 28,0,31,39,29 1170 VEL=VEL*10 1180 X1%=FNX(ANG,VEL,.1,player%) 1190 Y1%=FNY(ANG,VEL,.1,player%) 1200 offset=0 1210 GCOL 0,1 1220 TIME=10 1230 REPEAT 1240 X%=FNX(ANG,VEL,TIME/50,player% ) 1250 Y%=FNY(ANG,VEL,TIME/50,player% ) 1260 IF SGN(midx-X%)=SGN(wind) OR Y %>=maxh THEN offset=offset+(wind/10) 1270 X%=X%+offset 1280 SOUND &11,-10,Y%DIV4,5 1290 PLOT 71,X1%,Y1% 1300 X1%=X%:Y1%=Y% 1310 C%=POINT(X%,Y%) 1320 PLOT 69,X%,Y% 1330 UNTIL X%<0 OR X%>1280 OR (C%<> 0 AND Y%<1200) 1340 GCOL 0,3:PLOT 69,X%,Y% 1350 SOUND &10,-10,6,10 1360 FOR Y1%=Y% TO maxh STEP 4 1370 C%=POINT(X%,Y1%) 1380 IF C%=1 OR C%=2 THEN hit=TRUE: Y1%=maxh 1390 IF C%=0 THEN Y1%=maxh 1400 NEXT 1410 IF (C%=1 AND player%=1) OR (C%=2 AND player%=0) THEN hit=TRUE 1420 IF (X%<midx AND Y%<=hght%(0)) OR (X%>midx AND Y%<=hght%(1)) OR hit THEN 1540 1430 VDU 18,0,0,5 1440 REPEAT CY%=POINT(X%,Y%) 1450 REPEAT CX%=POINT(X%,Y%) 1460 MOVE X%-16,Y%+28:VDU 133 1470 X%=X%+(26*SGN(X%-midx)) 1480 UNTIL CX%<>3 1490 X%=X1% 1500 Y%=Y%+32 1510 UNTIL CY%<>3 1520 VDU4 1530 temp=player% 1540 IF hit THEN player%=1 1550 NEXT 1560 player%=temp 1570 ENDPROC 1580 DEF PROC_scores 1590 VDU 19,1+((player%+1) MOD 2),12,0, 0,0 1600 S%=1:V%=0 1610 REPEAT V%=V%+S% 1620 SOUND 0,-V%,6,2 1630 IF V%=15 THEN S%=-1 1640 UNTIL V%=0 1650 kill%(player%)=kill%(player%)+1 1660 IF kill%(player%)=skill%(player%) THEN destroyed=TRUE 1670 IF player%=0 THEN VDU 19,2,0,0,0,0 ELSE VDU 19,1,1,0,0,0 1680 CLS:COLOUR player%+1 1690 PRINT name$(player%);" has scored a hit."; 1700 FOR person%=0 TO 1 1710 COLOUR person%+1 1720 PRINT 'name$(person);": ";TAB(11 );kill%(person%);"/";skill%(person%); 1730 NEXT 1740 *FX 15 1 1750 delay=GET 1760 ENDPROC 1770 DEF FN_anothergame 1780 IF skill%(player%)<5 THEN skill%(p layer%)=skill%(player%)~1 1790 CLS 1800 PRINT "Do you wish start another battle :"; 1810 *FX 15 1 1820 REPEAT 1830 KEY$=GET$ 1840 UNTIL KEY$="Y" OR KEY$="N" 1850 PRINT KEY$ 1860 IF KEY$="N" THEN =FALSE 1870 PRINTname$(player%);"'s skill leve l is now ";skill%(player%)'"ie "; 1880 RESTORE 1980 1890 FOR level=1 TO skill%(player%) 1900 READ SKILL$ 1910 NEXT 1920 PRINT SKILL$ 1930 A=GET 1940 =TRUE 1950 DEF FNX(ang,vel,time,player) 1960 IF player=0 THEN =tank%(player%)+5 6+vel*time*COS(ang) ELSE =tank%(player%) -(vel*time*COS(ang))+8 1970 DEF FNY(ang,vel,time,player)=hght% (player)+28+(vel*time*SIN(ang)-(0.5*g*ti me^2)) 1980 DATA Rubbish,Passable,Average,Good ,Brilliant
Hangman
Now you can play the 'guess the word I'm thinking of, before you get hanged' game against the BBC Micro. The computer chooses a word from its DATA store (from line 890) then challenges you to guess it before a complete picture of a hanged man is drawn using PROC_HANG (from line 660). Once you've played a few hundred games with this program, and you know the words, change them to a vocabulary of your own choice. Make sure you list of words ends with '_999', as you can see in line 980.
10 REM HANG MAN 20 30 MODE 7 40 PROC_INIT 50 REPEAT 60 WORD$=FN_WORD(RND(W%)) 70 PROC_DISP(WORD$) 80 REPEAT 90 PROC_GUESS 100 UNTIL GOT OR HUNG 110 PROC_RESULTS 120 UNTIL NOT FN_ANOTHER 130 END 140 DEF PROC_INIT 150 PRINT TAB(15,2);"[fs1]HANGMAN[fs7] "'' 160 PRINT''"[fs8][fs2]COUNTING WORDS[f s9]"; 170 W%=0 180 REPEAT READ WORD$ 190 IF WORD$<>"-999" THEN W%=W%+1 200 Z=POS:PRINT ;W%;STRING$(POS-Z,CH R$(8)); 210 UNTIL WORD$="-999" 220 ENDPROC 230 DEF FN_WORD(P%) 240 LOCAL C%,CHOSEN$ 250 RESTORE 890 260 FOR C%=1 TO P% 270 READ CHOSEN$ 280 NEXT 290 ALP$="ABCDEFGHIJKLMNOPQRSTUVWXYZ" 300 =CHOSEN$ 310 DEF PROC_DISP(OUT$) 320 LOCAL P%,C$ 330 CLS 340 PRINT TAB(0,0);"[fs3]Not used:[fs2 ]";ALP$ 350 PRINT TAB(0,2);"[fs3]Guesses :[fs2 ]0" 360 PRINT TAB(0,4);"[fs3]Wrong[spc3]:[ fs2]0" 370 FOR P%=1 TO LEN(OUT$) 380 PRINT TAB(14-(LEN(OUT$) DIV 2)+P %,20); 390 IF MID$(OUT$,P%,1)="" THEN PRINT " " ELSE PRINT"-" 400 NEXT 410 PRINT TAB(9,23);"[fs6]Your guess:[ fs3]"; 420 GUESS$=STRING$(LEN(OUT$)," ") 430 wrong=0:GUESSES=0 440 ENDPROC 450 DEF PROC_GUESS 460 LOCAL KEY$,P%,WRONG 470 WRONG=TRUE 480 PRINT TAB(22,23); 490 REPEAT KEY$=GET$ 500 IF KEY$>="a" AND KEY$<="z" THEN KEY$=CHR$(ASC(KEY$)-32) 510 UNTIL INSTR(ALP$,KEY$)<>0 AND KE Y$<>" " 520 PRINT KEY$; 530 FOR P%=1 TO LEN(WORD$) 540 IF KEY$=MID$(WORD$,P%,1) THEN PR INT TAB(14-(LEN(WORD$) DIV 2)+P%,20);KEY $:GUES$=LEFT$(GUESS$,P%-1)+KEY$+MID$(GUE SS$,P%+1):WRONG=FALSE 550 NEXT 560 ALP$=LEFT$(ALP$,INSTR(ALP$,KEY$)-1 )+" "+MID$(ALP$,INSTR(ALP$,KEY$)+1) 570 PRINT TAB(11,0);ALP$ 580 GOT=(WORD$=GUESS$) 590 wrong=wrong-WRONG 600 GUESSES=GUESSES+1 610 HUNG=(wrong=10) 620 PRINT TAB(11,2);GUESSES 630 PRINT TAB(11,4);wrong 640 IF WRONG THEN PROC_HANG 650 ENDPROC 660 DEF PROC_HANG 670 ON wrong GOTO 680,690,700,710,720, 730,740,750,760,770 680 PRINT TAB(10,18);"======":ENDPROC 690 PRINT TAB(10,17);STRING$(5,"|"+CHR $(8)+CHR$(11));:ENDPROC 700 PRINT TAB(10,12);"=====":ENDPROC 710 PRINT TAB(14,13);"|":ENDPROC 720 PRINT TAB(14,14);"O":ENDPROC 730 PRINT TAB(14,15);"!":ENDPROC 740 PRINT TAB(13,15);"/":ENDPROC 750 PRINT TAB(15,15);"_":ENDPROC 760 PRINT TAB(13,16);"/":ENDPROC 770 PRINT TAB(15,16);"_":ENDPROC 780 DEF PROC_RESULTS 790 VDU 31,0,23,10,10,10,10,10,10,30,1 1,11,11,11,11 800 IF GOT THEN PRINT"[fs1]You got it in ";GUESSES;" tries.":ENDPROC 810 PRINT"[fs1]You did not get the wor d";:IF INSTR(WORD$," ")<>0 THEN PRINT"s. They were" ELSE PRINT".It was" 820 PRINT"[fs3]";WORD$;"[fs2]You made ";GUESSES;" guesses." 830 ENDPROC 840 DEF FN_ANOTHER 850 PRINT'"[fs6]Would you like another try:"; 860 REPEAT KEY$=GET$ 870 UNTIL KEY$="Y" OR KEY$="y" OR KE Y$="N" OR KEY$="n" 880 IF KEY$="Y" OR KEY$="y" THEN =TRUE ELSE =FALSE 890 DATA ACCUMULATOR,ADDRESS,ALGORITHM ,ALPHANUMERIC,APL,APPLICATION,SOFTWARE,A SCII,ASSEMBLER 900 DATA BASIC,BATCH,BAUD,BENCHMARK,BI NARY,BOOLEAN,ALGEBRA,BOOTSTRAP,BUFFER,BU S,BYTE 910 DATA CPU,CHARACTER,COBOL,COMPILER, CONCATENATE,CPM 920 DATA DATA,DATABASE,DEBUG,DISC,DOCU MENTATION,DOS,DOT MATRIX,DOUBLE DENSITY, DYNAMIC 930 DATA EPROM,ERROR,FIELD,FILE,FIRMWA RE,FLAG,FLOPPY DISC,FLOWCHART,FORTRAN 940 DATA GATE,GIGO,GLOBAL,GRAPHICS,HAR D COPY,HARDWARE,HEXADECIMAL,HEX PAD,HIGH LEVEL 950 DATA INPUT,INPUT,INSTRUCTION,INTER RUPT,INTERPRETER,JOYSTICK,KILOBYTE,LINE PRINTER,LOW LEVEL 960 DATA MACHINE LANGUAGE,MACHINE CODE ,MEMORY,MICROPROCESSOR,MODEM,MONITOR,MOT HERBORAD,MOUSE 970 DATA NETWORK,NUMERIC PAD,OCTAL,ON LINE,OPERATING SYSTEM,OUTPUT,PASCAL,PORT ,PROCEDURE,PROGRAM,PILOT,RAM,REAL TIME,R ANDOM,REFRESH,REGISTER,RESET,ROM 980 DATA SNOBOL,SOFTWARE,STACK,SUBROUT INE,SYNTAX,SYSTEMS,SOFTWARE,THERMAL PRIN TER,TIME SHARING,TURNKEY SYSTEM,WINCHEST ER,UNIX,VMS,VIRTUAL,VOLATILE,"-999"
Solitaire Maze
Here's a game for the very patient and skilled. Written initially by Mike O'Neill and modified by Ian Hutt, Solitaire Maze challenges you to a game of strategy.
You control between one and five circular pieces. There is an equal number of diamond-shaped pieces which do not move during the game. The object of the exercise is to move your pieces around the maze so that ultimately each one covers a different diamond.
A timer runs while the program is underway. This tells you how long it took to complete the latest game, and the fastest time so far.
10 REM Solitaire Maze 20 30 MODE 1 40 PROC_init 50 REPEAT 60 PROC_new_game 70 PROC_maze 80 PROC_setup 90 REPEAT 100 PROC_play 110 UNTIL got=circ 120 UNTIL NOT FN_another 130 PROC_normal 140 END 150 160 DEF PROC_init 170 VDU 23,0,10,32,0;0;0; 180 VDU 23,128,&00,&3E,&7F,&7F,&7F,&7F ,&7F,&3E 190 VDU 23,129,&00,&08,&1C,&3E,&7F,&3E ,&1C,&08 200 VDU 23,130,-1,129,129,129,129,129, 129,-1 210 DIM X%(4),Y%(4) 220 *FX 4 1 230 high=-1 240 COLOUR 1:COLOUR 130 250 PRINT TAB(13,1);"Solitaire Maze" 260 ENDPROC 270 280 DEF PROC_new_game 290 COLOUR 1:COLOUR 128 300 PRINT TAB(0,27);"How many pieces d o you want (1-5) ?"; 310 REPEAT K$=GET$ 320 UNTIL K$>"0" AND K$<"6" 330 circ=VAL(K$) 340 ENDPROC 350 360 DEF PROC_maze 370 CLS 380 RESTORE 390 COLOUR 2 400 PRINT TAB(9,1);"Solitaire Maze"'' 410 FOR Y%=0 TO 21 420 READ S$ 430 FOR X%=1 TO 32 440 IF MID$(S$,X%,1)=" " THEN VDU 32 ELSE VDU 130 450 NEXT X% 460 PRINT 470 NEXT Y% 480 COLOUR 1 490 FOR C%=1 TO circ 500 REPEAT 510 X%=RND(30):Y%=4+RND(20) 520 UNTIL FN_ch(X%,Y%)=" " 530 PRINT TAB(X%,Y%);"[fs1]"; 540 SOUND 1,-3*C%,53+4*C%,1 550 PROC_delay(20) 560 NEXT 570 COLOUR 3 580 FOR C%=0 TO circ-1 590 REPEAT 600 X%(C%)=RND(30):Y%(C%)=4+RND(20 ) 610 UNTIL FN_ch(X%(C%),Y%(C%))=" " 620 PRINT TAB(X%(C%),Y%(C%));"[fs0]" ; 630 SOUND 1,-3*C%,101+4*C%,1 640 PROC_delay(20) 650 NEXT 660 PRINT TAB(33,6);"TIME" 670 PRINT TAB(33,8);"0" 680 IF high=-1 THEN 710 690 PRINT TAB(32,11);"Fastest" 700 PRINT TAB(33,13);high DIV 10 /10 710 ENDPROC 720 730 DEF PROC_setup 740 COLOUR 1 750 PRINT TAB(0,29);"Press SPACE BAR t o start" 760 FOR C%=10 TO 0 STEP -1 770 PRINT TAB(30,29);C%;" " 780 SOUND 1,C%-4,101,5 790 TIME=0 800 *FX 15 1 810 K$=INKEY$(100) 820 IF K$=" " THEN C%=0 ELSE IF K$<> "" THEN K$=INKEY$(100-TIME):GOTO 820 830 NEXT 840 PRINT TAB(0,29);SPC(39); 850 got=0 860 COLOUR 3 870 TIME=0 880 ENDPROC 890 900 DEF PROC_play 910 PRINT TAB(33,8);TIME DIV10 /10 920 K%=INKEY(0) 930 *FX 15 1 940 IF K%<136 THEN ENDPROC 950 DX%=0:DY%=0 960 IF K%=139 THEN DY%=DY%-1 970 IF K%=138 THEN DY%=DY%+1 980 IF K%=136 THEN DX%=DX%-1 990 IF K%=137 THEN DX%=DX%+1 1000 IF DX%=0 AND DY%=0 THEN ENDPROC 1010 FOR C%=0 TO circ-1 1020 C$=FN_ch(X%(C%)+DX%,Y%(C%)+DY%) 1030 IF C$="[fs2]" OR C$="[fs0]" THEN 1080 1040 PRINT TAB(X%(C%),Y%(C%));" "; 1050 X%(C%)=X%(C%)+DX%:Y%(C%)=Y%(C%)+ DY% 1060 PRINT TAB(X%(C%),Y%(C%));"[fs0]" ; 1070 IF C$="[fs1]" THEN COLOUR 2:PRIN T TAB(X%(C%),Y%(C%));"[fs0]":COLOUR 3:X% (C%)=-1:Y%(C%)=-1:got=got+1 1080 NEXT 1090 ENDPROC 1100 1110 DEF FN_another 1120 T%=TIME 1130 PRINT TAB(0,27);"Well done.You com pleted the course in" 1140 PRINT;T% DIV10 /10;" seconds."; 1150 IF T%<high OR high<0 THEN high=T%: PRINT"The fastest time!" 1160 *FX 15 1 1170 PRINT TAB(0,30);"Would you like an other go ?"; 1180 REPEAT K$=GET$ 1190 UNTIL K$="Y" OR K$="N" 1200 VDU 28,0,31,39,26,12,26 1210 =(K$="Y") 1220 1230 DEF PROC_normal 1240 *FX 4 1250 *FX 15 1 1260 CLS 1270 ENDPROC 1280 1290 DEF FN_ch(X%,Y%) 1300 IF X%<1 OR Y%<5 THEN ="[fs2]" 1310 VDU 31,X%,Y% 1320 A%=135 1330 =CHR$((USR(&FFF4)AND&FFFF)DIV&100) 1340 1350 DEF PROC_delay(T%) 1360 t%=TIME+T% 1370 REPEAT UNTIL TIME>=t% 1380 ENDPROC 1390 DATA "############################ ####" 1400 DATA "#[spc17]#[spc3]#[spc8]#" 1410 DATA "# ####### #######[spc3]##### ### # #" 1420 DATA "# #[spc9]#[spc3]# #[spc6]#[s pc3]# #" 1430 DATA "#[spc3]########### # ###### # # # #" 1440 DATA "# # #[spc8]# #[spc6]# # #[s pc3]#" 1450 DATA "# # # ## ### # #######[spc3] #[spc3]# #" 1460 DATA "# # # #[spc4]# #[spc7]# #[sp c3]# # #" 1470 DATA "# #[spc3]# #### ## # ##[spc3 ]# # # # #" 1480 DATA "# # # # #[spc7]# ## # ### # ###" 1490 DATA "# # #[spc3]##### # ##[spc3]# # #[spc3]# #" 1500 DATA "# ### #[spc7]#[spc4]# # # ## #[spc3]#" 1510 DATA "# # # # # ##### # ## #[spc5] # # #" 1520 DATA "# # # #[spc9]# # # # # ### #" 1530 DATA "#[spc7]###### ## ## ### # # #" 1540 DATA "# #####[spc6]#[spc4]#[spc3]# ##[spc3]##" 1550 DATA "###[spc3]# ### ### # # #[spc 4]# # #" 1560 DATA "# # #[spc3]#[spc3]# # #[spc3 ]## #### # ##" 1570 DATA "# #[spc3]#[spc3]#[spc5]# #[s pc9]# #" 1580 DATA "# ### # ### ###[spc3]####### #### #" 1590 DATA "#[spc5]# #[spc7]#[spc5]#[spc 5]# #" 1600 DATA "############################ ####"