diff --git a/samples/index.txt b/samples/index.txt index abc6ae5..2005ad3 100644 --- a/samples/index.txt +++ b/samples/index.txt @@ -76,6 +76,7 @@ sample.dye Will You Dye (Brett Edwards) sample.pretzel Pretzel (Zee) sample.3drectangle 3D Rectangle (Tomo Wa) sample.enterprise Original Series Enterprise (Gil Keidar) +sample.enterprise2 Original Series Enterprise (Alan Ratliff) sample.colorrings Colored Rings (Miika Oja) sample.bite Apple Bite (Michael "Moose" O'Malley) diff --git a/samples/sample.basic.txt b/samples/sample.basic.txt index 700bc3d..e1b7ba4 100644 --- a/samples/sample.basic.txt +++ b/samples/sample.basic.txt @@ -1,7 +1,8 @@ 5 PR#3 : TEXT : HOME +6 A = RND(-(PEEK(78) + PEEK(79)*256)) : REM Seed PRNG 10 PRINT "(1) GOSUB/RETURN/POP" 15 PRINT "(2) Basic I/O, IF/THEN" -20 PRINT "(3) Fibbonacci Sequence" +20 PRINT "(3) Fibonacci Sequence" 25 PRINT "(4) Guess my number" 30 PRINT "(5) Guess your number" 35 PRINT "(6) Approximate Pi" @@ -20,7 +21,7 @@ 92 PRINT "(19) DOS WRITE/APPEND" 93 PRINT "(20) ONERR ... RESUME" 94 PRINT "(21) CHR$ Tests" -95 PRINT: INPUT "Enter option: "; A : PRINT : HOME : ON A GOTO 100,200,300,400,500,600,700,800,1900,1000,1100,1200,2000,2100,2200,2300,2400,2500,2600,2700,2800 +95 PRINT: INPUT "Enter option: "; A : PRINT : HOME : ON A GOTO 100,200,300,400,500,600,700,800,900,1000,1100,1200,2000,2100,2200,2300,2400,2500,2600,2700,2800 98 HOME 99 END @@ -41,7 +42,7 @@ 230 IF (NOT A) THEN PRINT "FALSE" 240 PRINT : PRINT "Press any key: " : GET A$ : GOTO 5 -300 REM Fibbonacci +300 REM Fibonacci 310 LA = 0 : CU = 1 320 NX = LA + CU : PRINT NX 330 LA = CU : CU = NX @@ -106,7 +107,7 @@ 820 PRINT : PRINT "Press any key: " : GET A$ : GOTO 5 900 REM Cellular automata -901 PRINT "Wolfram's CA rules" : PRINT "Try 110, 111, 118, 121, 126" : PRINT +901 PRINT "Wolfram's CA rules" : PRINT "Try 26, 110, 111, 118, 121, 126" : PRINT 902 INPUT "Rule: "; R : PRINT 904 DIM VT(8) : FOR I = 0 TO 7 : VT(I) = NOT( R / 2 = INT( R / 2 ) ) : R = INT(R / 2) : NEXT 910 S$ = " # " @@ -122,13 +123,13 @@ 960 GOTO 912 1000 REM Madlibs -1010 INPUT "Name: "; N$ +1010 INPUT "Name: "; NM$ 1020 INPUT "Verb: "; V$ -1030 INPUT "Noun: "; NN$ -1040 INPUT "Place: "; P$ -1050 S$ = "One day, " + N$ + " " + V$ + " to " + P$ + " to see the " + NN$ + "." -1060 PRINT S$ : PRINT -1070 PRINT : PRINT "Press any key: " : GET A$ : GOTO 5 +1030 INPUT "Noun: "; N$ +1040 INPUT "Adjective: ";A$ +1050 INPUT "Place: "; P$ : PRINT +1060 PRINT "One day, "; NM$; " will "; V$; " to "; P$; " to see the "; A$; " "; N$; "." +1070 PRINT : PRINT : PRINT "Press any key: "; : GET A$ : GOTO 5 1100 REM Lissajous Figures 1105 REM POKE 49168,0 : REM Clear keyboard strobe @@ -152,19 +153,6 @@ 1250 VTAB 24 : HTAB 10 : PRINT "Press Any Key To Continue"; : GET A$ 1290 GOTO 5 -1900 REM Cellular automata -1901 HOME -1902 PRINT "Wolfram's CA rules" : PRINT "Try 110, 111, 118, 121, 126" : PRINT -1903 INPUT "Rule: "; R : PRINT -1904 DIM VT(8) : FOR I = 0 TO 7 : VT(I) = NOT( R / 2 = INT( R / 2 ) ) : R = INT(R / 2) : NEXT -1910 DIM C(30) : DIM N(30) : N(15) = 1 -1912 FOR I = 0 TO 30 : C(I) = N(I) : PRINT C(I); : NEXT : PRINT -1916 FOR I = 2 TO 30 - 1 -1918 V = 4 * C(I-1) + 2 * C(I) + 1 * C(I+1) -1920 N(I) = VT(V) -1930 NEXT I -1940 GOTO 1912 - 2000 REM DOS Sequential Text File 2005 PRINT "First, knowing it has 4 lines..." : PRINT 2010 PRINT CHR$(4)"OPEN JABBERWOCKY" @@ -180,16 +168,17 @@ 2090 PRINT : PRINT "Press any key to continue: " : GET A$ : GOTO 5 2100 REM Lores Drawing -2110 GR +2110 GR : VTAB 23 : HTAB 15 +2112 PRINT "Press a key to return to menu"; 2115 OX = -1 : OY = -1 2116 C = 0 2120 X = INT( PDL(0) / 256 * 40 ) 2130 Y = INT( PDL(1) / 256 * 48 ) -2135 HTAB 1 : VTAB 23 : PRINT X ; " " ; Y ; " " -2140 REM IF ( OX <> X OR OY <> Y ) AND OX <> -1 AND OY <> -1 THEN COLOR= 0 : PLOT OX, OY +2135 HTAB 1 : PRINT X ; TAB(6) ; Y ; TAB(11) +2140 REM IF ( OX <> X OR OY <> Y ) AND OX <> -1 AND OY <> -1 THEN COLOR= 0 : PLOT OX, OY 2150 COLOR= C : PLOT X, Y 2160 OX = X : OY = Y : C = C + 1 : IF C > 15 THEN C = 0 -2170 GOTO 2120 +2170 ON PEEK(49152) < 128 GOTO 2120 : POKE 49168,0 : GOTO 5 2200 REM Color Chart 2210 GR diff --git a/samples/sample.chase.txt b/samples/sample.chase.txt index 28597cb..902dcc6 100644 --- a/samples/sample.chase.txt +++ b/samples/sample.chase.txt @@ -1,111 +1,75 @@ -100 PRINT "THIS IS THE GAME OF CHASE" +100 PR#0:TEXT:HOME::PRINT "THIS IS THE GAME OF CHASE" 110 PRINT "WANT INSTRUCTIONS"; 120 INPUT C$ -130 IF LEFT$(C$,1)="N" THEN 230 +130 IF LEFT$(C$,1)="N" THEN VTAB 7:GOTO 280 140 IF LEFT$(C$,1)<>"Y" THEN 110 -150 PRINT "YOU ARE '*' IN A HIGH VOLTAGE MAZE WITH 5" -160 PRINT "SECURITY MACHINES '+' TRYING TO DESTROY YOU" -170 PRINT "YOU MUST MANEUVER THE SECURITY MACHINES INTO" -180 PRINT "THE MAZE 'X' TO SURVIVE. GOOD LUCK !!!" -190 PRINT "MOVES ARE 7,8,9" -200 PRINT " 4,5,6" -210 PRINT " 1,2,3 0 TO END THE GAME" -220 PRINT -230 DIM A(10,20),E(21),F(21) -240 LET G=0 -250 FOR B=1 TO 10 -260 FOR C=1 TO 20 -270 LET A(B,C)=0 -280 IF B=1 THEN 330 -290 IF B=10 THEN 330 -300 IF C=1 THEN 330 -310 IF C=20 THEN 330 -320 GOTO 340 -330 LET A(B,C)=1 -340 NEXT C -350 NEXT B -360 FOR D=1 TO 21 -370 LET B=INT(RND(1)*8)+2 -380 LET C=INT(RND(1)*18)+2 -390 IF A(B,C)<>0 THEN 370 -400 LET A(B,C)=1 -410 IF D<6 THEN 430 -420 GOTO 440 -430 LET A(B,C)=2 -440 IF D=6 THEN 460 -450 GOTO 470 -460 LET A(B,C)=3 -470 LET E(D)=B -480 LET F(D)=C -490 NEXT D -500 FOR B=1 TO 10 -510 FOR C=1 TO 20 -520 IF A(B,C)<>0 THEN 550 -530 PRINT " "; -540 GOTO 630 -550 IF A(B,C)<>1 THEN 580 -560 PRINT "X"; -570 GOTO 630 -580 IF A(B,C)<>2 THEN 610 -590 PRINT "+"; -600 GOTO 630 -610 IF A(B,C)<>3 THEN 630 -620 PRINT "*"; +150 HOME:PRINT "YOU'RE '*' IN A HIGH VOLTAGE MAZE WITH 5"; +160 PRINT "SECURITY MACHINES '+' TRYING TO DESTROY" +170 PRINT "YOU. YOU MUST MANEUVER THE SECURITY" +180 PRINT "MACHINES INTO A MAZE 'X' TO SURVIVE." +190 PRINT:PRINT "YOU WILL OFTEN FIND YOURSELF DROPPED" +200 PRINT "INTO A GENUINELY IMPOSSIBLE SITUATION." +210 PRINT "WHEN THAT HAPPENS, JUST QUIT THAT GAME" +220 PRINT "AND TRY ANOTHER. GOOD LUCK !!!" +280 VTAB 11:HTAB 23:PRINT "MOVES ARE 7,8,9" +290 HTAB 33:PRINT "4,5,6" +300 HTAB 33:PRINT "1,2,3":PRINT +310 HTAB 23:PRINT "0 TO END THE GAME" +320 DIM A(10,20),E(5),F(5) +330 B=RND(-PEEK(79)*999-PEEK(78)) +340 LET G=0 +350 FOR B=1 TO 10 +360 FOR C=1 TO 20 +370 LET A(B,C)=B=1 OR B=10 OR C=1 OR C=20 +380 NEXT C +390 NEXT B +400 VTAB 20:CALL -958:VTAB 11 +410 POKE 33,20:CALL -958:POKE 33,40 +420 FOR D=1 TO 21 +430 LET B=INT(RND(1)*8)+2 +440 LET C=INT(RND(1)*18)+2 +450 IF A(B,C) THEN 430 +460 LET A(B,C)=(D<7)*3+SGN(D-6) +470 IF D<6 THEN E(D)=B:F(D)=C +480 IF D=6 THEN X=C:Y=B +490 NEXT D: D=0 +500 VTAB 10:PRINT +510 FOR B=1 TO 10 +520 FOR C=1 TO 20 +530 PRINT MID$(" X+*",A(B,C)+1,1); 630 NEXT C -640 PRINT -650 NEXT B -660 LET B=E(6) -670 LET C=F(6) -680 LET A(B,C)=0 -690 INPUT Y -700 ON Y+1 GOTO 1040,730,730,730,740,780,740,710,710,710 -710 LET B=B-1 -720 GOTO 740 -730 LET B=B+1 -740 ON Y GOTO 750,780,770,750,780,770,750,780,770 -750 LET C=C-1 -760 GOTO 780 -770 LET C=C+1 -780 IF A(B,C)=1 THEN 1060 -790 IF A(B,C)=2 THEN 1080 -800 LET A(B,C)=3 -810 LET E(6)=B -820 LET F(6)=C +640 IF B<10 OR D>6 THEN PRINT +650 NEXT B:ON 9-D GOTO 1080,1100 +680 PRINT " ?"; +690 GET C$: V=VAL(C$): IF C$<>"0" AND NOT V THEN PRINT CHR$(7);:GOTO 690 +700 PRINT:ON NOT V GOTO 1040: IF V=5 GOTO 830 +710 LET A(Y,X)=0 +730 D=INT((6-V)/3) +740 LET Y=Y+D +750 LET X=V-(2-D)*3+1+X +780 ON A(Y,X) GOTO 1060,1080 +800 LET A(Y,X)=3 830 FOR D=1 TO 5 -840 IF A(E(D),F(D))<>2 THEN 1020 +840 IF A(E(D),F(D))<>2 THEN 1030 850 LET A(E(D),F(D))=0 -860 IF E(D)>=B THEN 890 -870 LET E(D)=E(D)+1 -880 GOTO 910 -890 IF E(D)=B THEN 910 -900 LET E(D)=E(D)-1 -910 IF F(D)>=C THEN 940 -920 LET F(D)=F(D)+1 -930 GOTO 960 -940 IF F(D)=C THEN 960 -950 LET F(D)=F(D)-1 -960 IF A(E(D),F(D))=3 THEN 1080 -970 IF A(E(D),F(D))=0 THEN 1000 -980 LET G=G+1 -990 GOTO 1010 -1000 LET A(E(D),F(D))=2 -1010 IF G=5 THEN 1100 -1020 NEXT D -1030 GOTO 500 -1040 PRINT "SORRY TO SEE YOU QUIT" +870 LET E(D)=SGN(Y-E(D))+E(D) +920 LET F(D)=SGN(X-F(D))+F(D) +960 IF A(E(D),F(D))=3 THEN D=7:GOTO 1030 +970 IF A(E(D),F(D)) THEN G=G+1:GOTO 1030 +980 A(E(D),F(D))=2 +1030 NEXT D: D=(G=5)+D: GOTO 500 +1040 PRINT "YOU RESIGNED TO YOUR FATE" 1050 GOTO 1110 1060 PRINT "ZAP!!! YOU TOUCHED THE FENCE !!!!!" 1070 GOTO 1110 -1080 PRINT "** YOU HAVE BEEN DESTROYED BY A LUCKY COMPUTER **" +1080 PRINT "** YOU HAVE BEEN DESTROYED BY A LUCKY":PRINT "MACHINE **" 1090 GOTO 1110 -1100 PRINT "YOU ARE LUCKY **YOU DESTROYED ALL THE ENEMY**" +1100 PRINT "YOU ARE LUCKY":PRINT "**YOU DESTROYED ALL THE ENEMY**" 1110 PRINT "WANT TO PLAY AGAIN"; 1120 INPUT C$ -1130 IF LEFT$(C$,1)="Y" THEN 240 -1140 IF LEFT$(C$,1)<>"N" THEN 1110 -1150 PRINT "HOPE YOU DON'T FEEL FENCED IN." -1160 PRINT "TRY AGAIN SOMETIME" -1170 END -1140 IF LEFT$(C$,1)<>"N" THEN 1110 -1150 PRINT "HOPE YOU DON'T FEEL FENCED IN." -1160 PRINT "TRY AGAIN SOMET +1130 IF LEFT$(C$,1)="Y" THEN 330 +1140 IF LEFT$(C$,1)<>"N" THEN VTAB PEEK(37):PRINT CHR$(7);:GOTO 1110 +1150 VTAB 21:CALL -958:PRINT +1160 PRINT "SORRY TO SEE YOU QUIT" +1170 PRINT "HOPE YOU DON'T FEEL FENCED IN." +1180 PRINT "TRY AGAIN SOMETIME"; \ No newline at end of file diff --git a/samples/sample.columns.txt b/samples/sample.columns.txt index d84099e..5ec8492 100644 --- a/samples/sample.columns.txt +++ b/samples/sample.columns.txt @@ -1,12 +1,12 @@ 10 rem Columns for Applesoft BASIC -20 rem Programed by Arthur Allen +20 rem Programmed by Arthur Allen 30 rem Based on Columns by Jay Geertsen +50 def fnsym(i) = int (symbols * rnd(1)) + 1 : def fncolr(i) = asc(mid$("@AFDCMKLEBGIHNJO",i + 1,1)) - 64 +60 dim array(40, 42), erase(25) +70 dim shape(2), nshape(3), check(40, 42) -60 dim array(50, 50), erase(25) -70 dim shape(2), nshape(3), check(50, 50) - -90 gosub 2830: rem Interactive pre-screen +90 gosub 2840: rem Interactive pre-screen 350 home 360 rem Fill in borders in array @@ -22,14 +22,13 @@ 450 next fill 455 if renew then vtab 21 : htab left + int(width/2) + 1 : print "^" : rem print only if replay selected - 460 rem Prefill board 465 gosub 4320 : rem blank out part of screen above prefill 470 guess = 1 480 if rows = 0 goto 720 : rem Skip if rows = 0, otherwise loop will still execute once 540 for i = 3 to width + 2 -550 for j = height - rows to height +550 for j = height - rows + 1 to height 555 cycle = 0 570 rem Top of while flag loop @@ -38,17 +37,17 @@ 585 cycle = cycle + 1 587 if cycle > 10 then guess = guess + 1 : vtab 22 : print "Attempt: "; guess; ", x pos: "; i; " " : i = i - 1 : if i < 3 then i = 3 -590 candidate = 1 + int (symbols * rnd(sd)) +590 candidate = fnsym(0) 600 rem Proximity checking 610 if array(i - 1, j) = candidate then if array(i - 2, j) = candidate then flag = 1 : rem same symbol horz left 620 if array(i, j - 1) = candidate then if array(i, j - 2) = candidate then flag = 1 : rem same symbol up 630 if array(i - 1, j - 1) = candidate then if array(i - 2, j - 2) = candidate then flag = 1 : rem same symbol diag left & up -640 if array(i - 1, j + 1) = candidate then if array(i - 2, j + 2) = candidate then flag = 1 : rem same symbol diag left & down -660 if flag then goto 570 : rem Back to top of while flag loop +640 if array(i - 1, j + 1) = candidate then if array(i - 2, j + 2) = candidate then flag = 1 : rem same symbol diag left & down +660 if flag goto 570 : rem Back to top of while flag loop 670 array(i, j) = candidate -680 color= candidate +680 color= fncolr(candidate) 690 plot i, j 700 next j 710 next i @@ -56,32 +55,28 @@ 720 rem Pick piece for initial Next window 730 rem Pick shape 740 for s = 0 to 2 -750 nshape(s) = 1 + int (symbols * rnd(sd)) +750 nshape(s) = fnsym(0) 780 next s 790 rem Make turn -800 x = 2 + int(width/2) -810 y = 0 -820 rem Copy Next to current shape +800 x = int(width/2) + 2 +810 y = 0 +820 rem Copy Next to current shape, get new Next 830 for s = 0 to 2 840 shape(s) = nshape(s) -850 next s - -890 rem pick next Next -900 for s = 0 to 2 -910 nshape(s) = 1 + int (symbols * rnd(sd)) -920 color= nshape(s) -930 plot width + 5 , y+s +910 nshape(s) = fnsym(0) +920 color= fncolr(nshape(s)) +930 plot width + 5, s 940 next s - 1020 t1 = time 1050 bot = 0 1060 drop = 0 1120 rem Check for end of play 1130 rem Check for conflict -1140 if array(x, y) or array(x, y+1) or array(x, y+3) then goto 90 : rem end of game, go to front end +1140 cfl = array(x, y) or array(x, y+1) or array(x, y+2) +1145 if cfl then gosub 3000 : goto 350 : rem end of game, go to front end 1150 rem Make move loop 1160 if drop then t1 = 1 @@ -89,87 +84,56 @@ 1180 if peek (49152) > 127 then gosub 1320 : rem Process input if input detected 1190 next clock -1200 y1 = y : x1 = x +1200 y1 = y : x1 = x 1210 y = y + 1 1220 cfl = 0 -1240 if not bot then gosub 1630 : rem Move piece -1260 if cfl then goto 2060 : rem Add to shape & check for complete three in a row +1240 if not bot then gosub 1670 : rem Move piece +1260 if cfl goto 2060 : rem Add to shape & check for complete three in a row 1270 if not bot then 1150 : rem Back to top of Make move loop, else force to bottom 1280 y = y - 1 : xdr = 1 -1290 gosub 1920 : rem Draw shape (erase) +1290 color= 0 : vlin y, y+2 at x : rem Erase shape 1300 y = y + 1 : xdr = 0 1310 goto 1530 : rem Send piece to bottom - 1320 rem Process input -1330 a = PEEK (49152) +1330 for s = 0 to 1 : a = PEEK (49152) : s = a > 127 : next 1340 get g$ -1350 if g$ = " " then gosub 1960 : return : rem Check for rotate -1360 if g$ = "J" or a = 136 then gosub 1430 : return : rem Check for move left -1370 if g$ = "K" or a = 149 then gosub 1480 : return : rem Check for move right -1380 if g$ = "D" or a = 138 then gosub 1580 : return : rem Force down +1350 if g$ = " " goto 1970 : rem Check for rotate +1360 s = (g$ = "D" or a = 138) * 2 + (g$ = "K" or a = 149) - (g$ = "J" or a = 136) +1370 if s goto 1590 : rem move left/right/down 1390 if g$ = "M" then bot = 1 : return : rem Send piece to bottom 1400 if g$ = "S" then drop = 1 : rem Speed up piece -1410 if g$ = "P" then gosub 2580 : return : rem Pause game -1415 if g$ = "R" then goto 460 : rem restart at prefill +1410 if g$ = "P" goto 2580 : rem Pause game +1415 if g$ = "R" goto 460 : rem restart at prefill 1420 return -1430 rem Check for move left -1440 x1 = x : y1 = y -1450 x = x - 1 -1460 gosub 1630 : rem Move piece -1470 return - -1480 rem Check for move right -1490 x1 = x : y1 = y -1500 x = x + 1 -1510 gosub 1630 : rem Move piece -1520 return - - 1530 rem Send piece to bottom 1540 y = y + 1 1545 cfl = 0 1550 if array(x, y+2) then cfl = 1 : rem Check for conflict -1560 if cfl then y = y - 1 : gosub 2010 : goto 2060 : rem Draw, then Add to bottom -1570 goto 1530 - -1580 rem Force piece down -1590 y1 = y : x1 = x -1600 y = y + 1 -1610 gosub 1630 : rem Move piece -1620 return +1560 if cfl then y = y - 1 : gosub 2010 : goto 2070 : rem Draw, then Add to bottom +1570 goto 1540 +1580 rem shift piece left, right, or down +1590 y1 = y : x1 = x : s = (s<2) * s +1600 x = x + s : y = y + not s 1630 rem move piece 1670 cfl = 0 -1680 if array(x, y) or array(x, y+1) or array(x, y+2) then cfl = 1 : rem Check for conflict -1700 if cfl then gosub 1820 : return : rem Return old values +1680 if array(x, y) or array(x, y+1) or array(x, y+2) then cfl = 1 : rem Check for conflict +1700 if cfl then x = x1 : y = y1 : return : rem Return old values 1710 color= 0 1720 vlin y1, y1+2 at x1 -1730 for s = 0 to 2 -1740 color= shape(s) -1750 plot x, y+s -1760 next s -1770 return - -1820 rem Return old values -1880 x = x1 -1890 y = y1 -1910 return - -1920 rem Erase piece -1930 color=0 -1940 vlin y, y+2 at x -1950 return +1730 goto 2010 1960 rem Rotate 1970 swap = shape (2) 1980 shape (2) = shape (1) 1990 shape (1) = shape (0) 2000 shape (0) = swap -2010 for s = 0 to 2 : rem Draw shape, called from 1560 -2020 color= shape(s) + +2010 for s = 0 to 2 : rem Draw shape, called from 1560 & 1730 +2020 color= fncolr(shape(s)) 2030 plot x, y+s 2040 next s 2050 return @@ -181,7 +145,7 @@ 2090 array(x, y + s) = shape(s) 2100 next s -2110 rem While found (contol at line 2340. End of loop at 2560) +2110 rem While found (contol at line 2340. End of loop at 2560) 2120 found = 0 2130 rem Initialize array @@ -194,7 +158,7 @@ 2190 rem Start checking for three in a row 2200 for j = 2 to height 2210 for i = 3 to width + 2 -2220 if array(i, j) = 0 then goto 2310 : rem Skip dead cells +2220 if not array(i, j) goto 2320 : rem Skip dead cells 2230 rem Check horizontal 2240 if array(i, j) = array(i - 1, j) and array(i, j) = array(i + 1, j) then check(i - 1, j) = 1 : check(i, j) = 1 : check(i + 1, j) =1 : found = 1 @@ -202,7 +166,6 @@ 2250 rem Check vertical 2260 if array(i, j) = array(i, j - 1) and array(i, j) = array(i, j + 1) then check(i, j - 1) = 1 : check(i, j) = 1 : check(i, j + 1) = 1 : found = 1 : rem vtab 21 : htab 1 : print "2260 found vertical, j+1 = "; j+1; : rem temp code - 2270 rem Check diagonal left 2280 if array(i, j) = array(i - 1, j - 1) and array(i, j) = array(i + 1, j + 1) then check(i - 1, j - 1) = 1 : check(i, j) = 1 : check(i + 1, j + 1) = 1 : found = 1 @@ -213,10 +176,10 @@ 2320 next i 2330 next j -2335 gosub 2740 : rem Count cells to be removed. +2335 gosub 2740 : rem Count cells to be removed. 2357 rem while not found control: -2340 if not found then goto 790 : rem Goto Make turn +2340 if not found goto 800 : rem Goto Make turn 2350 rem Flash cells 2355 rem gosub 2610 : rem Draw parallel field of check cells @@ -229,30 +192,29 @@ 2410 next i 2420 next j -2430 for j = 2 to height +2430 for j = 2 to height 2440 for i = 3 to width + 2 -2450 if check(i, j) then color= array(i, j) : plot i, j +2450 if check(i, j) then color= fncolr(array(i, j)) : plot i, j 2460 next i 2470 next j 2480 next blink 2490 rem Remove cells from board 2500 for i = 3 to width + 2 -2505 offset = 0 +2505 offset = 0 2510 for j = height to 0 step -1 -2520 if not check(i,j) then array(i, j + offset) = array(i, j) : color= array(i, j): plot i, j + offset -2530 if check(i, j) then offset = offset + 1 +2520 if not check(i,j) then array(i, j + offset) = array(i, j) : color= fncolr(array(i, j)): plot i, j + offset +2530 if check(i, j) then offset = offset + 1 2540 next j 2550 next i -2555 if renew then if rows > 0 then if check(left + int(width/2) ,height) then goto 460 : rem end of screen, go to prefill board - +2555 if renew then if rows > 0 then if check(left + int(width/2),height) goto 460 : rem end of screen, go to prefill board 2560 goto 2110 : rem To top of while found loop 2570 rem End of Check field subroutine 2580 rem Pause game -2590 if peek (49152) = 141 then get g$ : null = peek (49168) : return +2590 if peek (49152) = 141 then get g$ : return 2600 goto 2580 2740 rem Count deleted cells @@ -262,95 +224,111 @@ 2770 if check (i, j) then dead = dead + 1: nowdead = nowdead + 1 2780 next i 2790 next j -2800 vtab 22 : htab 1 : print "Cleared: "; nowdead; " " -2810 vtab 23 : htab 1 : print "Total: "; dead +2800 vtab 22 : htab 1 : print "Cleared: "; nowdead; : call -868 +2810 print : print "Total:" spc(3) dead 2820 return 2830 rem Front end screen -2840 rem gosub ? : rem Future animated splash screen +2840 gosub 5000 : rem Show animated splash screen 2860 rem setup default values and screen 2870 rows = 20 : rem Prefill rows 2880 width = 6 2890 symbols = 5 2900 renew = 1 : rem replay value (yes = 1/no = 0) -2905 choice = 21 : rem vtab position of menu choice -2910 time = 500 -2920 height = 39 : rem Full GR screen with text window. Cannot be larger than 47 +2920 height = 39 : rem Full GR screen with text window. Cannot be larger than 39 2930 left = 2 2935 rem End of game gosubs to here, past splash screen and default values -2940 gr -2950 home -2970 color= 15 : rem Draw white borders -2980 vlin 0, height at left -2990 vlin 0, height at left + width + 1 -2995 gosub 4240 : rem draw top line to indicate height. - -3000 vtab 21 : print " Replay on cleared cell above ^ "; -3003 if renew then print "YES" -3005 if not renew then print "NO " -3007 if rows = 0 then vtab 21 : htab 36 : print "N/A" -3010 print " Width (3 - 34) "; width; : print " [ENTER] to start" -3020 print " Prefill (0 - 30) "; rows -3030 print " Colors (3 - 14) "; symbols; -3035 vtab choice : htab 1 : print "-->"; : rem draw arrow - -3040 rem Combine the random number seed with a loop that polls for input for game options -3050 for sd = 0 to 32767 - -3060 if peek (49152) > 127 then goto 4000 : rem Process input if input detected -3070 a = rnd (sd * -1) : rem Dummy variable, just used to increment random number - -3080 next sd - -3090 goto 3050 : REM Return to top of sd to begin poll again +3000 time = 500 : sd=RND(-PEEK(79)*999-PEEK(78)) +3005 gosub 4200 : home : print "--> Replay on cleared cell above ^ "; : gosub 4180 : print +3010 htab 5 : print "Width (3 - 34) "; width; tab(24) "[ENTER] to start" +3020 htab 5 : print "Prefill (0 - 30) "; rows +3030 htab 5 : print "Colors (3 - 13) "; symbols; +3040 if cfl then htab 26 : print "[ESC] to exit"; : htab 1 +3050 vtab 21 : choice = 21 : rem vtab position of menu choice 4000 rem Process Input -4010 a = PEEK (49152) -4020 get g$ +4020 for s = 0 to 1 : a = PEEK (49152) : s = a > 127 : next : get g$ -4030 if g$ = "J" or a = 136 then gosub 4120 : rem left option -4040 if g$ = "K" or a = 149 then gosub 4180: rem right option -4050 if g$ = "D" or g$ = "M" or a = 138 then choice = choice + 1: rem down -4060 if g$ = "I" or a = 139 then choice = choice - 1: rem up +4050 i = (g$ = "D" or g$ = "M" or a = 138) - (g$ = "I" or a = 139) +4060 if i then i = choice + i : htab 1 : print spc(3) : choice = ((i = 20) - (i = 25)) * 4 + i : vtab choice : htab 1 : print "-->"; : goto 4020 : rem up/down 4070 if a = 141 then return : rem enter/return to start the game. This is why Process Input is not a subroutine +4075 if cfl and a = 155 then pop : home : print : print "BYE!" : end +4080 a = (g$ = "K" or a = 149) - (g$ = "J" or a = 136) +4090 on not a goto 4020 : on choice - 20 gosub 4130,4140,4150,4160 +4092 on not a goto 4020 : vtab choice : htab asc(mid$("dTVU",choice - 20,1)) - 64 +4094 if choice > 21 then print i spc(1) : on choice/12 gosub 4200,4250 : if choice = 23 and (rows = a or not rows) then vtab 21 : htab 36 : a=2 +4095 if choice = 21 or a = 2 then gosub 4180 : htab 1 +4100 vtab choice : goto 4020 -4080 if choice < 21 then choice = 24 -4090 if choice > 24 then choice = 21 +4120 rem Left & Right Choices +4130 renew = 1 - renew: a = rows : return : rem toggle Renew +4140 i = width + a : a = (i > 2 and i < 35) * a : width = width + a : return : rem width +4150 i = rows + a : a = (i >= 0 and i < 31) * a : rows = rows + a : return : rem prefill height +4160 i = symbols + a : a = (i > 2 and i < 14) * a : symbols = symbols + a : return : rem colors -4110 goto 2940 : rem redraw screen +4180 print mid$("N/ANO YES",(rows > 0) * (renew + 1) * 3 + 1,3); : return -4120 rem Left Choice -4130 if choice = 21 then renew = 1 + renew * (-1): rem toggle Renew -4140 if choice = 22 then if width > 3 then width = width - 1: rem width -4150 if choice = 23 then if rows > 0 then rows = rows - 1 : rem prefill height -4160 if choice = 24 then if symbols > 3 then symbols = symbols - 1 : rem colors -4170 return - -4180 rem Right Choice -4190 if choice = 21 then renew = 1 + renew * (-1): rem toggle Renew -4200 if choice = 22 then if width < 34 then width = width + 1: rem width -4210 if choice = 23 then if rows < 30 then rows = rows + 1 : rem prefill height -4220 if choice = 24 then if symbols < 14 then symbols = symbols + 1 : rem colors -4230 return +4200 gr : color= 15 : rem Draw white borders +4210 vlin 0, height at left +4220 vlin 0, height at left + width + 1 4240 rem Draw top line to indicate prefill height. -4250 if rows = 0 then return -4260 for i = 3 to width + 2 -4270 candidate = 1 + int (symbols * rnd(sd)) -4280 color= candidate -4290 plot i, 39 - rows -4300 next i +4250 if not rows then return +4260 for s = 3 to width + 2 +4270 color= fncolr(fnsym(1)) +4290 plot s, height - rows + 1 +4300 next 4310 return -4320 rem Blank out the part of screen above prefill. Called at start of every screen, and on an "R" press +4320 rem Blank out the part of screen above prefill. Called at start of every screen, and on an "R" press 4330 color = 0 : rem black 4340 for j = left + 1 to width + 2 -4350 vlin 0, height - rows - 1 at j -4560 next j -4570 return +4350 vlin 0, height - rows at j +4360 for i = 0 to height - rows : array(j,i) = 0 : next i,j +4370 return +4990 rem Animated splash screen by Alan Ratliff +5000 pr#0 : gr : color= 3 : vlin 1,9 at 2 : plot 3,28 : plot 3,38 : plot 4,0 : plot 4,10 : plot 5, 29 : plot 5,37 +5010 vlin 13,37 at 32 : vlin 16,34 at 26 : vlin 11,24 at 16 : vlin 14,27 at 11 +5020 home : color= 1 : vlin 29,37 at 7 : plot 8,0 : plot 8,10 : plot 9,28 : plot 9, 38 : vlin 1,9 at 10 +5030 vlin 14,30 at 36 : vlin 15,36 at 22 : vlin 16,32 at 2 : plot 30,11 : plot 13,25 : vlin 2,8 at 17 +5040 color= 11 : vlin 0,10 at 12 : plot 13,38 : plot 14,10 : plot 15, 38 +5050 vlin 15,38 at 30 : vlin 13,34 at 20 : vlin 11,24 at 6 : plot 26,13 +5060 color= 9 : vlin 28,37 at 17 : plot 18,10 : plot 19,38 : vlin 0,9 at 20 +5070 vlin 17,33 at 34 : vlin 12,37 at 24 : vlin 8,23 at 9 : plot 12,36 +5080 color= 13 : vlin 0,10 at 22 : vlin 30,31 at 23 : vlin 4,6 at 24 : vlin 30,31 at 25 : vlin 0,10 at 26 +5090 vlin 17,36 at 14 : vlin 14,35 at 4 : plot 34,12 : vlin 2,9 at 7 +5100 color= 4 : vlin 0,10 at 28 : vlin 30,31 at 29 : vlin 4,6 at 30 : vlin 35,36 at 31 : vlin 0,10 at 32 +5110 vlin 14,30 at 18 : plot 37,2 : plot 37,8 : plot 34,36 : plot 26,38 : plot 2,12 : plot 2,36 : vlin 30,37 at 10 : vlin 1,8 at 5 +5120 color= 6 : vlin 1,4 at 34 : plot 34,9 : plot 35,28 : plot 35,33 : plot 35,38 : plot 36,0 : plot 36,5 : plot 36,10 : plot 37,29 : vlin 34,37 at 37 +5130 vlin 14,37 at 28 : vlin 21,31 at 8 : plot 19,4 : plot 13,13 : vlin 1,8 at 15 : vlin 27,33 at 12 +5140 for i = 1 to 2000 : next i : a = 21 ^ not a : for a = a to (a > 1) * 37 + 14 : for s = 2 to 18 step 2 +5150 for i = 0 to 1 : k = a - (s + i + 18) * (a > 20) : k = (k > 0 and k < 15) * k : on not k goto 5400 : y = 39 - s * 2 +5160 for j = 0 to y step y : x = sgn(1-j) * i + s + j : y = x / 2 : y = int(y) = y : k = abs(k) : if y then k = -k +5170 h = sgn(k) : y = 28 - y * 18 - k : for y = y to h * 10 + y step h : color= scrn(x,y+h) : plot x,y : next +5180 color= 0 : hlin x,x - h at y : next +5400 next i,s,a : a = 1.5 : for x = 34 to 37 : color= (a<2) * 8 + a : a = a * 2 : y = x * 2 +5410 hlin 39 - x,x at 79 - y : hlin 39 - x,x at y - 41 : next +5420 htab 9 : print "Created by JAY GEERTSEN" +5430 for a = 1 to 12000 : next a +5440 print : htab 5 : print "Applesoft coding by ARTHUR ALLEN" + +5580 rem Key guide screen +5590 for a = 1 to 48000 : next a : text : home +5600 vtab 3 : print "Keys used:" : print +5610 print "<-- or J to move piece left" +5620 print "--> or K to move piece right" +5630 print " to rotate colors downward" +5640 print " |" spc(4) "M to send piece to bottom" +5650 print " | or D to force piece down" +5660 print "\|/" spc(3) "S to speed up piece" +5670 htab 7 : print "R to restart at prefill level" +5680 htab 7 : print "P to pause game" +5690 vtab 21 : print "Press a key to choose game settings" +5700 print : print "(or <-- or --> to see Splash again) "; : get g$ +5710 i = asc(g$) : a = i = 21 : on i = 8 or a goto 5000 : home : return diff --git a/samples/sample.doordetector.txt b/samples/sample.doordetector.txt index 062349b..0bf7cb9 100644 --- a/samples/sample.doordetector.txt +++ b/samples/sample.doordetector.txt @@ -1,106 +1,98 @@ -4 TEXT: HOME +4 PR# 0:TEXT: HOME 5 HTAB 15: INVERSE: PRINT "DOOR DETECTOR": NORMAL 6 PRINT: PRINT: PRINT "DO YOU WANT INSTRUCTIONS? Y/N" 7 GET P$: IF P$="Y" THEN 610 -8 IF P$="N" THEN 10 -9 PRINT: GOTO 6 +8 IF P$<>"N" GOTO 7 + 10 E=200: R=1: F=0: Q=0 -20 A=20: B=20 -30 V=INT (RND(1)*39-R): IF V<0+R THEN 30 -40 H=INT (RND(1)*39-R): IF H<0+R THEN 40 -50 IF R>5 THEN 520 -60 GR: HOME: VTAB 21: PRINT "ENERGY:";E: VTAB 21: HTAB 34: PRINT "ROOM #";R +20 A=RND(-PEEK(79)*999-PEEK(78)): A=20: B=20 + +30 FOR I=1 TO 2: V=H: H=INT (RND(1)*(40-R*2))+R: NEXT +40 REM Line 50: If prior room's exit was next to Death Zone, you'd now be IN Death Zone — step out of it! +50 A=(A39-R)+A: B=(B39-R)+B +60 GR: HOME: VTAB 21: PRINT "ENERGY:";E;: HTAB 34: PRINT "ROOM #";R 65 E=E-1 -70 COLOR=15: PLOT A,B: Q=13: GOSUB 190 -80 Q=0: GET P$ +70 COLOR=15: PLOT A,B: Q=13: GOSUB 180 + +80 Q=0: FOR I=0 TO 128: I=PEEK(49152): NEXT: POKE 49168,0: I=I - 203: I=I-(I>21) * 32 90 HOME 100 VTAB 21: PRINT "ENERGY:";E: VTAB 21: HTAB 34: PRINT "ROOM #";R -110 IF P$="I" THEN COLOR=0: PLOT A,B: COLOR=15: B=B-1: PLOT A,B: E=E-1 -120 IF P$="J" THEN COLOR=0: PLOT A,B: COLOR=15: A=A-1: PLOT A,B: E=E-1 -130 IF P$="K" THEN COLOR=0: PLOT A,B: COLOR=15: A=A+1: PLOT A,B: E=E-1 -140 IF P$="M" THEN COLOR=0: PLOT A,B: COLOR=15: B=B+1: PLOT A,B: E=E-1 -150 IF B<0+R THEN GOSUB 300 -160 IF A<0+R THEN GOSUB 300 -170 IF A>39-R THEN GOSUB 300 -180 IF B>39-R THEN GOSUB 300 -190 IF AV AND B>H THEN VTAB 23: HTAB 11: PRINT "YOU ARE IN THE HOT ZONE" -210 IF A=V AND B=H THEN HOME: FLASH: VTAB 21: PRINT "YOU FOUND THE EXIT!!!": NORMAL: FOR I=1 TO 700: COLOR=15: PLOT A,B: COLOR=0: PLOT A,B: NEXT I: R=R+1: GOTO 30 -215 IF Q=13 THEN RETURN -220 IF E<0 THEN 240 -230 GOTO 80 +110 IF SGN(I)=I OR I=3 THEN COLOR=0: PLOT A,B: COLOR=15: A=(I=1)+A-NOT I: B=INT(I/3)+B: PLOT A,B: E=E-1 +150 IF B39-R OR B>39-R THEN GOSUB 300 + +180 IF (A-V) * (B-H) > 0 THEN VTAB 23: I=A>V: HTAB I+10: PRINT "YOU ARE IN THE " MID$("COLDHOT",I*4 + 1,4) " ZONE" +190 ON A<>V OR B<>H GOTO 220:IF Q=13 THEN POP +200 HOME: FLASH: PRINT "YOU FOUND THE EXIT!!!": NORMAL +210 Q=15:FOR I=1 TO 20: COLOR=Q: PLOT A,B: Q=15-Q: FOR C=1 TO 300: NEXT C,I: R=R+1: ON R/2 GOTO 30,30,520 +220 IF Q=13 THEN RETURN +230 IF E>=0 GOTO 80 240 HOME: INVERSE: VTAB 21: PRINT "YOU RAN OUT OF ENERGY": NORMAL 250 F=7: GOSUB 310 + 260 FOR PAUSE=1 TO 5000: NEXT PAUSE 270 HOME: VTAB 21: PRINT "THE DOOR WAS IN THE RED AREA" 280 COLOR=1: PLOT V,H 290 GOTO 570 + 300 HOME: INVERSE: VTAB 21: PRINT "YOU HAVE ENTERED THE DEATH ZONE": NORMAL + 310 FOR I=1 TO 250 320 COLOR=G 330 PLOT A,B -340 G=G+1: IF G=16 THEN G=0 +340 G=G+1: IF G>15 THEN G=0 350 NEXT I 360 FOR C=1 TO 4 -370 W=A+1: X=A-1: Y=B+1: Z=B-1 -380 PLOT A,B -390 COLOR=0: PLOT A,B -400 FOR D=1 TO 10: COLOR=G -410 IF W>39 THEN W=39 -420 IF X39 THEN Y=39 -440 IF Z<0 THEN Z=0 +370 W=A: X=A: Y=B: Z=B +380 COLOR=0: PLOT A,B +390 FOR D=1 TO 10: COLOR=G +400 W=(W<39)+W: X=X-(X>0): Y=(Y<39)+Y: Z=Z-(Z>0) 450 PLOT W,B: PLOT X,B: PLOT A,Y: PLOT A,Z 455 FOR PAUSE=1 TO 250: NEXT PAUSE 460 COLOR=0: PLOT W,B: PLOT X,B: PLOT A,Y: PLOT A,Z -465 FOR PAUSE=1 TO 250: NEXT PAUSE -470 W=W+1: X=X-1: Y=Y+1: Z=Z-1 -480 G=G+1: NEXT D +470 FOR PAUSE=1 TO 250: NEXT PAUSE +480 G=(G+1) * (G<15): NEXT D 490 NEXT C: IF F=7 THEN RETURN 500 GR: GOTO 260 -510 FOR I=1 TO 200: NEXT I + 520 TEXT: HOME 530 PRINT "WELL DONE!" 540 PRINT: PRINT "YOU HAVE ESCAPED FROM ALL FIVE ROOMS" 550 PRINT "SUCCESSFULLY, WITH ";E;" UNITS OF" 560 PRINT "ENERGY LEFT.": PRINT + 570 PRINT "WANT TO PLAY AGAIN? Y/N" 580 GET A$: IF A$="Y" THEN 10 590 IF A$="N" THEN PRINT: PRINT "SO LONG!": END -600 PRINT: GOTO 570 +600 PRINT CHR$(7);: GOTO 580 + 610 HOME 620 PRINT "The object of this game is to escape" 630 PRINT "from a series of five rooms before you" -640 PRINT "run out of energy." -650 PRINT: PRINT "Each room contains an invisible door" -660 PRINT "you must locate to advance to the" -670 PRINT "next room." +640 PRINT "run out of energy. Each room contains" +650 PRINT "an invisible door you must locate to" +660 PRINT "advance to the next room." 680 PRINT: PRINT "Use the I, J, K and M keys to move" 690 PRINT "around the rooms." -700 PRINT: PRINT "PRESS ANY KEY TO CONTINUE" -710 GET P$: IF P$=" " THEN GOTO 720 -720 HOME: PRINT "Each room is divided into different" -730 PRINT "zones:" -740 PRINT: PRINT "All the area ABOVE and to the LEFT of" -750 PRINT "the door is called the COLD ZONE." -760 PRINT: PRINT "All the area BELOW and to the RIGHT of" -770 PRINT "the door is called the HOT ZONE." -780 PRINT: PRINT "When you enter one of these zones, a" -790 PRINT "message on the screen will tell you so." -800 PRINT "Use this information to help you locate each door." -810 PRINT: PRINT "You must also beware of the DEATH ZONE," -820 PRINT "which surrounds the border of each room.In each room, this zone is a little bit" -830 PRINT "wider than in the previous room." +700 PRINT: PRINT "Each room is made up of different zones:" +710 PRINT "All the area ABOVE and to the LEFT of" +720 PRINT "the door is called the COLD ZONE." +730 PRINT: PRINT "All the area BELOW and to the RIGHT of" +740 PRINT "the door is called the HOT ZONE." +750 PRINT: PRINT "When you enter one of these zones, a" +760 PRINT "message on the screen will tell you so." +770 PRINT "Use this information to help you locate each door." +780 VTAB 24: PRINT "PRESS ANY KEY TO CONTINUE "; +790 GET P$ +800 HOME: PRINT "You must also beware of the invisible" +810 PRINT "DEATH ZONE, which surrounds the border" +820 PRINT "of each room. In each room, this zone isa little bit wider than in the previous room." 840 PRINT: PRINT "If you ever enter this zone, the game" 850 PRINT "will end immediately!" -860 PRINT: PRINT "PRESS ANY KEY TO CONTINUE" -870 GET P$: IF P$=" " THEN GOTO 880 -880 HOME: PRINT "You have 200 units of energy." -890 PRINT "Every time you move one space, one unit" -900 PRINT "is used up." -910 PRINT: PRINT "If you make it through all five rooms, you win. But if you run out of energy orenter the DEATH ZONE, the game is over." +860 PRINT: PRINT "You have 200 units of energy." +870 PRINT "Every time you move one space, one unit" +880 PRINT "is used up." +890 PRINT: PRINT "If you make it through all five rooms," +900 PRINT "you win. But if you run out of energy orenter the DEATH ZONE, the game is over." 920 PRINT: PRINT "Good luck!" -930 PRINT: PRINT "PRESS ANY KEY TO START THE GAME" -940 GET P$: IF P$=" " THEN GOTO 10 -950 GOTO 10 - +930 VTAB 23: PRINT "PRESS ANY KEY TO START THE GAME "; +940 GET P$: GOTO 10 \ No newline at end of file diff --git a/samples/sample.enterprise2.txt b/samples/sample.enterprise2.txt new file mode 100644 index 0000000..c0e3f60 --- /dev/null +++ b/samples/sample.enterprise2.txt @@ -0,0 +1,34 @@ +5 PR#0:HOME +10 GR +20 COLOR=7 +22 HLIN 10,12 AT 17 +25 HLIN 8,16 AT 16 +30 HLIN 5,17 AT 15 +40 HLIN 7,15 AT 14 +45 HLIN 10,12 AT 13 +50 COLOR=13 +60 PLOT 11,12 +90 PLOT 11,18 +100 COLOR=7 +110 HLIN 15,17 AT 17 +120 HLIN 16,18 AT 18 +130 HLIN 17,27 AT 19 +140 HLIN 17,28 AT 20 +150 HLIN 17,25 AT 21 +160 HLIN 17,22 AT 22 +170 COLOR=1 +180 PLOT 16,21 +190 COLOR=7 +200 VLIN 15,18 AT 23 +210 VLIN 15,18 AT 24 +230 HLIN 20,31 AT 14 +240 HLIN 20,32 AT 13 +250 COLOR=9 +260 VLIN 13,14 AT 20 +270 COLOR=5 +280 VLIN 15,18 AT 22 +290 HLIN 20,21 AT 15 +300 HLIN 25,30 AT 15 +310 COLOR=1 +320 VLIN 14,15 AT 19 +330 PRINT "THE ORIGINAL SERIES ENTERPRISE" \ No newline at end of file diff --git a/samples/sample.factors.txt b/samples/sample.factors.txt index f6bf899..8ddb9ec 100644 --- a/samples/sample.factors.txt +++ b/samples/sample.factors.txt @@ -1,18 +1,18 @@ -90 home +90 text: pr#0: home 95 print "Enter a number to find its factors!" -97 print -100 input a -110 print -120 let f=0 -140 if A/2=int(A/2) then let A=A/2: print "2x";: let f=1: goto 140 -145 let i=3 -150 let e=int(sqr(a)) + 2 -155 let f=0 -160 for n=i to e step 2 -180 if a/n=int(a/n) then print n;"x";: let a=a/n: let i=n: let n=e: let f=1 -200 next n +97 print "(Zero to quit.)" +100 print: input a: a=abs(a) +110 print: if not a then print "Bye!";: end +120 s=2: e=1 +130 n=0: for i=s to e step 2 +150 f=a/i +160 if int(f)=f then let a=f: n=n+1: goto 150 +170 if n then print i;: s=i: i=e +180 next +190 if n>1 then print "^"; n; +200 if n and a>1 then print " x "; 210 rem print a;" "; n;" "; i;" "; e;" ";f -220 if a>n and f<>0 then goto 155 -230 print a -235 print -240 goto 100 \ No newline at end of file +220 s=(s>2)+s+1: n=(s>3)*2+not n +230 if n<3 and a>1 then e=sqr(a): goto 130 +240 if n=1 or a>1 then print a; +250 print: goto 100 \ No newline at end of file diff --git a/samples/sample.gaussian.txt b/samples/sample.gaussian.txt index 3bcc5b6..647a740 100644 --- a/samples/sample.gaussian.txt +++ b/samples/sample.gaussian.txt @@ -1,47 +1,47 @@ -5 rem Plot Gaussian distribution in two dimensions -10 text: home: PRINT "Std. Dev. = ";: input s1 -20 hgr: hcolor = 3 -30 w = 279: h = 159 -40 w0 = w - 100: w1 = w0/10 -45 h1 = h - 100: h2 = h - 60 -50 k = 0.5: m = 1 / (2 * 3.14159265 * s1 * s1) -60 for i = 0 to 10 step k -70 x = 10 * i + 1: y = 10 * i + h1 -75 hplot x,y -80 for j = 0 to w0 step 1 -85 j1 = 10 * j / w0 -90 d1 = abs(5 - i) -100 d2 = abs(5 - j1) -110 r2 = (d1*d1+d2*d2)/(2*s1*s1) -120 g = exp(-r2)/(2*3.14159*s1*s1) -130 a = int((h2 * g)/ m) -140 x = 10 * i + w1 * j1 + 1 -150 y = 10 * i + h1 - a -160 hplot to x,y -170 if (i = 0) goto 265 -175 if (j = w0) goto 190 -180 j2 = int(j/10): if ((j/10) <> j2) goto 290 -190 d1 = abs(5 - i + k) -200 d2 = abs(5 - j1) -210 r2 = (d1*d1+d2*d2)/(2*s1*s1) -220 u = exp(-r2)/(2*3.14159*s1*s1) -225 a1 = int((h2 * u)/ m) -230 x1 = 10 * (i - k) + w1 * j1 + 1 -240 y1 = 10 * (i - k) + h1 - a1 -245 rem if (y <= y1) goto 290 -250 hplot to x1,y1 -260 hplot x,y -265 if (j = 0) goto 310 -270 if (i < 10) goto 290 -275 if (j = w0) goto 295 -280 j2 = int(j/10): if ((j/10) = j2) goto 295 -290 hcolor = 0 -295 hplot to x,10 * i + h1 -300 hcolor = 3 -305 hplot x,y -310 next j -320 next i -330 hplot w+1,h: hplot to 100+1,h: hplot to 0+1,h1 -340 vtab 21: print "Gaussian (standard deviation = ";s1;")" -350 print "Plot from -5.0 to + 5.0" -360 print "Peak value = "m +5 rem Plot Gaussian distribution in two dimensions +10 text: home: PRINT "Standard Deviation = ";: input s1 +20 hgr: hcolor = 3 +30 w = 278: h = 155: p2 = atn(1) * 8 +40 w0 = w - 100: w1 = w0/10 +45 h1 = h - 100: h2 = h - 60 +50 k = 0.5: m = 1 / (p2 * s1 * s1) +60 for i = 0 to 10 step k +70 x = 10 * i + 1: y = 10 * i + h1 +75 hplot x,y +80 for j = 0 to w0 +85 j1 = 10 * j / w0 +90 d1 = abs(5 - i) +100 d2 = abs(5 - j1) +110 r2 = (d1*d1+d2*d2)/(2*s1*s1) +120 g = exp(-r2)/(p2*s1*s1) +130 a = int((h2 * g)/ m) +140 x = 10 * i + w1 * j1 + 1 +150 y = 10 * i + h1 - a +160 hplot to x,y +170 if not i goto 265 +175 if j = w0 goto 190 +180 j2 = j/10: if int(j2) <> j2 goto 290 +190 d1 = abs(5 - i + k) +200 d2 = abs(5 - j1) +210 r2 = (d1*d1+d2*d2)/(2*s1*s1) +220 u = exp(-r2)/(p2*s1*s1) +225 a1 = int(h2 * u / m) +230 x1 = 10 * (i - k) + w1 * j1 + 1 +240 y1 = 10 * (i - k) + h1 - a1 +245 rem if y <= y1 goto 290 +250 hplot to x1,y1 +260 hplot x,y +265 if not j goto 310 +270 if i < 10 goto 290 +275 if j = w0 goto 295 +280 j2 = j/10: if int(j2) = j2 goto 295 +290 hcolor = 0 +295 hplot to x,10 * i + h1 +300 hcolor = 3 +305 hplot x,y +310 next j +320 next i +330 hplot w+1,h: hplot to 100+1,h: hplot to 0+1,h1 +340 vtab 21: print "Gaussian (std. dev. = ";s1;")" +350 print "Plot from -5.0 to + 5.0" +360 print "Peak value = "m \ No newline at end of file diff --git a/samples/sample.hangman.txt b/samples/sample.hangman.txt index bfbecf8..f0631ad 100644 --- a/samples/sample.hangman.txt +++ b/samples/sample.hangman.txt @@ -1,613 +1,451 @@ -100 REM ***HANGMAN** -120 REM BY MIKE GLEASON, 1986, 2011 -140 REM -160 REM ==WELCOME SCREEN== -180 TEXT : HOME :SW = PEEK (33):ES$ = "": GG = 1: SND = 1: DD = 0.040: JY = 0 -188 DD = 0.0010 : SND = 0: GOTO 380: REM Hack to work in the JavaScript emulator -200 IF (GG < 1) THEN 380 -220 IF (PEEK(103) <> 1) THEN 280 -240 IF (PEEK(104) = 64) AND (PEEK(16384) = 0) THEN 380 -260 IF (PEEK(104) = 96) AND (PEEK(24576) = 0) THEN 380 -280 PRINT "THIS VERSION OF HANGMAN IS TOO BIG" -300 PRINT "TO RUN WITHOUT HELP FROM YOU.":PRINT -320 PRINT "PLEASE TYPE THE FOLLOWING:":PRINT -340 PRINT "NEW":PRINT "POKE 103, 1":PRINT "POKE 104, 64":PRINT "POKE 16384, 0":PRINT "RUN HANGMAN" -360 END -380 VTAB 12:I = SW / 2 - 6: HTAB I: PRINT "_ _ _ _ _ _ _"; -400 GOSUB 13800 : REM INIT SOUND -420 D = 1: GOSUB 800: HTAB I + 8: PRINT "M"; -440 D = 1: GOSUB 800: HTAB I + 4: PRINT "N";: HTAB I + 12: PRINT "N"; -460 D = 1: GOSUB 800: HTAB I + 6: PRINT "G"; -480 D = 1: GOSUB 800: HTAB I + 2: PRINT "A";: HTAB I + 10: PRINT "A"; -500 D = 1: GOSUB 800: HTAB I + 0: PRINT "H"; -520 D = 2: GOSUB 800: HTAB I + 0: FLASH : PRINT "H A N G M A N": NORMAL : PRINT -540 D = 2: GOSUB 800 -560 A$ = "(C) 1986, 2011 by Mike Gleason" -580 I = SW / 2 - ( LEN (A$) - 0) / 2 -600 HTAB I: PRINT A$; -620 A$ = "Loading, please wait..." -640 I = SW / 2 - ( LEN (A$) - 3) / 2 -660 VTAB 23: HTAB I: PRINT A$;: JY=1 -680 GOTO 1100 -700 : -720 : -800 REM ==DELAY SUBROUTINE== -820 REM Unfortunately, I don't know of a way to make this delay constant -840 REM across CPU speeds. For example, in an emulator, this code may -860 REM run too fast. You can try changing DD to modulate the speed. -880 IF ( PEEK (49152) > 127) THEN 940: REM SKIP DELAY UPON KEYBOARD INPUT -900 D = D - DD: IF D > 0 THEN 880 -920 GOTO 980 -940 A$ = CHR$ ( PEEK (49152) - 128) -960 IF (JY=1) THEN POKE 49168,0 -980 RETURN -1000 : -1020 : -1100 REM ==INITIALIZE PROGRAM== -1120 DIM GZ%(32) -1140 GOSUB 3200: REM SETUP LIMBS -1160 GOSUB 13200: REM LOAD WORDS -1180 GOSUB 2500: REM SETUP SCREEN -1200 PRINT "Shall I be [e]asy, " -1220 PRINT " [m]edium, " -1240 PRINT " or [h]ard on you? "; -1260 POKE 49168,0: REM CLEAR KEYB BUFFER -1280 GOSUB 1800 -1300 IF (A$ = "E") THEN EZ = 1: GOTO 1400 -1320 IF (A$ = "M") THEN EZ = 2: GOTO 1400 -1340 IF (A$ = "H") THEN EZ = 3: GOTO 1400 -1360 PRINT : GOTO 1200 -1400 REM ==GAME LOOP== -1420 HOME:VTAB 24 -1440 CHEET = 0 -1460 PRINT : GOSUB 2100 -1480 PRINT "Play again? (Yes/No) ";: GOSUB 1800 -1500 IF (A$ = "Y") THEN 1400 -1520 ES$ = "": GOTO 1620 -1600 REM ==CLEANUP AND EXIT== -1620 TEXT -1640 IF (ES$ = "") THEN 1720 -1660 GOSUB 14300: REM RING BELL -1680 PRINT : PRINT "* ERROR: ";ES$;"." -1700 END -1720 HOME -1740 PRINT "GOOD BYE." -1760 END -1800 REM ==GET 1 UPPERCASE CHAR== -1820 GET A$:A$ = LEFT$ (A$,1) -1840 IF (A$ = CHR$ (1)) THEN CHEET = 1: GOTO 1980 -1860 IF (A$ = CHR$ (27)) OR (A$ = CHR$ (3)) THEN 1600 -1880 A = ASC (A$) -1900 IF ( ASC ("A") < = A) AND (A < = ASC ("Z")) THEN 2020 -1920 IF (A < ASC ("a")) OR (A > ASC ("z")) THEN 1980 -1940 A$ = CHR$ (A - ( ASC ("a") - ASC ("A"))) -1960 GOTO 2020 -1980 GOSUB 14300: REM RING BELL -2000 GOTO 1820 -2020 RETURN -2040 : -2060 : -2100 REM ==GAME SUBROUTINE== -2120 GOSUB 3600: REM SETUP GRAPHICS -2140 GOSUB 9600: REM CHOOSE A SECRET WORD -2160 POKE 49168,0: REM CLEAR KEYB BUFFER -2180 NLIMBS = 0:GAMEOVER = 0 -2200 FOR I = 0 TO 30:GZ%(I) = 0: NEXT I -2220 HOME: VTAB 21 -2300 REM --GUESS LOOP-- -2320 GOSUB 7400: REM DISPLAY STATUS -2340 GOSUB 7700: REM GET A GUESS -2360 GOSUB 8100: REM CHECK GUESS -2380 IF GAMEOVER = 0 THEN 2300 -2400 RETURN -2420 : -2440 : -2500 REM ==SETUP SCREEN== -2520 TEXT : HOME : CB$ = "an" : CA$ = "ANIMAL" -2540 A$ = "Welcome to HANGMAN!": GOSUB 3000: PRINT : PRINT -2560 PRINT "You have been condemned for execution." -2580 PRINT "To escape this fate, you must guess" -2600 PRINT "the secret word (";CB$;" ";CA$;") by " -2620 PRINT "choosing letters from the alphabet." -2640 PRINT -2660 PRINT "The secret word's letters will be shown" -2680 PRINT "as dashes at first, and then will" -2700 PRINT "change to letters as you guess them." -2720 PRINT -2740 PRINT "With each incorrect guess, one body" -2760 PRINT "part will be added to the gallows." -2780 PRINT "Guess the secret word before all your" -2800 PRINT "limbs are hanging!" -2820 PRINT -2840 A$ = "Press any key to begin!": GOSUB 3000 -2841 POKE 49168,0: REM CLEAR KEYB BUFFER -2842 I=1: REM Initialize random number generator -2845 IF ( PEEK (49152) > 127) THEN 2860 -2848 I = I + 1 -2850 IF I > 127 THEN 2842 -2852 GOTO 2845 -2860 GET A$ -2863 L=RND(-I) -2880 HTAB 1: CALL - 868: REM ERASE STATUS MESSAGE -2900 RETURN -2920 : -2940 : -3000 REM ==PRINT CENTERED== -3020 HTAB (40 / 2 - LEN (A$) / 2) -3040 PRINT A$; -3060 RETURN -3080 : -3100 : -3200 REM ==SETUP LIMBS== -3220 DIM LIMBS$(11) -3240 LIMBS$(1) = "HEAD" -3260 LIMBS$(2) = "LEFT EYE" -3280 LIMBS$(3) = "RIGHT EYE" -3300 LIMBS$(4) = "NOSE" -3320 LIMBS$(5) = "MOUTH" -3340 LIMBS$(6) = "TORSO" -3360 LIMBS$(7) = "LEFT ARM" -3380 LIMBS$(8) = "RIGHT ARM" -3400 LIMBS$(9) = "LEFT LEG" -3420 LIMBS$(10) = "RIGHT LEG" -3440 LIMBS$(11) = "***HANGMAN***" -3460 RETURN -3480 : -3500 : -3600 REM ==SETUP GRAPHICS== -3620 IF (GG = 0) THEN 3680 -3640 HGR : GW=280 : GH=160 : REM THIS IS ALL FOR NOW -3660 GOSUB 3800: REM DRAW GALLOWS -3680 RETURN -3700 : -3720 : -3800 REM ==DRAW GALLOWS== -3820 IF (GG = 0) THEN 3980 -3840 HCOLOR=1:FOR I=GH-1 TO 152 STEP -1:HPLOT 0,I TO GW-1,I:NEXT I -3860 HCOLOR=3 -3880 FOR I=152 TO 148 STEP -1:HPLOT 70,I TO 210,I:NEXT I -3900 FOR I=80 TO 88:HPLOT I,10 TO I,152:NEXT I -3920 FOR I=10 TO 18:HPLOT 88,I TO 147,I:NEXT I -3940 FOR I=0 TO 7:HPLOT 80,48+I TO 110+I,18:NEXT I -3960 FOR I=147 TO 145 STEP -1:HPLOT I,18 TO I,30:NEXT I -3980 RETURN -4000 : -4020 : -4100 REM ==DRAW LIMB== -4120 IF (GG = 0) THEN 4180 -4140 ON NLIMBS GOSUB 4300, 4500, 4700, 4900, 5100, 5500, 5600, 5700, 5800, 5900 -4160 GOTO 4200 -4180 VTAB 21: HTAB 1: CALL -868: PRINT "Your ";LIMBS$(NLIMBS);" is now hanging!": -4200 RETURN -4220 : -4240 : -4300 REM ==DRAW HEAD== -4320 REM Note: It'd be quicker (and use less code) to just HPLOT out the -4340 REM circle by hand rather than calling my CIRCLE2 subroutine, but -4360 REM then the trigonometry lesson would be wasted. -4380 HCOLOR=2 -4400 REM HPLOT 126,30 TO 166,30 TO 166,70 TO 126,70 TO 126,30 -4420 RADIUS=20:CX=146:CY=50:FILL=0:GOSUB 6000 -4440 RETURN -4460 : -4480 : -4500 REM ==DRAW LEFT EYE== -4520 HCOLOR=6:HPLOT 137,43 TO 140,43 -4540 HPLOT 136,44 TO 141,44 -4560 HPLOT 137,45 TO 140,45 -4580 RETURN -4600 : -4620 : -4700 REM ==DRAW RIGHT EYE== -4720 HCOLOR=6:HPLOT 152,43 TO 155,43 -4740 HPLOT 151,44 TO 156,44 -4760 HPLOT 152,45 TO 155,45 -4780 RETURN -4800 : -4820 : -4900 REM ==DRAW NOSE== -4920 HCOLOR=0: -4940 IF (FILL=1) THEN 4980 -4960 HCOLOR=3 -4980 HPLOT 146,48 TO 143,52 TO 146,52 -5000 RETURN -5020 : -5040 : -5100 REM ==DRAW MOUTH== -5120 HCOLOR=5: HPLOT 140,60 TO 143,56 TO 149,56 TO 152,60 -5140 RETURN -5160 : -5180 : -5200 REM ==DRAW SMILEY MOUTH== -5220 IF GG=0 THEN 5440 -5240 HCOLOR=0: HPLOT 140,60 TO 143,56 TO 149,56 TO 152,60 -5260 HCOLOR=0 -5280 HPLOT 146,70 TO 146,106:HPLOT 146,88 TO 116,58:HPLOT 146,88 TO 176,58 -5300 HPLOT 146,106 TO 116,140:HPLOT 146,106 TO 176,140 -5320 GOSUB 3880 -5340 IF (NLIMBS < 1) THEN GOSUB 4380 -5360 IF (NLIMBS < 2) THEN GOSUB 4500 -5380 IF (NLIMBS < 3) THEN GOSUB 4700 -5400 IF (NLIMBS < 4) THEN GOSUB 4900 -5420 HCOLOR=5: HPLOT 138,60 TO 143,64 TO 149,64 TO 154,60 -5440 RETURN -5460 : -5480 : -5500 REM ==DRAW TORSO== -5520 HCOLOR=2: HPLOT 146,70 TO 146,106 -5540 RETURN -5560 : -5580 : -5600 REM ==DRAW LEFT ARM== -5620 HPLOT 146,88 TO 116,58 -5640 RETURN -5660 : -5680 : -5700 REM ==DRAW RIGHT ARM== -5720 HPLOT 146,88 TO 176,58 -5740 RETURN -5760 : -5780 : -5800 REM ==DRAW LEFT LEG== -5820 HPLOT 146,106 TO 116,140 -5840 RETURN -5860 : -5880 : -5900 REM ==DRAW RIGHT LEG== -5920 HPLOT 146,106 TO 176,140 -5940 RETURN -5960 : -5980 : -6000 REM *** SUBROUTINE: CIRCLE2 -6020 REM * IN: RADIUS -6040 REM * IN: CX (X COORDINATE OF CENTER) -6060 REM * IN: CY (Y COORDINATE OF CENTER) -6080 REM * IN: FILL (0 OR 1) -6100 REM *** -6120 PI = ATN (1) * 4: REM = 3.14159265 -6140 I0 = PI / 2:I1 = 0:DI = PI / (RADIUS * 4) -6160 I1 = I1 - 0.1: REM SLOP TO FILL IN LAST LINE -6180 I = I0 -6200 IF (I < = I1) THEN 7360 -6220 X0 = - 666:X1 = - 666:Y0 = - 666 -6300 REM -6320 DX = COS (I) * RADIUS:X = INT (0.5 + CX - DX) -6340 DY = SIN (I) * RADIUS:Y = INT (0.5 + CY - DY) -6400 REM PRINT "X = ";X;", Y = ";Y -6420 IF (X0 = - 666) THEN 6500 -6440 IF (Y0 < > Y) THEN 6600 -6460 X1 = X -6480 GOTO 7300 -6500 REM FIRST POINT IN NEW LINE -6520 X0 = X:X1 = X:Y0 = Y: GOTO 7300 -6600 REM END OF LINE -6620 IF X0 < = - 666 THEN 7200 -6640 R0X = CX + (CX - X0) -6660 IF R0X < GW THEN 6700 -6680 R0X = GW - 1 -6700 R1X = CX + (CX - X1) -6720 IF R1X < GW THEN 6760 -6740 R1X = GW - 1 -6760 IF X0 > = 0 THEN 6800 -6780 X0 = 0 -6800 IF X1 > = 0 THEN 6840 -6820 X1 = 0 -6840 Y2 = CY + (CY - Y0) -6900 REM DRAW THE LINE(S) -6920 REM PRINT "HPLOT ";X0;",";Y0;" TO ";R0X;",";Y0 -6940 REM GET A$:IF (A$ = "Q") THEN END -6960 IF (Y0 < 0) OR (Y0 > = GH) THEN 7040: REM LINE NOT ON SCREEN -6980 IF FILL = 0 THEN 7020 -7000 HPLOT X1,Y0 TO R1X,Y0: GOTO 7040 -7020 HPLOT X1,Y0 TO X0,Y0: HPLOT R0X,Y0 TO R1X,Y0 -7040 IF (Y2 < 0) OR (Y2 > = GH) THEN 7120 -7060 IF FILL = 0 THEN 7100 -7080 HPLOT X1,Y2 TO R1X,Y2: GOTO 7120 -7100 HPLOT X1,Y2 TO X0,Y2: HPLOT R0X,Y2 TO R1X,Y2 -7120 Y0 = Y0 + 1:Y2 = Y2 - 1 -7140 IF Y0 < = Y THEN 6960 -7200 REM END OF DRAWING LINE -7220 I = I - DI -7240 GOTO 6200 -7300 REM END OF RADIAN, PREPARE NEXT -7320 I = I - DI -7340 IF (I > I1) THEN 6300 -7360 RETURN -7400 REM ==DISPLAY STATUS== -7420 REM HOME -7440 IF CHEET = 0 THEN 7520 -7460 VTAB 21: HTAB 1: CALL -868: PRINT "* Pssst... the word is ";SECRET$;"." -7480 D = 2: GOSUB 800 -7500 CHEET=0 -7520 I = SW / 2 - LEN (HIDDEN$) / 2 -7540 IF I < 1 THEN 7580 -7560 VTAB 22: HTAB I -7580 PRINT HIDDEN$ -7600 RETURN -7620 : -7640 : -7700 REM ==GET A GUESS== -7720 OGUESS$ = "" -7740 FOR I = 0 TO 25 -7760 IF (GZ%(I) > 0) THEN 7820 -7780 OGUESS$ = OGUESS$ + CHR$ ( ASC ("A") + I) -7800 GOTO 7840 -7820 OGUESS$ = OGUESS$ + "." -7840 NEXT I -7860 VTAB 23: CALL - 868 -7880 VTAB 24: HTAB 1: PRINT "Guess? (";OGUESS$;") "; -7900 GOSUB 1800:GUESS$ = A$ -7920 IF (GZ%( ASC (A$) - ASC ("A")) = 0) THEN 7980 -7940 GOSUB 14300: REM RING BELL ON DUPE GUESS -7960 GOTO 7880 -7980 GZ%( ASC (A$) - ASC ("A")) = 1 -8000 HTAB 1: CALL - 868 -8020 L=ASC(A$) - ASC("A") + 1:FOR I=1 TO L:D=RND(1):NEXT I:REM TWEAK RANDOM -8025 RETURN -8040 : -8060 : -8100 REM ==CHECK GUESS== -8120 OK = 0:DUP = 0:TK = 0:NHIDDEN$ = "" -8140 FOR I = 1 TO LEN (SECRET$) -8160 IF I = 1 THEN 8200 -8180 NHIDDEN$ = NHIDDEN$ + " " -8200 A$ = MID$ (HIDDEN$,2 * I - 1,1) -8220 IF (A$ = "_") THEN 8260 -8240 TK = TK + 1 -8260 IF ( MID$ (SECRET$,I,1) < > GUESS$) THEN 8340 -8280 IF (A$ = GUESS$) THEN DUP = 1 -8300 A$ = GUESS$ -8320 OK = OK + 1 -8340 NHIDDEN$ = NHIDDEN$ + A$ -8360 NEXT I -8380 IF (DUP = 1) THEN 8900 -8400 IF (OK = 0) THEN 9000 -8420 TK = TK + OK -8440 IF TK = LEN (SECRET$) THEN 9400 -8500 REM CORRECT GUESS -8520 IF (SND > 0) THEN POKE 768,32: POKE 769,12: CALL 770 -8540 RARE$ = "QZXJ":FRARE = 0 -8560 FOR I = 1 TO LEN (RARE$) -8580 IF ( MID$ (RARE$,I,1) = GUESS$) THEN FRARE = 1 -8600 NEXT I -8620 IF FRARE = 0 THEN 8660 -8640 PRINT "Glorious!!!";: GOTO 8780 -8660 I = INT ( RND (1) * 3) + 1 -8680 ON I GOTO 8720,8740,8760 -8700 PRINT "Whaa? This wasn't supposed to happen.";: GOTO 8780 -8720 PRINT "Bah! Lucky guess.";: GOTO 8780 -8740 PRINT "Nice work!";: GOTO 8780 -8760 PRINT "Good job!";: GOTO 8780 -8780 HIDDEN$ = NHIDDEN$ -8800 D=2: GOSUB 800:HTAB 1: CALL -868:GOTO 9520 -8900 REM DUPLICATE GUESS -8920 PRINT "You already guessed '";GUESS$;"'."; -8940 GOTO 9520 -9000 REM WRONG GUESS -9020 I=20: GOSUB 14200: REM BZZZ -9040 PRINT "Wrong! The secret word has no '";GUESS$;"'."; -9060 NLIMBS = NLIMBS + 1 -9080 GOSUB 4100: REM SHOW NEWLY ADDED LIMB ON THE GALLOWS -9100 IF (LIMBS$(NLIMBS + 1) = "***HANGMAN***") THEN 9200 -9120 D=1: GOSUB 800:CALL -868:GOTO 9520 -9200 REM YOU LOSE -9220 GAMEOVER = 1 -9240 PRINT : HTAB 1: CALL -868: PRINT "You lose. The secret word was... " -9260 HTAB 1: CALL -868: PRINT " ";SECRET$;"." -9280 A$ = "48 ,27 ,57 ,54 ,72 ,54 ,114,255.": GOSUB 14000 -9300 GOTO 9520 -9400 REM YOU WIN -9420 HTAB 1: CALL -868: PRINT "You WIN! You solved the secret word, " -9440 HTAB 1: CALL -868: PRINT " ";SECRET$;"." -9460 A$ = "128,27 ,114,54 ,114,54 ,85 ,216.": GOSUB 14000 -9480 GAMEOVER = 1 -9500 GOSUB 5200 -9520 RETURN -9540 : -9560 : -9600 REM ==SELECT WORD== -9620 HOME:VTAB 24:PRINT "Choosing word, please wait..."; -9640 NR = 0 -9660 NR = NR + 1: IF (NR > 100) THEN ES$ = "COULD NOT LOAD A VALID WORD": GOTO 1620 -9680 IF NW < = 0 THEN ES$ = "NO WORDS LOADED": GOTO 1620 -9700 RESTORE -9720 WI = INT ( RND (1) * NW) + 1 -9740 IF WI = WO THEN 9720: REM DON'T PICK SAME WORD -9760 FOR I = 1 TO WI -9780 READ SECRET$ -9800 NEXT I -9820 OK = 0:AA = ASC ("A"):AZ = ASC ("Z") -9840 FOR I = 1 TO LEN (SECRET$) -9860 C = ASC ( MID$ (SECRET$,I,1)) -9880 IF (C < AA) OR (C > AZ) THEN 9920 -9900 OK = OK + 1 -9920 NEXT I -9940 IF ( LEN (SECRET$) < 3) OR ( LEN (SECRET$) > 20) THEN OK = 0: GOTO 10200 -10000 REM IF (EZ = 1) AND ( LEN (SECRET$) > 5) THEN OK = 0: GOTO 10200 -10020 A$ = SECRET$: GOSUB 12100: REM SET WD=WORD DIFFICULTY -10100 REM HTAB 1:PRINT "___ ";SECRET$;" = ";WD -10120 IF (EZ = 1) AND (WD > 0.36) THEN OK = 0 -10140 IF (EZ = 2) AND ((WD < = 0.36) OR (WD > 0.66)) THEN OK = 0 -10160 IF (EZ = 3) AND (WD < = 0.66) THEN OK = 0 -10180 IF (OK > 0) THEN 10320 -10200 REM ==WORD NOT OK, PICK ANOTHER== -10220 WI = WI + 1 -10240 IF (WI > NW) THEN GOTO 9660 -10260 NR = NR + 1: IF (NR > 100) THEN ES$ = "COULD NOT LOAD A VALID WORD": GOTO 1620 -10280 READ SECRET$ -10300 GOTO 9820 -10320 WO = WI -10400 REM SECRET$="TYRANNOSAURUS REX" : REM FOR TESTING -10420 HIDDEN$ = "" -10440 FOR I = 1 TO LEN (SECRET$) -10460 IF I = 1 THEN 10500 -10480 HIDDEN$ = HIDDEN$ + " " -10500 C = ASC ( MID$ (SECRET$,I,1)) -10520 IF (C < AA) OR (C > AZ) THEN 10560 -10540 HIDDEN$ = HIDDEN$ + "_": GOTO 10580 -10560 HIDDEN$ = HIDDEN$ + MID$ (SECRET$,I,1) -10580 NEXT I -10600 HTAB 1: CALL - 868: REM ERASE STATUS MESSAGE -10620 RETURN -10640 : -10660 : -10700 REM ==COUNT AVAILABLE WORDS== -10720 REM THE ARRAYS BELOW ARE USED TO CALCULATE LETTER FREQUENCIES, WHICH IN -10740 REM TURN ARE USED TO CATEGORIZE WORDS INTO EASY, MEDIUM, AND HARD LEVELS. -10760 REM THE FQ TABLE IS INITIALIZED TO THE FREQUENCIES CORRESPONDING TO -10780 REM OVERALL ENGLISH LANGUAGE USAGE. IF CQ<>0, THEN WE OVERWRITE THESE -10800 REM WITH THE FREQS DETERMINED FROM THE WORD LIST ITSELF, WHICH IS MORE -10820 REM MORE ACCURATE BUT TAKES A LOT OF TIME TO DO AT STARTUP. -10840 DIM FQ(27),FC(27) -10860 FQ(0) = 8.167: REM "A" -10880 FQ(1) = 1.492 -10900 FQ(2) = 2.782 -10920 FQ(3) = 4.253 -10940 FQ(4) = 12.702 -10960 FQ(5) = 2.228 -10980 FQ(6) = 2.015 -11000 FQ(7) = 6.094 -11020 FQ(8) = 6.966 -11040 FQ(9) = 0.153 -11060 FQ(10) = 0.772 -11080 FQ(11) = 4.025 -11100 FQ(12) = 2.406 -11120 FQ(13) = 6.749 -11140 FQ(14) = 7.507 -11160 FQ(15) = 1.929 -11180 FQ(16) = 0.095 -11200 FQ(17) = 5.987 -11220 FQ(18) = 6.327 -11240 FQ(19) = 9.056 -11260 FQ(20) = 2.758 -11280 FQ(21) = 0.978 -11300 FQ(22) = 2.360 -11320 FQ(23) = 0.150 -11340 FQ(24) = 1.974 -11360 FQ(25) = 0.074: REM "Z" -11380 CQ = 0 -11400 FOR I = 0 TO 26:FC(I) = 0: NEXT I -11420 RESTORE :NW = 0:NB = 0 -11440 READ SECRET$ -11460 IF SECRET$ = "*NO MORE WORDS*" THEN 11700 -11480 IF (CQ = 0) THEN 11620 -11500 L = LEN (SECRET$):AA = ASC ("A"):AZ = ASC ("Z") -11520 FOR I = 1 TO L -11540 C = ASC ( MID$ (SECRET$,I,1)) -11560 IF (C < AA) OR (C > AZ) THEN 11600 -11580 C = C - AA:FC(C) = FC(C) + 1 -11600 NEXT I -11620 NW = NW + 1 -11640 IF NW > 10000 THEN ES$ = "INVALID WORD DATA": GOTO 1620 -11660 IF ( LEN (SECRET$) < 3) OR ( LEN (SECRET$) > 20) THEN NB = NB + 1 -11680 GOTO 11440 -11700 IF (NW < 1) OR (NB > = NW) THEN ES$ = "INVALID WORD DATA": GOTO 1620 -11800 REM COMPUTE ALPHABET FREQUENCIES -11820 FOR I = 0 TO 25:FC(26) = FC(26) + FC(I): NEXT I -11840 IF CQ = 0 THEN 11900 -11860 FOR I = 0 TO 25:FQ(I) = FC(I) * 100 / FC(26): NEXT I -11900 REM GOSUB 12600 -11920 REM GOSUB 12800 -11940 REM A$="YAK": GOSUB 12100 -11960 RETURN -11980 : -12000 : -12100 REM ==CALCULATE WORD DIFFICULTY== -12120 IF (FQ(0) < = 0) THEN 12440 -12140 WD = 0:AA = ASC ("A"):AZ = ASC ("Z") -12160 L = LEN (A$) -12180 FOR I = 1 TO L -12200 C = ASC ( MID$ (A$,I,1)) -12220 IF (C < AA) OR (C > AZ) THEN 12280 -12240 QC = FQ(C - AA) -12260 WD = WD + 1 / (QC * QC) -12280 NEXT I -12300 IF (WD < = 0) OR (L < = 0) THEN 12440 -12400 REM WD = WD / L -12420 GOTO 12500 -12440 WD = 0 -12500 REM HTAB 1:PRINT:PRINT "DIFFICULTY FOR ";A$;" = ";WD;".":PRINT -12520 RETURN -12540 : -12560 : -12600 REM ==PRINT FREQUENCIES== -12620 HTAB 1: PRINT : PRINT -12640 AA = ASC ("A") -12660 FOR I = 1 TO 13 -12680 PRINT CHR$ (AA + I - 1);": ";FQ(I - 1);" "; CHR$ (AA + I - 1 + 13);": ";FQ(I - 1 + 13) -12700 NEXT I -12720 PRINT : INPUT "PRESS RETURN TO CONTINUE...";A$ -12740 RETURN -12760 : -12780 : -12800 REM ==CALCULATE AVERAGE WORD DIFFICULTY== -12820 RESTORE -12840 NW = 0:TD = 0:D0 = 999999:D9 = - 1:W0$ = "":W9$ = "" -12860 READ SECRET$ -12880 IF SECRET$ = "*NO MORE WORDS*" THEN 13000 -12900 A$ = SECRET$: GOSUB 12100 -12920 NW = NW + 1:TD = TD + WD -12940 IF WD < D0 THEN D0 = WD:W0$ = A$ -12960 IF WD > D9 THEN D9 = WD:W9$ = A$ -12980 GOTO 12860 -13000 IF NW < = 0 THEN 13140 -13020 TD = TD / NW -13040 HTAB 1: PRINT : PRINT -13060 PRINT "AVG DIFFICULTY = ";TD -13080 PRINT "EASIEST WORD = ";D0;", ";W0$ -13100 PRINT "HARDEST WORD = ";D9;", ";W9$ -13120 PRINT : INPUT "PRESS RETURN TO CONTINUE...";A$ -13140 RETURN -13160 : -13180 : -13200 REM ================== -13220 REM DATA SECTION: -13240 REM SECRET WORDS ARE -13260 REM LISTED BELOW. -13280 REM ================== -13300 NW = 0: REM NUMBER OF WORDS LOADED -13320 SECRET$ = "" -13340 WI = - 1: REM SECRET WORD # -13360 WO = - 1: REM PREVIOUS SECRET WORD # -13380 DATA ALLIGATOR,ANT,APE,BAT,BEAR,BEE,BIRD,BOBCAT,CAT,CENTIPEDE,CHEETAH,CHICKEN,CHIMPANZEE,CLAM,COBRA -13400 DATA CONDOR,COUGAR,COW,CROCODILE,DEER,DINGO,DOG,DONKEY,DUCK,EAGLE,ELECTRIC EEL,ELEPHANT,ELK,EMU,FISH,FOX,FROG,GAZELLE -13420 DATA GIRAFFE,GOAT,GOOSE,GORILLA,GRIZZLY BEAR,HAWK,HEDGEHOG,HIPPOPOTAMUS,HORSE,HYENA,IGUANA,JAGUAR -13440 DATA JELLYFISH,KANGAROO,KRILL,LEMUR,LEOPARD,LION,LIZARD,LLAMA,LOBSTER,LYNX,MOLE,MONKEY,MOOSE,NEWT -13460 DATA OCTOPUS,OKAPI,OPOSSUM,ORANGUTAN,OTTER,OWL,PANDA,PENGUIN,PIG,POLAR BEAR,PORCUPINE,PUMA,QUAIL -13480 DATA RABBIT,RACCOON,REINDEER,RHINOCEROS,SCORPION,SEA LION,SEAL,SHARK,SHRIMP,SNAIL,SNAKE,SPIDER,SQUID -13500 DATA SQUIRREL,TIGER,TOAD,TORTOISE,TUNA,TURKEY,TURTLE,TYRANNOSAURUS REX,VOLE,VULTURE,WALRUS,WARTHOG,WASP,WHALE,WILDCAT,WILDEBEEST -13520 DATA WOLF,WORM,YAK,ZEBRA -13540 DATA "*NO MORE WORDS*" -13600 REM THIS VERSION OF THE PROGRAM -13620 REM HAS DATA BUILT-IN, RATHER -13640 REM THAN USING A DATAFILE. -13660 GOSUB 10700 -13680 RETURN -13700 : -13720 : -13800 REM ==INSTALL TONE GENERATOR== -13820 IF (SND = 0) THEN 13880 -13840 POKE 770, 173: POKE 771, 48: POKE 772, 192: POKE 773, 136: POKE 774, 208: POKE 775, 5: POKE 776, 206: POKE 777, 1: POKE 778, 3: POKE 779, 240 -13860 POKE 780, 9: POKE 781, 202: POKE 782, 208: POKE 783, 245: POKE 784, 174: POKE 785, 0: POKE 786, 3: POKE 787, 76: POKE 788, 2: POKE 789, 3: POKE 790, 96 -13880 RETURN -13900 : -13920 : -14000 REM ==PLAY TUNE== -14020 REM A$ = "128,27 ,114,54 ,114,54 ,85 ,216." -14040 IF (SND = 0) THEN 14140 -14060 L=LEN(A$) -14080 I=1 -14100 IF (I+7 > L) THEN 14140 -14120 POKE 768,VAL(MID$(A$,I,3)): POKE 769,VAL(MID$(A$,I+4,3)): CALL 770: I = I + 8: GOTO 14100 -14140 RETURN -14160 : -14180 : -14200 REM ==BUZZ SPEAKER== -14220 L=PEEK(-16336):I=I-1:IF (I > 0) THEN 14220 -14240 RETURN -14260 : -14280 : -14300 REM ==RING BELL== -14320 IF (SND = 0) THEN 14360 -14340 CALL -198: REM COULD ALSO JUST PRINT CHR$(7) -14360 RETURN +100 REM ***HANGMAN** +120 REM BY MIKE GLEASON, 1986, 2011 +130 REM MODIFIED BY ALAN RATLIFF, 2020 +140 REM +160 REM ==WELCOME SCREEN== +180 TEXT : PR#0 : HOME :SW = PEEK (33):ES$ = "": GG = 1: DD = 0.040: JY = 0 +188 DD = 0.0010 : SND = 0: REM Hack to work in the JavaScript emulator + +380 VTAB 12:I = SW / 2 - 6: HTAB I: PRINT "_ _ _ _ _ _ _"; +400 GOSUB 13800 : REM INIT SOUND +420 D = 1: GOSUB 800: HTAB I + 8: PRINT "M"; +440 D = 1: GOSUB 800: HTAB I + 4: PRINT "N";: HTAB I + 12: PRINT "N"; +460 D = 1: GOSUB 800: HTAB I + 6: PRINT "G"; +480 D = 1: GOSUB 800: HTAB I + 2: PRINT "A";: HTAB I + 10: PRINT "A"; +500 D = 1: GOSUB 800: HTAB I + 0: PRINT "H"; +520 D = 2: GOSUB 800: HTAB I + 0: FLASH : PRINT "H A N G M A N": NORMAL : PRINT +540 D = 2: GOSUB 800 +560 A$ = "(C) 1986, 2011 by Mike Gleason" +580 I = SW / 2 - LEN (A$) / 2 +600 HTAB I: PRINT A$; +620 A$ = "Loading, please wait..." +640 I = SW / 2 - ( LEN (A$) - 3) / 2 +660 VTAB 23: HTAB I: PRINT A$;: JY=1 +680 GOTO 1100 + +800 REM ==DELAY SUBROUTINE== +820 REM Unfortunately, I don't know of a way to make this delay constant +840 REM across CPU speeds. For example, in an emulator, this code may +860 REM run too fast. You can try changing DD to modulate the speed. +880 IF PEEK (49152) > 127 THEN 940: REM SKIP DELAY UPON KEYBOARD INPUT +900 D = D - DD: IF D > 0 THEN 880 +920 GOTO 980 +940 A$ = CHR$ ( PEEK (49152) - 128) +960 IF JY=1 THEN POKE 49168,0 +980 RETURN + +1100 REM ==INITIALIZE PROGRAM== +1160 GOSUB 13200: REM LOAD WORDS +1180 GOSUB 2500: REM SETUP SCREEN +1200 PRINT "Shall I be [e]asy, " +1220 PRINT " [m]edium, " +1240 PRINT " or [h]ard on you? "; +1260 POKE 49168,0: REM CLEAR KEYBD BUFFER +1280 GOSUB 1800 +1300 IF A$ = "E" THEN EZ = 1: GOTO 1400 +1320 IF A$ = "M" THEN EZ = 2: GOTO 1400 +1340 IF A$ = "H" THEN EZ = 3: GOTO 1400 +1360 PRINT : GOTO 1200 + +1400 REM ==GAME LOOP== +1420 HOME:VTAB 24 +1440 CHEET = 0 +1460 PRINT : GOSUB 2100 +1470 D = 53909/((EZ=2)*13+EZ*3+28) +1480 PRINT "Play again? (";: GU$ = "Yes/": GOSUB 1750: GU$ = "No": GOSUB 1750 +1490 REM WHEN OFFERING NEW GAME, ALLOW PLAYER TO CHANGE DIFFICULTY LEVEL IF DESIRED +1500 FOR I = 1 TO 3: IF I<>EZ THEN PRINT "/";: GU$ = MID$("EasyMediumHard",(I=3)*2+I*4-3,I*2+2): GOSUB 1750 +1510 NEXT: PRINT ") "; +1520 GOSUB 1800: A = ASC(A$)*2-107: I = D/A +1530 I = INT(I)=I: IF I THEN EZ = (A>31)+(A=37)+1 +1540 IF A$ = "Y" OR I GOTO 1400 +1550 ES$ = "": IF A$ <> "N" GOTO 1520 + +1600 REM ==CLEANUP AND EXIT== +1620 TEXT +1640 IF ES$ = "" THEN HOME: PRINT "GOOD BYE.": END +1660 GOSUB 14300: REM RING BELL +1680 PRINT : PRINT "* ERROR: ";ES$;"." +1700 END + +1740 REM PRINT FIRST CHAR OF STRING GU$ INVERSE, THE REST NORMAL +1750 INVERSE: PRINT LEFT$(GU$,1);: NORMAL: PRINT MID$(GU$,2);: RETURN + +1800 REM ==GET 1 UPPERCASE CHAR== +1820 GET A$ +1840 IF A$ = CHR$ (1) THEN CHEET = 1 +1860 IF A$ = CHR$ (27) OR A$ = CHR$ (3) THEN POP: GOTO 1600 +1880 IF A$ > "_" THEN A$ = CHR$(ASC(A$) - 32) +1900 IF A$ < "A" OR A$ > "Z" THEN GOSUB 14300: GOTO 1820: REM RING BELL, TRY AGAIN +2020 RETURN + +2100 REM ==GAME SUBROUTINE== +2120 GOSUB 9600: REM CHOOSE A SECRET WORD +2130 GOSUB 3600: REM SETUP GRAPHICS +2140 REM R=0:GOTO 7370 - WOULD DISPLAY TABLE OF WORDS AND THEIR DIFFICULTY SCORES +2150 OGUESS$ = "ABCDEFGHIJKLMNOPQRSTUVWXYZ": REM FULL ALPHABET AVAILABLE +2160 POKE 49168,0: REM CLEAR KEYB BUFFER +2180 NLIMBS = 0:GAMEOVER = 0 +2220 HOME: VTAB 21 +2300 REM --GUESS LOOP-- +2320 GOSUB 7400: REM DISPLAY STATUS +2340 GOSUB 7700: REM GET A GUESS +2360 GOSUB 8100: REM CHECK GUESS +2380 IF NOT GAMEOVER THEN 2300 +2400 RETURN + +2500 REM ==SETUP SCREEN== +2520 TEXT : CB$ = "an" : CA$ = "ANIMAL" +2525 VTAB 12:HTAB 14: INVERSE : PRINT "H A N G M A N": NORMAL:VTAB 24 +2530 FOR I=1 TO 11:PRINT:FOR D=1 TO 90:NEXT D,I:VTAB 5 +2540 A$ = "Welcome to HANGMAN!": GOSUB 3000: PRINT : PRINT +2560 PRINT "You have been condemned for execution." +2580 PRINT "To escape this fate, you must guess" +2600 PRINT "the secret word (";CB$;" ";CA$;") by " +2620 PRINT "choosing letters from the alphabet." +2640 PRINT +2660 PRINT "The secret word's letters will be shown" +2680 PRINT "as dashes at first, and then will" +2700 PRINT "change to letters as you guess them." +2720 PRINT +2740 PRINT "With each incorrect guess, one body" +2760 PRINT "part will be added to the gallows." +2780 PRINT "Guess the secret word before all your" +2800 PRINT "limbs are hanging!" +2820 PRINT +2840 A$ = "Press any key to begin!": GOSUB 3000 +2841 POKE 49168,0: REM CLEAR KEYB BUFFER +2842 I=1: REM Initialize random number generator +2850 GET A$ +2860 I=RND(-PEEK(79)*999-PEEK(78)) +2880 HTAB 1: CALL - 868: REM ERASE STATUS MESSAGE +2900 RETURN + +3000 REM ==PRINT CENTERED== +3020 HTAB 20 - LEN (A$) / 2 +3040 PRINT A$; +3060 RETURN + +3500 REM ==DRAW SMILEY FACE== +3510 IF NOT GG THEN RETURN +3520 Z=0: HCOLOR=1: GOSUB 3880: REM ERASE GALLOWS +3530 ON NLIMBS<>4 GOSUB 4020: REM ERASE BODY, DRAW HEAD & FACE, AS NECESSARY +3540 HCOLOR=5: HPLOT 138,58 TO 143,62 TO 149,62 TO 154,58: REM DRAW SMILE +3550 RETURN + +3600 REM ==SET UP GRAPHICS== +3620 IF NOT GG THEN RETURN +3640 HGR : GW=280 : GH=160 : Z=1 : REM THIS IS ALL FOR NOW + +3800 REM ==DRAW GALLOWS== +3820 IF NOT GG THEN RETURN +3840 HCOLOR=1:FOR I=GH-1 TO 152 STEP -1:HPLOT 0,I TO GW-1,I:NEXT I +3860 HCOLOR=3 +3880 FOR I=152 TO 148 STEP -1:HPLOT 70,I TO 210,I:HCOLOR=Z*3:NEXT I +3900 FOR I=80 TO 88:HPLOT I,10 TO I,147:NEXT I +3920 FOR I=10 TO 18:HPLOT 88,I TO 147,I:NEXT I +3940 FOR I=0 TO 7:HPLOT 80,48+I TO 110+I,18:NEXT I +3960 FOR I=145 TO 147:HPLOT I,18 TO I,29:NEXT I +3980 RETURN + +4000 REM ==DRAW BODY PART== +4020 ON (NLIMBS<4 AND NOT Z)+NLIMBS GOTO 4300, 4500, 4700, 4900, 5500, 5400, 5300, 5200, 5100, 5000 + +4300 REM ==DRAW HEAD== +4320 REM Note: It'd be quicker (and use less code) to just HPLOT out the +4340 REM circle by hand rather than calling my CIRCLE2 subroutine, but +4360 REM then the trigonometry lesson would be wasted. +4370 REM N.B.: LESS CODE USED, REAL GEOMETRY LESSON NOT WASTED - SIN AND COS NOT NEEDED +4380 REM HCOLOR=2: HPLOT 126,30 TO 166,30 TO 166,70 TO 126,70 TO 126,30 +4420 RADIUS=20: CX=146: CY=50: FILL=0: HC=2: GOSUB 6000 +4430 IF Z THEN RETURN + +4500 REM ==DRAW RIGHT EYE== +4510 REM (REMEMBER THAT THEIR RIGHT EYE WE SEE ON THE LEFT) +4520 HCOLOR=6:HPLOT 137,43 TO 140,43 +4540 HPLOT 136,44 TO 141,44 +4560 HPLOT 137,45 TO 140,45 +4580 IF Z THEN RETURN + +4700 REM ==DRAW LEFT EYE== +4720 HCOLOR=6:HPLOT 152,43 TO 155,43 +4740 HPLOT 151,44 TO 156,44 +4760 HPLOT 152,45 TO 155,45 +4780 IF Z THEN RETURN + +4900 REM ==DRAW NOSE== +4920 HCOLOR=(FILL<1)*3 +4980 HPLOT 146,48 TO 143,52 TO 146,52 +4990 RETURN + +5000 REM ==DRAW LEFT LEG== +5020 HPLOT 146,106 TO 176,140 TO 188,133 +5040 RETURN + +5100 REM ==DRAW RIGHT LEG== +5120 HPLOT 146,106 TO 116,140 TO 104,133 +5140 IF Z THEN RETURN + +5200 REM ==DRAW LEFT ARM== +5220 HPLOT 146,88 TO 176,58 +5240 IF Z THEN RETURN + +5300 REM ==DRAW RIGHT ARM== +5320 HPLOT 146,88 TO 116,58 +5340 IF Z THEN RETURN + +5400 REM ==DRAW TORSO== +5420 IF Z THEN HCOLOR= 2 +5430 HPLOT 146,70 TO 146,106 +5440 IF Z THEN RETURN + +5500 REM ==DRAW SAD MOUTH== +5520 HCOLOR=5*Z +5530 HPLOT 140,60 TO 143,56 TO 149,56 TO 152,60 +5540 RETURN + +6000 REM *** SUBROUTINE: CIRCLE2 (REWRITTEN SIMPLIFIED) +6020 REM * IN: RADIUS +6040 REM * IN: CX (X COORDINATE OF CENTER) +6060 REM * IN: CY (Y COORDINATE OF CENTER) +6080 REM * IN: FILL (0 OR 1) +6100 REM * IN: HC (HCOLOR) +6110 A=.06: F=.9982: HCOLOR=HC: R=1: REM R = ASPECT RATIO; CAN BE CHANGED TO DRAW ORTHOGONAL ELLIPSES +6120 FOR D=0 TO NOT FILL STEP .5 +6130 X=RADIUS-D: Y=0: HPLOT X+CX,CY +6140 FOR I=1 TO 6.3/A: H=Y*A*R+X: Y=(Y-A*X/R)*F: X=F*H: HPLOT TO X+CX,Y+CY +6150 NEXT: NEXT: IF NOT FILL THEN RETURN +6160 REM FILL IN CIRCLE, IF SPECIFIED (NEVER USED) +6170 Y=0: FOR X=1-RADIUS TO 0 +6180 FOR I=0 TO 1: I=HSCRN(CX+X,CY+Y): Y=Y+NOT I: NEXT +6190 HPLOT CX-X,CY-Y TO CX-X,CY+Y: HPLOT CX+X,CY-Y-1 TO CX+X,CY+Y +7290 NEXT: RETURN + +7300 REM DISPLAY TABLE OF WORDS AND THEIR DIFFICULTY SCORES (NOT USED) +7320 TEXT:PR#3:H=1:X=0:Y=0:Z=0 +7330 IF NOT R THEN RESTORE : FOR D = 1 TO 105: READ A$: REM ORIGINAL VERSION +7340 IF R THEN FOR D=1 TO 105:A$=W$(ASC(MID$(L$,D,1))): REM REVISED VERSION +7350 GOSUB 12120:IF PEEK(37)>20 THEN H=H+16:VTAB 1 +7360 I=(WD<=.36)-(WD>.66):X=(I=1)+X:Y=Y+NOT I:Z=(I<0)+Z:WD=INT(WD*100+.5)/100+.003:HTAB (WD<10)+H: +7370 PRINT LEFT$(STR$(WD),5-(WD<10)) SPC(1) LEFT$(A$,9):NEXT:PRINT:PRINT "X=" X " Y=" Y " Z=" Z; +7380 IF R THEN PRINT SPC(1) C(1) "," C(2) "," C(3) SPC(1) S(1) "-" S(2) "-" S(3) +7390 END + +7400 REM ==DISPLAY STATUS== +7420 REM HOME +7440 IF NOT CHEET THEN 7520 +7460 VTAB 21: HTAB 1: CALL -868: PRINT "* Pssst... the word is ";SECRET$;"." +7480 D = 2: GOSUB 800 +7500 CHEET=0 +7520 I = (SW - LEN (HIDDEN$)) / 2 +7540 IF I >= 1 THEN VTAB 22: HTAB I +7580 PRINT HIDDEN$ +7600 RETURN + +7700 REM ==GET A GUESS== +7880 VTAB 24: HTAB 1: PRINT "Guess? (";OGUESS$;") "; +7900 GOSUB 1800: L=ASC(A$) - 64 +7920 IF MID$(OGUESS$,L,1) = "." THEN GOSUB 14300: GOTO 8900: REM RING BELL ON DUPE GUESS +7940 OGUESS$ = MID$(OGUESS$,1,L - 1) + "." + MID$(OGUESS$,L + 1): REMOVE FROM OGUESS$ +7980 GUESS$ = A$ +8000 HTAB 1: CALL - 868 +8020 REM FOR I=0 TO L:D=RND(1):NEXT I:REM TWEAK RANDOM +8025 RETURN + +8100 REM ==CHECK GUESS== +8120 OK = 0:TK = 1:NHIDDEN$ = "": VTAB 22 +8140 A = LEN (SECRET$): FOR I = 1 TO A +8160 IF I > 1 THEN NHIDDEN$ = NHIDDEN$ + " " +8200 A$ = MID$ (HIDDEN$,2 * I - 1,1) +8220 TK = (A$ < "_") + TK +8260 D = MID$ (SECRET$,I,1) = GUESS$: IF D THEN A$ = GUESS$: OK = OK + 1 +8340 NHIDDEN$ = NHIDDEN$ + A$ +8360 IF D THEN HTAB 20 - A: PRINT NHIDDEN$; CHR$(7);: GOSUB 800 +8380 NEXT I: PRINT: PRINT +8400 IF NOT OK THEN 9000 +8440 IF TK + OK = I THEN 9400: REM WORD IS COMPLETE +8500 REM CORRECT GUESS +8620 D = 3518034/(127 - ASC(GUESS$)): I = INT ( RND (1) * 3) +8660 IF INT(D)=D THEN PRINT MID$("AwesomeGloriousEpic",I*8+NOT I,I+7) "!!!";: GOTO 8780: REM JUST FOR JQXZ +8680 ON I GOTO 8740,8760 +8720 PRINT "Bah! Lucky guess.";: GOTO 8780 +8740 PRINT "Nice work!";: GOTO 8780 +8760 PRINT "Good job!"; +8780 HIDDEN$ = NHIDDEN$ +8800 HTAB 1: GOTO 9100 + +8900 REM DUPLICATE GUESS +8920 VTAB 24: HTAB 1: PRINT "You already guessed '";A$;"'."; +8940 CALL -868: D=2: HTAB 1: GOSUB 800: CALL -868: GOTO 7880 + +9000 REM WRONG GUESS +9020 I=20: GOSUB 14200: REM BZZZ +9040 PRINT "Wrong! The secret word has no '";GUESS$;"'."; +9060 NLIMBS = NLIMBS + 1 +9080 GOSUB 4000: REM SHOW NEWLY ADDED BODY PART ON THE GALLOWS +9100 D=2: IF NLIMBS<10 THEN GOSUB 800:CALL -868:RETURN + +9200 REM YOU LOSE +9220 GAMEOVER = 1 +9240 PRINT : HTAB 1: CALL -868: PRINT "You lose. The secret word was... " +9260 HTAB 1: CALL -868: PRINT " ";SECRET$;"." +9280 REM A$ = "48 ,27 ,57 ,54 ,72 ,54 ,114,255.": GOSUB 14000 +9300 RETURN + +9400 REM YOU WIN +9420 HTAB 1: CALL -868: PRINT "You WIN! You solved the secret word, " +9440 HTAB 1: CALL -868: PRINT " ";SECRET$;"." +9460 REM A$ = "128,27 ,114,54 ,114,54 ,85 ,216.": GOSUB 14000 +9480 GAMEOVER = 1 +9500 GOTO 3500: REM DRAW SMILEY FACE + +9600 REM ==SELECT WORD== +9620 HOME:VTAB 24:REM PRINT "Choosing word, please wait..."; +9640 NR = 0 +9660 NR = NR + 1: IF NR > 100 THEN ES$ = "COULD NOT LOAD A VALID WORD": GOTO 1620 +9680 IF NW < = 0 THEN ES$ = "NO WORDS LOADED": GOTO 1620 + +9690 REM NEW SIMPLIFIED ALGORITHM (WITH ALL WORDS NOW ALREADY GROUPED BY DIFFICULTY) +9700 REM GOES THROUGH ALL WORDS IN GROUP ONCE; AFTERWARD PICKS FROM GROUP'S 9 WORDS LEAST RECENTLY SEEN +9710 WI = INT((C(EZ)+9*NOT C(EZ))*RND(1))+S(EZ) +9720 C(EZ) = C(EZ)-(C(EZ)>0) +9730 SECRET$ = W$(ASC(MID$(L$,WI,1))): REM FIND WORD IN INDEXED ARRAY +9740 REM MOVE CHOSEN WORD TO THE END OF ITS GROUP SO IT WON'T BE PICKED AGAIN FOR A LONG TIME +9750 IF WI+1 AZ THEN 10560 +10540 HIDDEN$ = HIDDEN$ + " _": GOTO 10580 +10560 HIDDEN$ = HIDDEN$ + " " + MID$ (SECRET$,I,1) +10580 NEXT I: HIDDEN$ = MID$(HIDDEN$,2) +10600 HTAB 1: CALL - 868: REM ERASE STATUS MESSAGE +10620 RETURN + +10700 REM ==COUNT AVAILABLE WORDS== +10720 REM THE ARRAYS BELOW ARE USED TO CALCULATE LETTER FREQUENCIES, WHICH IN +10740 REM TURN ARE USED TO CATEGORIZE WORDS INTO EASY, MEDIUM, AND HARD LEVELS. +10760 REM THE FQ TABLE IS INITIALIZED TO THE FREQUENCIES CORRESPONDING TO +10780 REM OVERALL ENGLISH LANGUAGE USAGE. IF CQ<>0, THEN WE OVERWRITE THESE +10800 REM WITH THE FREQS DETERMINED FROM THE WORD LIST ITSELF, WHICH IS +10820 REM MORE ACCURATE BUT TAKES A LOT OF TIME TO DO AT STARTUP. +10840 DIM W$(105),S(4),C(3),FQ(27),FC(27) +10860 DATA 8.167,1.492,2.782,4.253,12.702,2.228,2.015,6.094,6.966 +11040 DATA .153,.772,4.025,2.406,6.749,7.507,1.929,.095,5.987 +11220 DATA 6.327,9.056,2.758,.978,2.360,.150,1.974,.074,0 +11380 CQ = 0 +11400 NW = 0:NB = 0:L$ = "" +11420 FOR I = 0 TO 26: READ FQ(I): FC(I) = 0: NEXT I +11440 READ SECRET$ +11460 IF SECRET$ = "*NO MORE WORDS*" THEN 11700 +11480 L = LEN (SECRET$): IF CQ = 0 THEN 11620 +11500 AA = ASC ("A"): AZ = ASC ("Z") +11520 FOR I = 1 TO L +11540 C = ASC ( MID$ (SECRET$,I,1)) +11560 IF C < AA OR C > AZ THEN 11600 +11580 C = C - AA:FC(C) = FC(C) + 1 +11600 NEXT I +11620 NW = NW + 1: L$ = L$ + CHR$(NW): W$(NW) = SECRET$: REM STORE WORDS IN AN INDEXED ARRAY +11640 IF NW > 10000 THEN ES$ = "INVALID WORD DATA": GOTO 1620 +11660 IF L < 3 OR L > 20 THEN NB = NB + 1 +11680 GOTO 11440 + +11700 IF NW < 1 OR NB > = NW THEN ES$ = "INVALID WORD DATA": GOTO 1620 +11800 REM COMPUTE ALPHABET FREQUENCIES +11820 FOR I = 0 TO 25:FC(26) = FC(26) + FC(I): NEXT I +11840 IF CQ THEN FOR I = 0 TO 25:FQ(I) = FC(I) * 100 / FC(26): NEXT I +11900 REM GOSUB 12600 +11920 REM GOSUB 12800 +11940 REM A$="YAK": GOSUB 12100 +11942 VTAB 22:PRINT:CALL -958 +11943 REM GROUP WORDS INTO EASY, MEDIUM, AND HARD BY REARRANGING INDEX STRING L$ +11944 S(1)=1:S(2)=1:S(3)=1:S(4)=NW+1:J=1:FOR R=1 TO NW:A$=W$(R):GOSUB 12120 +11946 D = (WD > .66)-(WD <= .36): C(D+2)=C(D+2)+1: S(2)=(D<0)+S(2): S(3)=(D<1)+S(3) +11948 IF D<0 AND R>1 THEN L$ = MID$(L$,J,1)+LEFT$(L$,J-1)+MID$(L$,J+1) +11950 IF D=1 THEN L$ = MID$(L$,1,J-1)+MID$(L$,J+1)+MID$(L$,J,1) +11952 J=(D<1)+J:NEXT:L$=L$+"X":REM R=1:GOTO 7370 +11960 RETURN + +12100 REM ==CALCULATE WORD DIFFICULTY== +12120 IF FQ(0) < = 0 THEN 12440 +12140 WD = 0:AA = ASC ("A"):AZ = ASC ("Z") +12160 L = LEN (A$) +12180 FOR I = 1 TO L +12200 C = ASC ( MID$ (A$,I,1)) +12220 IF C < AA OR C > AZ THEN 12280 +12240 QC = FQ(C - AA) +12260 WD = WD + 1 / (QC * QC) +12280 NEXT I +12300 IF WD < = 0 OR L < = 0 THEN WD = 0 +12345 REM IF A SHORT WORD AND A LONG WORD SCORED THE SAME, THE SHORT WORD MUST HAVE 'HARDER' LETTERS +12400 WD = WD * 2.25 / SQR(L): REM +12500 REM HTAB 1:PRINT:PRINT "DIFFICULTY FOR ";A$;" = ";WD;".":PRINT +12520 RETURN + +12600 REM ==PRINT FREQUENCIES== +12620 HTAB 1: PRINT : PRINT +12640 AA = ASC ("A") +12660 FOR I = 1 TO 13 +12680 PRINT CHR$ (AA + I - 1);": ";FQ(I - 1);" "; CHR$ (AA + I - 1 + 13);": ";FQ(I - 1 + 13) +12700 NEXT I +12720 PRINT : INPUT "PRESS RETURN TO CONTINUE...";A$ +12740 RETURN + +12800 REM ==CALCULATE AVERAGE WORD DIFFICULTY== +12820 RESTORE +12840 NW = 0:TD = 0:D0 = 999999:D9 = - 1:W0$ = "":W9$ = "" +12860 READ SECRET$ +12880 IF SECRET$ = "*NO MORE WORDS*" THEN 13000 +12900 A$ = SECRET$: GOSUB 12100 +12920 NW = NW + 1:TD = TD + WD +12940 IF WD < D0 THEN D0 = WD:W0$ = A$ +12960 IF WD > D9 THEN D9 = WD:W9$ = A$ +12980 GOTO 12860 +13000 IF NW < = 0 THEN 13140 +13020 TD = TD / NW +13040 HTAB 1: PRINT : PRINT +13060 PRINT "AVG DIFFICULTY = ";TD +13080 PRINT "EASIEST WORD = ";D0;", ";W0$ +13100 PRINT "HARDEST WORD = ";D9;", ";W9$ +13120 PRINT : INPUT "PRESS RETURN TO CONTINUE...";A$ +13140 RETURN + +13200 REM ================== +13220 REM DATA SECTION: +13240 REM SECRET WORDS ARE +13260 REM LISTED BELOW. +13280 REM ================== +13300 NW = 0: REM NUMBER OF WORDS LOADED (= 105) +13320 SECRET$ = "" +13340 WI = - 1: REM SECRET WORD # +13360 WO = - 1: REM PREVIOUS SECRET WORD # +13380 DATA ALLIGATOR,ANT,APE,BAT,BEAR,BEE,BIRD,BOBCAT,CAT,CENTIPEDE,CHEETAH,CHICKEN,CHIMPANZEE,CLAM,COBRA +13400 DATA CONDOR,COUGAR,COW,CROCODILE,DEER,DINGO,DOG,DONKEY,DUCK,EAGLE,ELECTRIC EEL,ELEPHANT,ELK,EMU,FISH,FOX,FROG,GAZELLE +13420 DATA GIRAFFE,GOAT,GOOSE,GORILLA,GRIZZLY BEAR,HAWK,HEDGEHOG,HIPPOPOTAMUS,HORSE,HYENA,IGUANA,JAGUAR +13440 DATA JELLYFISH,KANGAROO,KRILL,LEMUR,LEOPARD,LION,LIZARD,LLAMA,LOBSTER,LYNX,MOLE,MONKEY,MOOSE,NEWT +13460 DATA OCTOPUS,OKAPI,OPOSSUM,ORANGUTAN,OTTER,OWL,PANDA,PENGUIN,PIG,POLAR BEAR,PORCUPINE,PUMA,QUAIL +13480 DATA RABBIT,RACCOON,REINDEER,RHINOCEROS,SCORPION,SEA LION,SEAL,SHARK,SHRIMP,SNAIL,SNAKE,SPIDER,SQUID +13500 DATA SQUIRREL,TIGER,TOAD,TORTOISE,TUNA,TURKEY,TURTLE,TYRANNOSAURUS REX,VOLE,VULTURE,WALRUS,WARTHOG,WASP,WHALE,WILDCAT +13520 DATA WILDEBEEST,WOLF,WORM,YAK,ZEBRA +13540 DATA *NO MORE WORDS* +13600 REM THIS VERSION OF THE PROGRAM +13620 REM HAS DATA BUILT-IN, RATHER +13640 REM THAN USING A DATAFILE. +13660 GOTO 10700 + +13800 REM ==INSTALL TONE GENERATOR== (REMOVED) +13820 RETURN + +14000 REM ==PLAY TUNE== (REMOVED) +14020 REM A$ = "128,27 ,114,54 ,114,54 ,85 ,216." +14040 RETURN + +14200 REM ==BUZZ SPEAKER== +14220 L=PEEK(-16336):I=I-1:IF I > 0 THEN 14220 +14240 RETURN + +14300 REM ==RING BELL== +14340 PRINT CHR$(7); +14360 RETURN diff --git a/samples/simple.pong.txt b/samples/simple.pong.txt index 72538c0..821dfb2 100644 --- a/samples/simple.pong.txt +++ b/samples/simple.pong.txt @@ -1,40 +1,42 @@ -0 REM 1 REM Newsgroups: comp.sys.apple2 2 REM From: mad.scientist.jr@gmail.com 3 REM Message-ID: <1193160910.224728.270640@z24g2000prh.googlegroups.com> 4 REM Subject: Re: woz' original "brick out" - source code , paddles 5 REM Date: Tue, 23 Oct 2007 17:35:10 -0000 -6 REM 10 REM APPLE II SIMPLE PONG V4 -20 REM PASTE INTO Joshua Bell s EMULATOR AT inexorabletash.github.io/jsbasic/ +20 REM PASTE INTO Joshua Bell's EMULATOR AT inexorabletash.github.io/jsbasic/ 25 REM ++++++++++++++++++++++++++++++++++++++++ 30 REM TITLE SCREEN + PROMPT FOR CONTROLS 35 REM ++++++++++++++++++++++++++++++++++++++++ -40 TEXT : REM ENTER TEXT MODE -45 HOME : REM CLEAR TEXT SCREEN -49 PRINT "APPLE II SIMPLE PONG V4" +40 TEXT : PR#0 : HOME : REM ENTER TEXT MODE, CLEAR SCREEN +45 DEF FN pd(k) = (26 * pdl(k)) / 255 + 2 : REM DEFINE PADDLE-READING FUNCTION +46 REM DEF FN pr(k) = SGN(INT((pdl(k) - 55) / 146)) : REM (non-absolute) paddle function +49 PRINT "APPLE II SIMPLE PONG V4.1" 50 PRINT 51 PRINT "version 1 by aiiadict" 52 PRINT "tweaks by Mad Scientist Jr" +53 PRINT "and Alan Ratliff (2020)" 54 PRINT 55 PRINT "During game press Q to quit." -56 PRINT -58 INPUT "TYPE K FOR KEYS (A/Z, K/M) OR P FOR PADDLES OR Q TO QUIT? ";C$ -60 IF C$ <> "K" AND C$ <> "P" AND C$ <> "Q" THEN GOTO 58 -62 IF C$ = "Q" THEN GOTO 9000 +56 PRINT : HTAB 18 : PRINT "^ # ^" SPC(5) "^ # ^" +58 PRINT "TYPE K FOR KEYS" SPC(2) "A/S/D" SPC(5) "J/K/L" : HTAB 19 : PRINT "Z/X" SPC(7) "M/," +59 PRINT " (# = STOP)" TAB(19) "v v" SPC(7) "v v" : PRINT : PRINT "OR P FOR PADDLES OR Q TO QUIT? "; +60 GET C$ : IF C$ <> "K" AND C$ <> "P" AND C$ <> "Q" GOTO 60 +62 IF C$ = "Q" THEN VTAB 22 : GOTO 9000 65 REM 70 REM ++++++++++++++++++++++++++++++++++++++++ 75 REM DRAW FIELD AND INITIALIZE GAME 80 REM ++++++++++++++++++++++++++++++++++++++++ -85 GR: REM ENTER GRAPHIC MODE +85 HOME : GR: REM ENTER GRAPHIC MODE 90 COLOR= 7: VLIN 0,39 AT 0: VLIN 0,39 AT 39 95 HLIN 0,39 AT 0: HLIN 0,39 AT 39 100 bx = 10:by = 10:ox = 10:oy = 10: REM BALL START POSITION 102 dx = 1: dy = - 1: REM BALL DIRECTION 104 p1 = 10: o1 = 10: REM PLAYER 1 START POSITION 106 p2 = 10: o2 = 10: REM PLAYER 2 START POSITION -120 PL = 8: REM PADDLE LENGTH +120 v1 = 0 : v2 = 0 : s1 = 0 : s2 = 0 : u1 = 0 : u2 = 0 : +125 PL = 8: REM PADDLE LENGTH 130 REM 145 REM ++++++++++++++++++++++++++++++++++++++++ 150 REM BEGIN MAIN GAME LOOP @@ -52,91 +54,62 @@ 399 REM ++++++++++++++++++++++++++++++++++++++++ 400 REM DRAW AND MOVE BALL 401 REM ++++++++++++++++++++++++++++++++++++++++ -402 IF ox <> bx OR oy <> by THEN COLOR= 0: PLOT ox,oy: PLOT ox,oy + 1 -410 COLOR= 5: PLOT bx,by: PLOT bx,by + 1 -416 ox = bx:oy = by -830 bx = bx + dx -835 IF SCRN( bx,by) > 0 THEN dx = - dx -840 by = by + dy -845 IF SCRN( bx,by) > 0 THEN dy = - dy +402 IF ox <> bx OR oy <> by THEN COLOR= 0: VLIN oy,oy + 1 AT ox +410 COLOR= 11: VLIN by,by + 1 AT bx +420 ox = bx : oy = by : bb = 1 +470 bx = bx + dx +490 IF SCRN( bx,by) OR SCRN( bx, by + 1) THEN dx = -dx : k = (bx=3)*p1+(bx=36)*p2 : IF bx*2=39-dx*33 AND ((k>0)*by-PL/2-k+1)*dy > 0 THEN bb = 0 +500 IF bx = 7 THEN u1 = 1 +510 IF bx = 33 THEN u2 = 1 +520 IF bx = 1 AND u1 THEN s2 = s2 + 1 : u1 = 0 : VTAB 22 : HTAB 41 - LEN(STR$(s2)) : PRINT s2; +530 IF bx = 38 AND u2 THEN s1 = s1 + 1 : u2 = 0 : VTAB 22 : HTAB 1 : PRINT s1 +540 by = by + dy +840 IF (SCRN( bx,by) OR SCRN( bx, by + 1)) AND bb THEN dy = -dy 850 IF bx < 1 THEN bx = 1 860 IF bx > 38 THEN bx = 38 870 IF by < 1 THEN by = 1 -880 IF by > 38 THEN by = 38 -881 REM -882 REM ---------------------------------------- -883 REM SAVE OLD SCREEN POSITION -884 REM ---------------------------------------- -885 o1 = p1 -886 o2 = p2 -889 REM +880 IF by > 37 THEN by = 37 +890 o1 = p1 : o2 = p2 900 REM ++++++++++++++++++++++++++++++++++++++++ 901 REM GET PLAYER INPUT 902 REM ++++++++++++++++++++++++++++++++++++++++ -903 IF PEEK ( - 16384) > 127 THEN GET K$: REM SEE IF KEY(S) PRESSED. NEEDS FIX FOR MULTI KEY SIMULTANEOUS INPUT +903 IF PEEK ( - 16384) > 127 THEN GET K$: IF K$ = "Q" GOTO 9000 : REM SEE IF KEY PRESSED/Q FOR QUIT 904 IF C$ <> "K" THEN GOTO 921 905 REM 906 REM ---------------------------------------- 907 REM KEYBOARD INPUT -908 REM NOTE: NEEDS FIX TO DETECT MULTI KEYPRESSES 909 REM ---------------------------------------- -912 IF K$ = "A" THEN p1 = p1 - 1 -914 IF K$ = "Z" THEN p1 = p1 + 1 -916 IF K$ = "K" THEN p2 = p2 - 1 -918 IF K$ = "M" THEN p2 = p2 + 1 -920 GOTO 955 +912 IF K$ = "A" OR K$ = "D" THEN v1 = -1 +913 IF K$ = "S" THEN v1 = 0 +914 IF K$ = "Z" OR K$ = "X" THEN v1 = 1 +916 IF K$ = "J" OR K$ = "L" THEN v2 = -1 +917 IF K$ = "K" THEN v2 = 0 +918 IF K$ = "M" OR K$ = "," THEN v2 = 1 +920 K$ = "" : p1 = p1 + v1 : p2 = p2 + v2 : GOTO 955 921 IF C$ <> "P" THEN GOTO 947 922 REM 923 REM ---------------------------------------- 925 REM PADDLE INPUT 927 REM ---------------------------------------- 930 REM simple (non-absolute) paddle input: -931 REM if pdl(0) > 200 then p1 = p1 + 1 -932 REM if pdl(0) < 55 then p1 = p1 - 1 -933 REM if pdl(1) > 200 then p2 = p2 + 1 -934 REM if pdl(1) < 55 then p2 = p2 - 1 -943 REM realtime (absolute position) paddle input: -944 GOSUB 3000: REM PLAYER 1 -945 GOSUB 4000: REM PLAYER 2 +932 REM p1 = FN pr(0) + p1 +934 REM p2 = FN pr(1) + p2 +940 REM realtime (absolute position) paddle input: +944 p1 = FN pd(0) +945 p2 = FN pd(1) 947 REM -948 REM ---------------------------------------- -949 REM SEE IF PLAYER PRESSED Q TO QUIT -950 REM ---------------------------------------- -951 IF K$ = "Q" THEN GOTO 9000 -954 REM 955 REM ++++++++++++++++++++++++++++++++++++++++ -956 REM MAKE SURE PADDLES DONT GO OFF SCREEN +956 REM MAKE SURE PADDLES DON'T GO OFF SCREEN 958 REM ++++++++++++++++++++++++++++++++++++++++ 960 IF p1 < 2 THEN p1 = 2 970 IF p1 > 28 THEN p1 = 28 980 IF p2 < 2 THEN p2 = 2 990 IF p2 > 28 THEN p2 = 28 -1000 REM -1010 REM ++++++++++++++++++++++++++++++++++++++++ -1020 REM CONTINUE GAME LOOP -1030 REM ++++++++++++++++++++++++++++++++++++++++ -1040 GOTO 150 -3000 REM -3010 REM ++++++++++++++++++++++++++++++++++++++++ -3020 REM GET SCREEN POSITION FROM PADDLE 1 INPUT -3030 REM ++++++++++++++++++++++++++++++++++++++++ -3040 p1 = 26 * pdl(0) -3050 p1 = p1 / 255 -3060 p1 = p1 + 2 -3070 RETURN -4000 REM -4010 REM ++++++++++++++++++++++++++++++++++++++++ -4020 REM GET SCREEN POSITION FROM PADDLE 2 INPUT -4030 REM ++++++++++++++++++++++++++++++++++++++++ -4040 p2 = 26 * pdl(1) -4050 p2 = p2 / 255 -4060 p2 = p2 + 2 -4070 RETURN +999 GOTO 150 9000 REM 9010 REM ++++++++++++++++++++++++++++++++++++++++ 9020 REM QUIT GAME 9030 REM ++++++++++++++++++++++++++++++++++++++++ -9040 TEXT : REM HOME -9045 PRINT -9050 PRINT "FINISHED APPLE II SIMPLE PONG V4." -9060 END +9040 TEXT : REM HOME +9045 PRINT +9050 PRINT "FINISHED APPLE II SIMPLE PONG V4.1"