Part 33 Example programs Programs... Renumber Clock Bustout Telly tennis Renumber This short program is an aid to the renumbering facility provided by the edit menu's 'Renumber' option. If you MERGE this program into the program you are developing (or wish to renumber), you will be able to select both the starting line number and the step size (between successive program lines). Type 'RUN 9000' to run the program, enter the start line (in the range 1...9999), enter the step size (in the range 1...9999), then press the EDIT key and select the 'Renumber' option from the edit menu. 9000 INPUT "Start size",st 9010 INPUT "Step size",sp 9020 LET hst= INT (st/256) 9030 LET hsp= INT (sp/256) 9040 POKE 23413,st-256*hst 9050 POKE 23414,hst 9060 POKE 23415,sp-256*hsp 9070 POKE 23416,hsp 9080 PRINT "Press EDIT then select Renumber option" Clock This program sets up the +3 as an analogue (and digital) clock. Type RUN to start the program, enter the hour (in the range 1...12) and enter the minute (in the range 0...59). The clock will then start. 10 DIM s(60): DIM c(60) 20 BORDER 0: PAPER 0: BRIGHT 1: INK 7: CLS 30 PRINT AT 10,1;"Hold on while I calculate" 40 PRINT AT 11,2;"some sines and cosines" 50 GO SUB 370 60 LET z$="00" 70 CLS 80 INPUT "What hour is it ";h 90 INPUT "How many minutes past ";m 100 LET s=0: POKE 23672,0: POKE 23673,0 110 IF h=12 THEN LET h=0 120 LET xc=112: LET yc=90: LET r=70: LET rh=r/2: LET rm=r*3/4: LET rs=r*5/6 130 CIRCLE xc,yc,r 140 INK 1 150 FOR i=0 TO 359 STEP 30 160 PLOT (r+1)*s(i/6+1)+xc,(r+1)*c(i/6+1)+yc 170 NEXT i 180 INK 4 190 OVER 1: GO SUB 500 200 GO SUB 470 210 GO SUB 440 220 LET tm=INT ((PEEK 23672+256*PEEK 23673)/50) 230 IF s+1=tm THEN LET os=s: LET s=s+1: GO TO 250 240 GO TO 220 250 IF s=60 THEN LET s=0: POKE 23672,0: POKE 23673,0: LET om=m: LET m=m+1: GO TO 290 260 PLOT xc,yc: DRAW rs*s(os+1),rs*c(os+1) 270 GO SUB 440 280 GO TO 220 290 IF m=60 THEN LET m=0: LET oh=h: LET h=h+1: GO TO 330 300 PLOT xc,yc: DRAW rm*s(om+1),rm*c(om+1) 310 GO SUB 470 320 GO TO 260 330 IF h=12 THEN LET h=0 340 PLOT xc,yc: DRAW rh*s(oh*5+1),rh*c(oh*5+1) 350 GO SUB 500 360 GO TO 300 370 PRINT AT 14,0 380 FOR i=6 TO 360 STEP 6 390 PRINT "."; 400 LET s(i/6)=SIN ((i-6)*PI/180) 410 LET c(i/6)=COS ((i-6)*PI/180) 420 NEXT i 430 RETURN 440 PLOT xc,yc: DRAW rs*s(s+1),rs*c(s+1) 450 LET s$=STR$ (s): PRINT OVER 0;AT 18,27; INK 4;":"; INK 6; z$( TO 2-LEN (s$));s$ 460 RETURN 470 PLOT xc,yc: DRAW rm*s(m+1),rm*c(m+1) 480 LET m$=STR$ (m): PRINT OVER 0;AT 18,24; INK 2;":"; INK 5; z$( TO 2-LEN (m$));m$ 490 RETURN 500 PLOT xc,yc: DRAW rh*s(h*5+1),rh*c(h*5+1) 510 LET ph=h: IF ph=0 THEN LET ph=12 520 LET h$=STR$ (ph): PRINT OVER 0; INK 3;AT 18,22;" "( TO 2-LEN (h$));h$ 530 RETURN Bustout This program provides a colourful and entertaining little game for one player against the computer. To play the game, type RUN, then press any key to start. Options: Cursor left moves the bat left. Cursor right moves the bat right. The space bar trades a life for a new screen. See if you can get the highest 'hiscore'! Note the following when typing in the listing: 1. The "BBBBBBB..."s shown in lines 30 and 50 are graphics characters. They are produced by pressing the GRAPH key once (to switch graphics mode on), typing the charactres (using the 'B' key), then pressing the GRAPH key again (to switch graphics mode off). 2. The "3333"s shown in line 210 are also graphics characters. Again, they are produced by pressing GRAPH once, pressing the '3' key four times, then pressing GRAPH again. (Note that these characters will look like black blocks on the screen.) 3. The "A" shown in line 430 is also a graphics character. Again, it is produced by pressing GRAPH once, pressing the 'A' key once, then pressing GRAPH again. 10 BORDER 0: INK 0: PAPER 0: CLS : BRIGHT 1 20 GO SUB 560 30 LET b$="BBBBBBBBBBBBBBBBBBBBBBBBBBBB": REM 28 Bs 40 LET s$=" ": REM 32 spaces 50 PRINT AT 3,12; INK 7; FLASH 1;"BUSTOUT"; FLASH 0;AT 6,9; INK 1;"B"; INK 7;" = 20 Points";AT 8,9; INK 4;"B"; INK 7;" = 10 Points";AT 10,9; INK 2;"B"; INK 7;" = 5 Points" 60 PRINT AT 14,1; INK 4;"Press SPACE or FIRE to trade";AT 16,3; "a life for a new sheet." 70 PAUSE 200 80 LET hiscore=0 90 LET tscore=0 100 LET lives=5 110 LET score=0 120 CLS 130 INK 7: PLOT 12,13: DRAW 0,160: DRAW 230,0: DRAW 0,-160: INK 0 140 PRINT AT 1,2; INK 1;b$;AT 2,2; INK 4;b$ 150 FOR r=5 TO 6: PRINT AT r,2; INK 2;b$: NEXT r 160 LET bx=9 170 PRINT AT 19,5; INK 6;"PRESS ANY KEY TO START";AT 17,4; "Use < and > to move bat" 180 PAUSE 0 190 PRINT AT 19,5; INK 0;s$( TO 24);AT 20,0;s$( TO 32);AT 17,4;s$( TO 24) 200 PRINT AT 21,0; INK 0;s$( TO 32): GO SUB 540: GO TO 220 210 PRINT AT 20,bx; INK 0;" "; INK 5;"3333"; INK 0;" ": RETURN 220 LET xa=1: LET ya=1: IF INT (RND*2)=1 THEN LET xa=-xa 230 GO SUB 210 240 LET x=bx+4: LET y=11: LET xc=x: LET yc=y 250 REM main loop 260 IF score>1100 THEN GO TO 110 270 IF INKEY$=" " OR INKEY$="0" THEN IF lives>1 THEN LET lives=lives-1: GO TO 110 280 LET xc=x+xa: LET yc=y+ya 290 REM scan the keyboard 300 GO SUB 470 310 IF yc=20 THEN IF ATTR (yc,xc)=69 THEN PLAY "N1g": LET ya=-ya: LET yc=yc-2: IF xc=bx+1 OR xc=bx+4 THEN LET xa=-xa: LET xc=x+xa 320 IF yc=21 THEN PLAY "O3N7#d": PRINT AT y,x;" ": GO TO 450 330 GO SUB 470 340 IF yc=20 THEN GO TO 430 350 LET t=ATTR (yc,xc) 360 IF t=71 THEN GO TO 410 370 IF t=64 THEN GO TO 420 380 LET ya=-ya: LET xz=xc: LET yz=yc: LET yc=yc+ya: GO SUB 510: IF t=66 THEN PLAY "N1e": LET score=score+5: LET tscore=tscore+5: GO SUB 540: GO TO 350 390 IF t=68 THEN PLAY "N1c": LET score=score+10: LET tscore=tscore+10: GO SUB 540: GO TO 350 400 IF t=65 THEN PLAY "N1a": LET score=score+20: LET tscore=tscore+20: GO SUB 540: GO TO 350 410 LET xa=-xa: LET xc=xc+2*xa: PLAY "N1f" 420 IF yc=1 THEN LET ya=1 430 PRINT AT y,x; INK 0;" ";AT yc,xc; INK 3;"B": LET x=xc: LET y=yc 440 GO TO 250 450 LET lives=lives-1: IF lives=0 THEN GO TO 530 460 GO SUB 540: GO TO 220 470 LET a$=INKEY$ 480 IF (a$=CHR$ (8) OR a$="6") AND bx>1 THEN LET bx=bx-1: GO SUB 210: RETURN 490 IF (a$=CHR$ (9) OR a$="7") AND bx<25 THEN LET bx=bx+1: GO SUB 210: RETURN 500 RETURN 510 IF yz=20 THEN RETURN 520 PRINT AT yz,xz; INK 0;" ": RETURN 530 GO SUB 540: PRINT AT 10,10; INK 7;"GAME OVER";AT 12,8;"You scored : "; tscore: FOR i=1 TO 300: NEXT i: GO TO 90 540 IF tscore>hiscore THEN LET hiscore=tscore 550 PRINT AT 21,11; INK 6;"HISCORE ";hiscore;AT 21,1;"SCORE ";tscore; AT 21,24;"LIVES ";lives: RETURN 560 FOR i=USR "a" TO USR "b"+7 570 READ b 580 POKE i,b 590 NEXT i 600 RETURN 610 REM ball 620 DATA 0,60,126,126,126,126,60,0 630 REM brick 640 DATA BIN 11111111 650 DATA BIN 10000001 660 DATA BIN 10111101 670 DATA BIN 10111101 680 DATA BIN 10111101 690 DATA BIN 10111101 700 DATA BIN 10000001 710 DATA BIN 11111111 Telly tennis This program sets up the +3 to play one of the most well-known and enduring of computer games. For two players, or one player against the computer. Type RUN to start the program, then type '1' or '2' (for the number of players) to play. Options: Player 1 - 'A' moves the bat up, 'Z' moves the bat down. Player 2 - 'K' moves the bat up, 'M' moves the bat down. The first player to score 15 points wins. Note the following when typing in the listing: 1. The "66"s shown in lines 150 are graphics characters. They are produced by pressing the GRAPH key once (to switch graphics mode on), typing the charactres (using the 'B6 key), then pressing the GRAPH key again (to switch graphics mode off). (Note that these characters will look like black blocks on the screen.) 2. The "8"s shown in lines 150, 250 and 540 are also graphics characters. Again, they are produced by pressing GRAPH once, holding down CAPS SHIFT and pressing the '8' key once, then pressing GRAPH again. (Again, note that these characters will look like black blocks on the screen.) 3. The "A" shown in line 330 is also a graphics character. Again, it is produced by pressing GRAPH once, pressing the 'A' key once, then pressing GRAPH again. 10 PAPER 4: INK 0: BRIGHT 0: BORDER 4 20 CLS 30 GO SUB 730 40 DIM x(2): DIM y(2): DIM p(2) 50 LET comp=1: LET sc1=0: LET sc2=0: LET z$="0" 60 PRINT AT 2,9; INK 7;"TELLY TENNIS" 70 PRINT AT 8,3;"ONE OR TWO PLAYERS (1/2)?" 80 LET i$=INKEY$ 90 IF i$="1" THEN PRINT AT 12,8;"Use A to go up";AT 14,8; "and Z to go down": GO TO 120 100 IF i$="2" THEN PRINT AT 10,3;"Player 1 use A to go up";AT 12,12; "and Z to go down";AT 14,3;"Player 2 use K to go up";AT 16,12; "and M to go down": LET comp=0: GO TO 120 110 GO TO 80 120 FOR i=0 TO 200: NEXT i 130 LET x(1)=2: LET y(1)=3 140 LET x(2)=29: LET y(2)=18 150 LET e$="8": LET f$="66" 160 PRINT AT 1,0; 170 GO SUB 400: REM top edge 180 FOR i=3 TO 19 190 PRINT AT i,0; INK 6;f$; INK 0;TAB 30; INK 6;f$ 200 NEXT i 210 PRINT AT 20,0; 220 GO SUB 400: REM bottom edge 230 PRINT AT 0,0; INK 1;"Player 1: 00";AT 0,19; INK 2;"Player 2 : 00" 240 LET n=INT (RND*2) 250 FOR i=1 TO 2: PRINT AT y(i),x(i); INK i;"8";AT y(i)+1,x(i);"8": NEXT i 260 IF n=0 THEN LET xb=21: LET dx=1: GO TO 280 270 LET xb=19: LET dx=-1 280 LET yb=12: LET dy=INT (RND*3)-1 290 GO SUB 440: REM move bats 300 LET oxb=xb: LET oyb=yb: LET scd=0 310 GO SUB 580: REM move ball 320 PRINT AT oyb,oxb; INK 0;" " 330 PRINT AT yb,xb; INK 7;"8" 340 IF scd=0 THEN GO TO 290 350 PRINT AT yb,xb; INK 0;" " 360 GO SUB 380 370 GO TO 240 380 PRINT AT 0,10; INK 1;z$( TO 2-LEN (STR$ (sc1)));sc1;AT 0,30; INK 2; z$( TO 2-LEN (STR$ (sc2)));sc2 390 RETURN 400 FOR i=1 TO 64 410 PRINT INK 5;e$; 420 NEXT i 430 RETURN 440 LET a$=INKEY$ 450 IF a$="a" THEN LET p(1)=-1 460 IF a$="z" THEN LET p(1)=2 470 IF comp=1 THEN LET p(2)=(2*(y(2)<(yb))-(y(2)>(yb))): GO TO 500 480 IF a$="k" THEN LET p(2)=-1 490 IF a$="m" THEN LET p(2)=2 500 FOR i=1 TO 2 510 LET a=ATTR (y(i)+p(i),x(i)) 520 IF p(i)=2 THEN LET p(i)=1 530 IF a=32 THEN PRINT INK 0;AT y(i),x(i);" ";AT y(i)+1,x(i);" "; AT y(i)+1,x(i);" ": LET y(i)=y(i)+p(i) 540 PRINT AT y(i),x(i); INK i;"8";AT y(i)+1,x(i);"8" 550 LET p(i)=0 560 NEXT i 570 RETURN 580 LET w=ATTR (yb+dy,xb+dx) 590 IF w=32 THEN LET xb=xb+dx: LET yb=yb+dy: RETURN 600 IF w=33 OR w=34 THEN LET dx=-dx: PLAY "V15O7N1g": LET dy=INT (RND*3-1): RETURN 610 IF w=38 THEN GO TO 640 620 IF w=37 THEN PLAY "V15O7N1c": LET dy=-dy 630 RETURN 640 PLAY "O3V15#d": IF dx>0 THEN LET sc1=sc1+1: GO TO 660 650 LET sc2=sc2+1 660 LET d=(sc1=15)+2*(sc2=15): LET scd=1 670 IF d<>0 THEN GO SUB 380: PRINT INK 7;AT 10,8;"Player ";d;" wins."; AT 12,7;"Play again (y/n)?": GO TO 690 680 RETURN 690 IF INKEY$="" THEN GO TO 690 700 IF INKEY$="y" THEN RUN 710 IF INKEY$="n" THEN STOP 720 GO TO 690 730 FOR i=0 TO 7 740 READ n 750 POKE USR "a"+i,n 760 NEXT i 770 RETURN 780 DATA 0,60,126,126,126,126,60,0