Various game fixes and enhancements by Alan Ratliff

This commit is contained in:
Joshua Bell 2020-06-20 15:49:59 -07:00
parent 8d91265d3b
commit c64c10e5d2
4 changed files with 409 additions and 586 deletions

View File

@ -1,85 +1,91 @@
0 PR#0
10 DIM PP(16),NU(16)
20 POKE - 16368,0
30 TEXT : HOME : VTAB 4: HTAB 14: PRINT "THE PUZZLER"
40 VTAB 15: HTAB 12: PRINT "BY GREGG BUNTIN"
50 FOR I = 1 TO 2000: NEXT I
60 VTAB 20: PRINT "DO YOU WISH INSTRUCTIONS ";: INPUT I$
70 IF I$ < > "Y" THEN 190
80 HOME : VTAB 2: HTAB 14: PRINT "THE PUZZLER"
90 VTAB 4: PRINT "THE OBJECT OF THIS GAME IS TO GET ALL OF": PRINT "THE NUMBERS IN ORDER FROM 1 TO 15"
100 PRINT "THE COMMANDS ARE" SPC( 13);: INVERSE : PRINT "A": NORMAL : HTAB 30: PRINT ":": HTAB 30: PRINT ":"
110 HTAB 25: INVERSE : PRINT "<-";: NORMAL : PRINT " - ";: INVERSE : PRINT "->": NORMAL
120 : HTAB 30: PRINT ":": HTAB 30: PRINT ":": INVERSE : HTAB 30: PRINT "Z": NORMAL
130 PRINT : PRINT "BY MEANS OF THESE COMMANDS YOU WILL ": PRINT "EXCHANGE THE BLANK SPACE WITH THE NUMBER";: PRINT "IN THE UP,DOWN,LEFT OR RIGHT POSITIONS"
150 : VTAB 21: PRINT SPC( 8)"PRESS <ESC> TO START GAME"
160 K = PEEK ( - 16384): IF K < 127 THEN 160
170 IF K = 155 THEN 190
180 GOTO 160
190 POKE - 16368,0: HOME : VTAB 4: HTAB 14: PRINT "THE PUZZLER": VTAB 12
200 PRINT "Type N to start a (N)EW GAME"
220 K = PEEK ( - 16384): IF K < 127 THEN 220
230 IF K = 206 THEN 260
240 IF K = 211 THEN 740
250 GOTO 220
260 HOME : PRINT "SCRAMBLING PUZZLE.............."
261 FOR I = 1 TO 16
270 Q = INT ( RND (1) * 16) + 1
280 IF PP(Q) THEN 270
290 PP(Q) = 1:NU(I) = Q: NEXT
300 TEXT : HOME : GR : COLOR= 12
310 FOR I = 0 TO 19: HLIN 0 + I,39 - I AT I: HLIN 0 + I,39 - I AT 39 - I
320 VLIN 0 + I,39 - I AT I: VLIN 0 + I,39 - I AT 39 - I: NEXT
330 COLOR= 1: FOR I = 9 TO 29 STEP 10: HLIN 0,39 AT I: VLIN 0,39 AT I: NEXT
340 COLOR= 0: HLIN 0,39 AT 39: VLIN 0,39 AT 39
350 FOR I = 1 TO 16:FLAG = 1:PL = I: GOSUB 370
360 NEXT I: GOTO 520
370 IF PL = 1 OR PL = 5 OR PL = 9 OR PL = 13 THEN X = 1
380 IF NU(PL) = 16 THEN RETURN
390 IF PL = 2 OR PL = 6 OR PL = 10 OR PL = 14 THEN X = 11
400 IF PL = 3 OR PL = 7 OR PL = 11 OR PL = 15 THEN X = 21
410 IF PL = 4 OR PL = 8 OR PL = 12 OR PL = 16 THEN X = 31
420 IF PL < 5 THEN Y = 2
430 IF PL > 4 AND PL < 9 THEN Y = 12
440 IF PL > 8 AND PL < 13 THEN Y = 22
450 IF PL > 12 THEN Y = 32
460 COLOR= 12: IF FLAG = 1 THEN COLOR= 2:FLAG = 0
470 IF NU(PL) > 9 THEN 500
480 X = X + 2
490 ON NU(PL) GOTO 850,860,870,880,890,900,910,920,930,1100,1110
500 GOSUB 850:X = X + 4
510 ON NU(PL) - 9 GOTO 840,850,860,870,880,890
520 FOR I = 1 TO 16: IF NU(I) = 16 THEN PL = I: GOTO 540
530 NEXT
540 K = PEEK ( - 16384): IF K < 127 THEN 540
545 POKE - 16368,0
550 IF K = 193 THEN 630
560 IF K = 218 THEN 650
570 IF K = 136 THEN 670
580 IF K = 149 THEN 690
610 IF K = 155 THEN TEXT : HOME : PRINT "BYE-BYE": END
620 GOTO 540
630 IF PL < 5 THEN 520
640 A = - 4: GOTO 710
650 IF PL > 12 THEN 520
660 A = 4: GOTO 710
670 IF PL = 1 OR PL = 5 OR PL = 9 OR PL = 13 THEN 520
680 A = - 1: GOTO 710
690 IF PL = 4 OR PL = 8 OR PL = 12 OR PL = 16 THEN 520
700 A = 1: GOTO 710
710 T = PL:PL = PL + A:FLAG = 0: GOSUB 370
720 NU(T) = NU(PL):NU(PL) = 16:PL = PL - A
730 FLAG = 1: GOSUB 370: GOTO 520
830 END
840 VLIN Y,Y + 5 AT X: VLIN Y,Y + 5 AT X + 2: PLOT X + 1,Y: PLOT X + 1,Y + 5: RETURN
850 VLIN Y,Y + 5 AT X + 1: PLOT X,Y: HLIN X,X + 2 AT Y + 5: RETURN
860 HLIN X,X + 2 AT Y: VLIN Y,Y + 2 AT X + 2: PLOT X + 1,Y + 2: VLIN Y + 3,Y + 5 AT X: HLIN X,X + 2 AT Y + 5: RETURN
870 HLIN X,X + 2 AT Y: HLIN X + 1,X + 2 AT Y + 2: HLIN X,X + 2 AT Y + 5: VLIN Y,Y + 5 AT X + 2: RETURN
880 VLIN Y,Y + 5 AT X + 2: VLIN Y,Y + 2 AT X: PLOT X + 1,Y + 2: RETURN
890 HLIN X,X + 2 AT Y: VLIN Y,Y + 2 AT X: PLOT X + 1,Y + 2: VLIN Y + 3,Y + 4 AT X + 2: HLIN X,X + 1 AT Y + 5: RETURN
900 VLIN Y + 1,Y + 5 AT X: HLIN X + 1,X + 2 AT Y: VLIN Y + 2,Y + 5 AT X + 2: HLIN X,X + 2 AT Y + 2: HLIN X,X + 2 AT Y + 5: RETURN
910 HLIN X,X + 2 AT Y: VLIN Y,Y + 5 AT X + 2: RETURN
920 VLIN Y,Y + 5 AT X: VLIN Y,Y + 5 AT X + 2: PLOT X + 1,Y: PLOT X + 1,Y + 2: PLOT X + 1,Y + 5: RETURN
930 HLIN X,X + 2 AT Y: VLIN Y + 1,Y + 5 AT X + 2: HLIN X,X + 2 AT Y + 2: VLIN Y,Y + 2 AT X: HLIN X,X + 1 AT Y + 5: RETURN
0 PR#0
10 DEF FN R(X) = INT ( RND (1) * X) + 1: DEF FN M4(Y) = Y - INT (Y / 4) * 4: DIM NU(16)
15 R$ = "4567RTYUFGHJVBNM":P$ = "ABCD..........N...IJK.L..PO...E.FHM..G"
20 POKE - 16368,0
30 TEXT : HOME : VTAB 4: HTAB 14: PRINT "THE PUZZLER"
40 VTAB 15: HTAB 12: PRINT "by Gregg Buntin"
50 FOR I = 1 TO 2000: NEXT I
60 VTAB 20: PRINT "Do you wish instructions";: INPUT I$
70 IF LEFT$ (I$,1) < > "Y" THEN 190
80 HOME : VTAB 2: HTAB 14: PRINT "THE PUZZLER"
90 VTAB 4: PRINT "The object of this game is to get all ofthe numbers in order from 1 to 15."
100 PRINT : PRINT "The basic command keys are:";: HTAB 36: INVERSE : PRINT "A": NORMAL : HTAB 36: PRINT ":": HTAB 36: PRINT ":"
110 HTAB 33: INVERSE : PRINT "<-";: NORMAL : PRINT " + ";: INVERSE : PRINT "->";: NORMAL : PRINT
120 PRINT "By means of these keys you" TAB( 36) ":": PRINT "will exchange the blank" TAB( 36) ":"
130 PRINT "space with the number in the";: INVERSE : HTAB 36: PRINT "Z": NORMAL
140 PRINT "up,down,left or right positions."
145 PRINT : PRINT : PRINT "Alternatively, use the [mouse] and [END]key, or any highlighted key in the"
148 PRINT "displayed diagram, to move up to ALL thetiles in a row or column at once!"
150 VTAB 24: PRINT SPC( 7)"Press <ESC> to start game";
160 K = PEEK ( - 16384): IF K < > 155 THEN 160
190 POKE - 16368,0: HOME : VTAB 4: HTAB 14: PRINT "THE PUZZLER": VTAB 12
200 PRINT "Type N to start a (N)EW GAME"
220 K = PEEK ( - 16384): IF K = 155 GOTO 480
230 ON K < > 206 GOTO 220: POKE - 16368,0
260 HOME : PRINT "SCRAMBLING PUZZLE.............."
262 I = RND ( - PEEK (79) * 999 - PEEK (78)): REM RANDOM SEED
265 FOR I = 1 TO 16:NU(I) = I: NEXT
270 FOR I = 1 TO 40:Q = FN R(15)
280 K = FN R(14):K = (K > = Q) + K
290 X = NU(Q):NU(Q) = NU(K):NU(K) = X: NEXT
292 A = FN R(16):Y = 16: X = 4: ON A < 13 GOSUB 580
295 X = 1: ON A < Y GOSUB 580
300 TEXT : HOME : GR : COLOR= 12
310 FOR I = 0 TO 18: Q = 38 - I: HLIN I,Q AT I: HLIN I,Q AT Q
320 VLIN I,Q AT I: VLIN I,Q AT Q: NEXT : PLOT 19,19
330 COLOR= 1: FOR I = 9 TO 29 STEP 10: HLIN 0,38 AT I: VLIN 0,38 AT I: NEXT
350 FOR PL = 1 TO 16: GOSUB 380: REM DISPLAY WHOLE GRID
360 NEXT :PL = A: PRINT "At any time,": PRINT "press <ESC>": PRINT "to exit.": GOTO 440
365 REM 370-430, 840-930 - ROUTINE TO DISPLAY NUMBERS
370 COLOR= 12: GOTO 390
380 COLOR= 2
390 IF NU(PL) = 16 THEN RETURN
400 Q = PL - 1: GOSUB 600
410 Q = NU(PL) > 9: ON Q GOSUB 870
420 X = Q * 2 + X + 2
430 Q = NU(PL) - Q * 10: ON Q + 1 GOTO 840,870,880,850,890,900,910,920,840,930
435 REM DISPLAY ACTIVE-KEY GRID
440 VTAB 21: GOSUB 825: I = I + 1: FOR Y = 0 TO 3: IF Y THEN PRINT
450 HTAB 17: FOR X = 1 TO 4: K = (X = I) + (Y = Q): IF K THEN INVERSE
460 PRINT MID$ (R$,Y * 4 + X,K < 2);: NORMAL : PRINT TAB( X * 2 + 17): NEXT : NEXT
465 REM GET KEY, MOVE TILE TO EMPTY SPACE
470 K = ( PEEK (49250) > 127) * 301 + PEEK ( - 16384): IF K < 128 THEN 470
480 POKE - 16368,0
490 IF K = 155 THEN TEXT : HOME : PRINT "BYE-BYE": END
500 IF K > 300 GOTO 610: REM "BUTTON" ([END] KEY) PRESSED
510 IF K > 179 AND K < 218 THEN Q = ASC ( MID$ (P$,K - 179,1)) - 65: IF Q > = O THEN GOSUB 600: GOTO 630
520 K = INT ((K = 193 OR K = 218 OR K = 136 OR K = 149) * K / 7)
530 IF NOT K GOTO 470
540 I = K < 22:A = (K - 29) * 2
550 IF K < 20 = FN M4(PL) AND I OR (A + 8.5 - PL) * A * NOT I < 0 GOTO 470
560 IF I THEN A = K - 20
570 GOSUB 770: GOTO 810
580 FOR Y = Y TO A + X STEP -X:NU(Y) = NU(Y - X): NEXT : NU(Y) = 16: RETURN
600 GOSUB 830:X = I * 10 + 1:Y = Q * 10 + 2: RETURN
605 REM HANDLE "JOYSTICK" (MOUSE) AND MULTIPLE TILES
606 REM INTERPRET TRUE MOUSE POSITION (PC) BASED ON ITS CURSOR
610 X = PDL (0) / 6.4: Y = PDL(1) * .1875: K = SCRN (X,Y)
620 IF K < > 2 AND K < > 12 OR Y > 38 GOTO 470
630 GOSUB 825: X = INT (X / 10) - I
640 Y = INT (Y / 10) - Q
650 IF NOT X = NOT Y GOTO 470
660 A = SGN(Y) * 4 + SGN (X): FOR K = 1 TO ABS (X + Y): GOSUB 770: NEXT
670 ON PEEK (49250) > 127 GOTO 670: GOTO 810
770 PL = PL + A: GOSUB 370
780 NU(PL - A) = NU(PL):NU(PL) = 16:PL = PL - A
790 GOSUB 380:PL = PL + A: RETURN
800 REM TEST FOR SOLVED PUZZLE
810 Q = 0: FOR I = 1 TO 16: Q = NU(I) < > I OR Q: NEXT : IF Q GOTO 440
820 HOME : PRINT "CONGRATULATIONS!": PRINT : GOTO 200
825 Q = PL - 1
830 I = FN M4(Q):Q = INT (Q / 4): RETURN
840 VLIN Y,Y + 4 AT X
850 IF Q THEN PLOT X + 1,Y + 2
860 HLIN X,X + 1 AT Y: HLIN X,X + 2 AT Y + 5: VLIN Y,Y + 4 AT X + 2: RETURN
870 VLIN Y,Y + 5 AT X + 1: PLOT X,Y + 1: HLIN X,X + 2 AT Y + 5: RETURN
880 HLIN X,X + 2 AT Y: VLIN Y,Y + 2 AT X + 2: PLOT X + 1,Y + 2: VLIN Y + 3,Y + 5 AT X: HLIN X,X + 2 AT Y + 5: RETURN
890 VLIN Y,Y + 5 AT X + 2: VLIN Y,Y + 3 AT X: PLOT X + 1,Y + 3: RETURN
900 HLIN X,X + 2 AT Y: VLIN Y,Y + 2 AT X: PLOT X + 1,Y + 2: VLIN Y + 3,Y + 4 AT X + 2: HLIN X,X + 1 AT Y + 5: RETURN
910 VLIN Y + 1,Y + 5 AT X: HLIN X + 1,X + 2 AT Y: VLIN Y + 2,Y + 5 AT X + 2: PLOT X + 1,Y + 2: PLOT X + 1,Y + 5: RETURN
920 HLIN X,X + 2 AT Y: VLIN Y,Y + 5 AT X + 2: RETURN
930 VLIN Y,Y + 5 AT X + 2: VLIN Y,Y + 2 AT X: PLOT X + 1,Y: PLOT X + 1,Y + 2: HLIN X,X + 1 AT Y + 5: RETURN

View File

@ -1,199 +1,161 @@
0 REM Nicdem25's awesome game
100 REM Catch the raindrop
101 rem Game design by Nicholas Merchant, age 10
102 rem Programming mostly by his dad with Nicholas
103 rem version 1.7, August 2011
111 clear: home
115 print " Nicdem25games":?
:?" CATCH THE RAINDROP":?
116 print " Version 1.7":
:? " August 2011":?
117 rem print " Programmed by JRM":?
118 rem print " Concept by Nicholas Merchant"
121 ?:?"Game controls: ":?
122 ?" Left arrow (move left)"
123 ?" Right arrow (move right)"
124 ?" <SPACEBAR> (pause game)
125 ?" Q (quit)."
126 ?
130 ?"Powerdrops:"
131 ?" + = extra life"
133 ?" $ = 10 points"
134 ?" s = slow down"
135 ?
140 ?: Input "Press <RETURN> to begin.";A$
150 home
151 let level = 1
152 let lives = 3
155 let D$="*": rem default raindrop character
156 let pwl = 2: rem length of paddle expansion when powerup is caught
170 let bottomofscreen = 17: rem variable for how far the rain falls
180 let sp = 2000: rem sp is the variable that controls speed of rain
189 REM draw the bottom of screen
190 for a = 1 to 40: vtab bottomofscreen +1: htab a: ?"^";:next a
196 vtab bottomofscreen +3:?" Nicdem25: Catch the raindrop"
197 vtab 23:print "Score: "score" Level: "level" Lives: "lives;
191 REM Initial paddle position variable: p1 is the horizontal offset
192 REM PL is the paddle length in characters
193 let p1 = 18
194 let oldpos = p1
195 let PL = 10:let OPL = PL: rem OPL is the original paddle length
200 REM ++++++++++++++++++++++++++++
201 rem subroutine: falling raindrop
202 rem ++++++++++++++++++++++++++++
230 x = RND (-RND (1)): rem reseed random number
240 let x = int(rnd(1)*30)+5
241 rem assign a random x axis value for drop, 5<=x<=35
250 for y = 1 to bottomofscreen - 1
260 htab x: vtab y + 1
270 print D$;:rem draw drop at position <x,y>
271 rem delay loop controls speed: speed increases with level up to max
275 for n = 1 to sp: next n
276 gosub 900: rem do paddle subroutine
278 htab x: vtab y + 1: ?" ":rem erase old drop
279 next y
280 REM did you catch the raindrop?
284 rem missed the drop
285 if x < p1 or x > p1+PL then lives = lives -1:goto 320
290 rem caught the drop
291 print chr$(7): REM make a sound for catching the drop
292 let score = score + 1
293 if D$ = "+" then let lives = lives + 1
294 if D$ = "E" then gosub 2000: rem expand paddle, set power timer
295 if D$ = "s" then let sp=sp+350: rem s slows down drops
296 if D$ = "$" then let score = score + 9:if score/10 <> int(score/10) then let level = level + 1
300 rem check if score is a multiple of 10: if so, level up
303 if score/10 = int(score/10) then let level = level + 1:let counter=1
304 rem every five levels, add a life
305 if counter =1 and level/5 = int(level/5) then let counter=0:gosub 700
309 rem speed up if score is a multiple of 10
310 if score/10 = int(score/10) then gosub 800
314 rem powertime counter: expanded paddle length lasts five raindrops
315 rem let ptime = ptime - 1
316 rem if ptime < 0 then let ptime = 0
317 rem if ptime = 0 then let PL = OPL
320 if lives = -1 then goto 9000:rem lost last life: go to end routine
340 vtab 23
350 print "Score: "score" Level: "level" Lives: "lives" ";
400 REM powerups: powerup 1 = expand, powerup 2 = extra life
405 let powerup = 0
410 n = RND (-RND (1)): rem reseed random number
511 let n = rnd(1)
515 if n < 0.15 then let powerup = 1
520 if n >= 0.2 and n < 0.3 then let powerup = 2
530 if n >= 0.3 and n < 0.4 then let powerup = 3
550 rem powerup characters
560 if powerup = 0 then let D$ = "*"
570 if powerup = 1 then let D$ = "+"
580 if powerup = 2 then let D$ = "s"
590 if powerup = 3 then let D$ = "$"
600 goto 200:rem go back and start a new raindrop
700 rem ++++++
710 rem lives up subroutine
720 rem ++++++
730 if (int(score/10)+1)/5 = (int(int(score/10)+1))/5 then let lives = lives +2
750 return
800 rem +++++++
810 rem speed up subroutine
820 rem ++++++
850 let sp = sp - ((level-1)*100)
855 if sp < 400 then let sp = 400
890 return
900 REM ++++++++++++++++++++++++++++++++++++++++
901 REM GET PLAYER INPUT
902 REM ++++++++++++++++++++++++++++++++++++++++
903 IF PEEK (49152) > 127 THEN K$=CHR$(PEEK (49152)-128): REM SEE IF KEY(S) PRESSED
904 IF K$ = "Q" THEN goto 9000
905 if K$ = " " then gosub 5000
924 let oldpos = p1
935 if K$ = CHR$(8) then let p1 = p1 - 1
946 if K$ = CHR$(21) then let p1 = p1 + 1
950 if p1 < 1 then let p1 = 1
965 if p1 > 40-PL then let p1 = 40-PL
979 POKE 49168,0: REM reset keyboard input address (clear keyboard strobe)
999 REM +++++++++++
1000 REM Draw paddle
1001 rem +++++++++++
1215 for b = 0 to PL
1210 vtab bottomofscreen: htab p1 + b: ?"-";
1211 next b
1212 if oldpos < p1 then gosub 1220
1214 if oldpos > p1 then gosub 1225
1219 return
1220 REM erase old left edge of paddle subroutine
1221 vtab bottomofscreen: htab oldpos: ?" ";
1224 return
1225 REM erase old right edge of paddle subroutine
1228 vtab bottomofscreen: htab oldpos + PL: ?" ";
1230 return
1500 rem erase expanded paddle when power time is up
1510 for i = 1 to pwl
1515 if oldpos + i > 40 then goto 1530
1520 htab oldpos + i: ?" ";
1530 next i
1550 return
2000 REM increase paddle length; set power timer to five drops
2010 let PL=PL+pwl
2020 let ptime = 5
2030 return
5000 rem pause
5010 htab 4:vtab 4:input "Paused: press <RETURN> to resume";K$
5020 htab 4:vtab 4:? " "
5040 let K$ = ""
5050 return
9000 vtab 11:htab 16:print "GAME OVER":?
9010 print " Play again (Y/N)?"
9015 get A$
9020 if A$ = "Y" then goto 150
9030 if A$ = "N" then ?" Bye!":end
9040 goto 9000
0 REM Nicdem25's awesome game
100 REM Catch the raindrop
101 rem Game design by Nicholas Merchant, age 10
102 rem Programming mostly by his dad with Nicholas
103 rem version 1.7, August 2011
111 PR# 0:TEXT: home
115 print " Nicdem25games":?:?" CATCH THE RAINDROP":?
116 print " Version 1.7":? " August 2011":?
117 rem print " Programmed by JRM":?
118 rem print " Concept by Nicholas Merchant"
121 ?:?"Game controls: ":?
122 ?" Left arrow (move left)"
123 ?" Right arrow (move right)":?" Down arrow (stop movement)"
124 ?" <SPACEBAR> (pause game)
125 ?" Q (quit)."
126 ?
130 ?"Powerdrops:"
131 ?" + = extra life"
132 ?" E = expanded paddle":REM WAS NOT LISTED BECAUSE DISABLED
133 ?" $ = 10 points"
134 ?" s = slow down"
140 ?: Input "Press <RETURN> to begin.";A$
150 home:a = RND (-PEEK(79)*999 - PEEK(78)):REM RESEED RANDOM NUMBER AT START OF GAME
151 let level = 1:score = 0
152 let lives = 4:REM RENUMBER lives 4 TO 1 INSTEAD OF 3 TO 0
155 let D$="*": rem default raindrop character
156 let pwl = 2:pdec = 0: rem length of paddle expansion when "E" powerup is caught
170 let bottomofscreen = 17: rem variable for how far the rain falls
180 let sp = 2000: rem sp is the variable that controls speed of rain
182 REM draw the bottom of screen
184 vtab bottomofscreen +1:for a = 1 to 40:?"^";:next a
186 vtab bottomofscreen +3:?" Nicdem25: Catch the raindrop"
188 vtab 23:print "Score: "score" Level: "level" Lives: "lives;
191 REM Initial paddle position variable: p1 is the horizontal offset
192 REM PL is the paddle length in characters
193 let p1 = 18
194 let oldpos = p1
195 let PL = 10:let OPL = PL: rem OPL is the original paddle length
200 REM ++++++++++++++++++++++++++++
201 rem subroutine: falling raindrop
202 rem ++++++++++++++++++++++++++++
220 REM LINES 135, 230, 316-317, 400-410, 515-600, 1212-1550 DELETED
240 let x = int(rnd(1)*31)+5:REM OLD MULTIPLIER 30 MADE x=35 IMPOSSIBLE
241 rem assign a random x axis value for drop, 5<=x<=35
250 for y = 1 to bottomofscreen - 1
260 htab x: vtab y + 1
270 print D$;:rem draw drop at position <x,y>
271 rem delay loop controls speed: speed increases with level up to max
275 for n = 1 to sp: next n
276 gosub 900: rem do paddle subroutine
278 htab x: vtab y + 1: ?" ":rem erase old drop
279 next y
280 REM did you catch the raindrop?
284 rem missed the drop
285 if x < p1 or x > p1+PL then lives = lives -1:goto 340
290 rem caught the drop
291 print chr$(7): REM make a sound for catching the drop
292 let score = score + 1
293 if D$ = "+" then let lives = lives + 1
294 if D$ = "E" then gosub 2000: rem expand paddle, set power timer
295 if D$ = "s" then let sp=sp+350: rem s slows down drops
296 if D$ = "$" then let score = score + 9: if score/10 <> int(score/10) then let level = level + 1
300 rem check if score is a multiple of 10: if so, level up
303 if score/10 = int(score/10) then let level = level + 1:let counter=1
304 rem every five levels, add a life
305 if counter =1 and level/5 = int(level/5) then let counter=0:gosub 700
309 rem speed up if score is a multiple of 10
310 if score/10 = int(score/10) then gosub 800
314 rem powertime counter: expanded paddle length lasts five raindrops
315 if ptime then ptime = ptime - pdec: if ptime < pdec then VTAB bott:HTAB p1:?SPC(1):HTAB p1 + PL:?" ":p1 = p1 + 1:PL = PL - pwl:pdec = pdec - 6 ^ ((PL - OPL) / pwl)
340 vtab 23
350 print "Score: "score" Level: "level" Lives: "lives" ";
360 if NOT lives goto 9000:rem lost last life: go to end routine
420 let n = INT(RND(1)*10+.5):REM CONVERT RANDOM NUMBER TO INTEGERS 0-10 (NEW LINE #420 FROM #511)
425 REM OLD LOGIC EXCLUDED "E" EXPANSION POWER-UP OWING TO BUGS THEREWITH (NOW FIXED)
430 powerup = (n < (sp < 990) + 4) * n + NOT n:REM NEW IN-LINE FORMULATION, INCLUDING powerup FOR "E", "SLOW DOWN" ONLY WHEN FAST
440 D$ = MID$("*+$Es",powerup + 1,1):GOTO 200:REM SET CHAR FROM STRING, GO BACK TO START NEW RAINDROP
700 rem ++++++
710 rem lives up subroutine
720 rem ++++++
730 if (int(score/10)+1)/5 = (int(int(score/10)+1))/5 then let lives = lives +2
750 return
800 rem +++++++
810 rem speed up subroutine
820 rem ++++++
850 let sp = sp - ((level-1)*100)
855 if sp < 400 then let sp = 400
890 return
900 REM ++++++++++++++++
901 REM GET PLAYER INPUT
902 REM ++++++++++++++++
903 IF PEEK (49152) > 127 THEN K$=CHR$(PEEK (49152)-128): REM SEE IF KEY(S) PRESSED
904 IF K$ = "Q" THEN goto 9000
905 if K$ = " " then gosub 5000
924 let oldpos = p1
935 if K$ = CHR$(8) then let p1 = p1 - 1
946 if K$ = CHR$(21) then let p1 = p1 + 1
950 if p1 < 1 then let p1 = 1
965 if p1 > 40-PL then let p1 = 40-PL
979 POKE 49168,0: REM reset keyboard input address (clear keyboard strobe)
999 REM +++++++++++
1000 REM Draw paddle
1001 rem +++++++++++
1200 vtab bottomofscreen: b = oldpos < p1:htab p1 - b:?SPC(b)
1205 for b = 0 to PL:?"-";
1210 next b:?SPC(oldpos > p1):RETURN
2000 REM increase paddle length; set power timer to five drops
2010 let PL=PL+pwl
2020 let ptime = ptime * 6 + 5:pdec = 6 ^ ((PL - OPL) / pwl - 1) + pdec:REM HANDLE MULTIPLE EXPANSION
2025 p1 = p1 - (p1 > 1) - (p1 + PL = 40):REM REPOSITION PADDLE LEFTWARD AS NEEDED
2030 return
5000 rem pause
5010 htab 4:vtab 4:input "Paused: press <RETURN> to resume";K$
5020 htab 4:vtab 4: CALL -868:?:REM ERASE PAUSE-MESSAGE LINE
5040 let K$ = ""
5050 return
9000 vtab 11:htab 16:print "GAME OVER":?
9010 print " Play again (Y/N)?"
9015 get A$
9020 if A$ = "Y" then goto 150
9030 if A$ = "N" then ?" Bye!":end
9040 goto 9000

View File

@ -1,41 +1,42 @@
10 GOTO 100: REM SPACE ATTACK! BY ALAN RATLIFF, (C) 1979 & 2020
15 REM ADAPTED FOR "Applesoft BASIC in Javascript"
20 T = SCRN( U,V) = W: COLOR= RC: PLOT U,V
25 IF U = E AND V = E THEN PRINT B$;:BR = BR - 1: VTAB 22: HTAB 40: PRINT BR;: POKE 49233,0: FOR T = 1 TO 800: NEXT: POKE 49232,0: ON 1 + NOT BR GOTO 155,220
20 T = SCRN( U,V) = W: COLOR= 12 - R * 3: PLOT U,V
25 IF U = E AND V = E THEN PRINT B$;:BR = BR - I: VTAB 22: HTAB 40: PRINT BR;: POKE 49233,0: FOR T = I TO 800: NEXT: POKE 49232,0: ON 1 + NOT BR GOTO 155,220
30 IF T THEN COLOR= W: PLOT U,V: GOTO 190
40 X = INT ( PDL(Z) * D):Y = INT ( PDL(I) * D2): IF Y > 38 THEN Y = 38
50 IF X < > P OR Y < > Q THEN COLOR= Z: GOSUB 95:P = X:Q = Y: GOSUB 90: IF SCRN( U,V) = W GOTO 190
55 L = (L + I) * (L < H): IF L GOTO 40
58 N = (NN = I) + N:NN = NN - NOT NOT NN:K = K + WV:K = (K < N) * K:U = ABS (U(K)) - I:V = V(K):R = (U(K) < Z) + I
60 B = (R - ( ABS (E - U) < R)) * SGN (E - U):C = (R - (ABS (E - V) < R)) * SGN (E - V)
70 IF B AND C THEN B = ( ABS ((E - V) / (E - U)) < J) * B:C = ( ABS ((E - U) / (E - V)) < J) * C
80 COLOR= Z: PLOT U,V: U = U + B:V = V + C: GOTO 20
80 COLOR= Z: PLOT U,V:U = U + B:V = V + C:U(K) = SGN(U(K)) * (U + I):V(K) = V: GOTO 20
90 COLOR= G: PLOT E,E: COLOR= W
95 HLIN P,P + I AT Q: HLIN P,P + I AT Q + I: RETURN
100 PR# 0: TEXT : HOME : VTAB 2: HTAB 13
100 PR# 0: TEXT : HOME : VTAB 2: HTAB 13: DEF FN M(T) = ( PEEK (49250) > 127) * 2 + ( PEEK (49249) > 127)
105 INVERSE : PRINT " SPACE ATTACK! ": NORMAL : PRINT : HTAB 13: PRINT "BY ALAN RATLIFF"
110 VTAB 7: PRINT " HIT THE ENEMY MISSILES BEFORE THEY HIT": PRINT " YOUR GREEN BASE---WATCH OUT FOR THE": PRINT " FAST BLUE ONES! (WHICH SCORE DOUBLE)"
115 VTAB 11: PRINT " THE FARTHER FROM BASE YOU HIT THE": PRINT " MISSILES, THE MORE YOU SCORE."
120 VTAB 14: PRINT " GET A BONUS BASE EVERY 2000 POINTS!"
110 VTAB 7: PRINT " USE THE [MOUSE] TO HIT THE ENEMY": PRINT " MISSILES BEFORE THEY HIT YOUR GREEN": PRINT " BASE---WATCH OUT FOR THE FAST BLUE": PRINT " MISSILES! (WHICH SCORE DOUBLE)"
115 VTAB 12: PRINT " THE FARTHER FROM BASE YOU HIT THE": PRINT " MISSILES, THE MORE YOU SCORE."
120 VTAB 15: PRINT " GET A BONUS BASE EVERY 2000 POINTS!"
122 PRINT " (BUT THE MISSILES COME FASTER....": HTAB 9: PRINT "AND SCORE MORE POINTS!)"
125 VTAB 19: PRINT "THE GAME ENDS WHEN THE MISSILES HAVE HITFIVE BASES (PLUS BONUS BASES)."
130 VTAB 23: PRINT "PRESS THE [HOME KEY] TO BEGIN..."
135 IF PEEK (49249) < 128 GOTO 135
140 Z = 0:I = 1:D = 1 / 6.7:D2 = 1 / 5.5:G = 12:W = 15:E = 20:J = 2:F = 58.5:B$ = CHR$ (7)
130 VTAB 23: PRINT "PRESS [HOME] FOR THE FIRST ATTACK WAVE;": PRINT "PRESS [END] FOR THE SECOND ATTACK WAVE.";
135 T = FN M(0): IF NOT T GOTO 135
140 Z = 0:I = 1:D = I / 6.7:D2 = I / 5.5:G = 12:W = 15:E = 20:J = 2:F = 58.5:B$ = CHR$ (7)
142 HOME : VTAB 11: HTAB 19: PRINT "BOOM!"
145 GR : HOME :S = 0:M = 5:H = 80:P = INT (PDL (Z) * D):Q = INT ( PDL (I) * D2): IF Q > 38 THEN Q = 38
145 GR : HOME :WV = T = 2:S = Z:M = 5:H = 80:P = INT (PDL (Z) * D):Q = INT ( PDL (I) * D2): IF Q > 38 THEN Q = 38
150 VTAB 22: PRINT "SCORE: 0" TAB( 28)"BASES LEFT: 5";:BR = 5
152 R = RND ( - PEEK (79) * 999 - PEEK (78))
152 R = RND ( - PEEK (79) * 999 - PEEK (78)):N = I:K = Z
155 GOSUB 90
165 VTAB 22: HTAB 15: PRINT SPC( 10)
170 R = INT ( RND (I) * 156):U = (F - ABS (R - F)) * (R < 117): IF U > 39 THEN U = 39
165 VTAB 22: HTAB 15: PRINT SPC( 10):T = Z
170 FOR X = Z TO T:R = INT ( RND (I) * 156):U = (F - ABS (R - F)) * (R < 117): IF U > 39 THEN U = 39
175 V = (F - ABS (R - 97.5)) * (R > 39): IF V > 39 THEN V = 39
185 R = INT ( RND (I) * 1.1) + I:RC = 12 - R * 3: GOTO 20
185 R = INT ( RND (I) * 1.1) + I:T = N * X + K * NOT X: U(T) = (3 - R * 2) * (U + I):V(T) = V: NEXT : GOTO 20
190 U = U - E:V = V - E:SC = INT ( SQR (U * U + V * V) - I) * R * M
195 S = S + SC: VTAB 22: HTAB 8: PRINT S;B$
205 IF INT (S / 2E3) = INT ((S - SC) / 2E3) GOTO 165
210 FLASH : VTAB 22: HTAB 15: PRINT "BONUS BASE"B$;: NORMAL
215 BR = BR + I: HTAB 40: PRINT BR;: H = INT (H * .8):M = M + I: GOTO 170
220 PRINT "PRESS [HOME KEY] TO PLAY AGAIN,": PRINT "OR ANY OTHER KEY TO EXIT.";
225 IF PEEK (49249) > 127 GOTO 145
215 BR = BR + I: HTAB 40: PRINT BR;:H = INT ((WV / 10 + .8) * H * N / (N + WV)):M = M + WV + I:NN = (N + 10) * WV:T = WV: GOTO 170
220 PRINT "PRESS [HOME] FOR NEW FIRST WAVE, [END]": PRINT "FOR NEW SECOND WAVE; ANY OTHER KEY:EXIT";
225 T = FN M(Z): IF T GOTO 145
230 IF PEEK (49152) < 128 GOTO 225
235 POKE 49168,0: HTAB I: VTAB 23: CALL - 958
235 POKE 49168,Z: HTAB I: VTAB 23: CALL - 958: PRINT : PRINT "BYE FOR NOW!";

View File

@ -1,16 +1,17 @@
10 rem Tetris code
90 gosub 4550 : rem Title screen and random number seed
80 DEF FN SHCOLR(a) = ASC(MID$("@ACFIKLM",a + 1,1)) - 64
90 gosub 4550 : rem Title screen
100 time = 500
110 height = 39 : rem Cannot be larger than 47
110 height = 39 : rem Cannot be larger than 47 (REALLY 39)
120 left = 0
130 width = 9
140 dim array(width + 1, height + 1), erase(height)
145 dim sh(7), tl(4)
145 dim sp(7), tl(4)
150 gr
160 home
170 if height > 39 then poke - 16302,0 : rem Extend graphics screen past text window if height is too large
175 gosub 1850 : rem Set up shapes at bottom of screen
177 gosub 4240 : rem Set up total line labels
165 gosub 1850 : rem Set up shapes at bottom of screen
170 gosub 4240 : rem Set up total line labels
180 color= 15 : rem Draw borders
190 vlin 0, height at left
200 vlin 0, height at left + width + 1
@ -22,198 +23,88 @@
240 next fill
245 rem Fill left and right sides
250 for fill = 0 to height + 1
260 array(0, fill) = 15
270 array(left+width+1, fill) = 15
280 next fill
250 for fill = 0 to height
260 array(0, fill) = 15 : erase(fill) = 0
265 FOR a = 1 TO width : array(a,fill) = 0 : NEXT
270 array(width+1, fill) = 15
275 next fill
285 eg=0
280 sd = RND (-PEEK(79) * 999 - PEEK(78)): rem random number seed
285 eg=0 : tt = 0
290 gosub 3250: rem Choose piece
295 lshape = shape
300 rem Start playing
310 Gosub 2020: rem Make turn
310 gosub 2020: rem Make turn
320 if not eg then 310
330 end
340 rem Shape routines
345 rem Suggestion for shape definitions with improved lookup speed. Format an array as DN(shape, rot, coord, block) where coord is either the x or y corrdinate, and block is an element (1 - 4) in the shape. This function will return a value of -2, -1, 0, +1 or +2 as an offset of the current x, y position.
325 REM END OF GAME
330 VTAB 23 : HTAB 21 : PRINT "GAME OVER"
340 HTAB 20 : PRINT "PLAY AGAIN?";
350 a = PEEK(49152) : IF a < 128 GOTO 350
360 POKE 49168,0 : a = a - (a > 223) * 32
365 IF a = 206 THEN HTAB 20 : PRINT " GOODBYE FOR NOW!"; : END
370 IF a <> 217 GOTO 350
380 COLOR= 0 : FOR a = 1 TO width : VLIN 0,height AT a : NEXT
390 GOSUB 1700 : HOME : GOTO 170
350 rem Shape 1, rot 1; straight piece vertical
360 a1 = x - 2 : b1 = y
370 a2 = x - 1 : b2 = y
380 a3 = x : b3 = y
390 a4 = x + 1 : b4 = y
400 return
395 REM CREATE SHAPE ARRAYS, READ SHAPE DATA (VARIANT OF OLD SUGGESTION)
400 DIM D1(7,4),D2(7,4),D3(7,4),D4(7,4),E1(7,4),E2(7,4),E3(7,4),E4(7,4)
410 FOR x = 1 TO 7
420 FOR y = 1 TO (x > 1 AND x < 5) * 2 + (x <> 5) + 1
430 READ D1(x,y),E1(x,y), D2(x,y),E2(x,y), D3(x,y),E3(x,y), D4(x,y),E4(x,y)
440 NEXT y,x
450 RETURN
410 rem Shape 1, rot 2; straight piece horizontal
420 a1 = x : b1 = y - 1
430 a2 = x : b2 = y
440 a3 = x : b3 = y + 1
450 a4 = x : b4 = y + 2
460 return
490 rem Shape data
470 rem Shape 2, rot 1; L shape vertical
480 a1 = x - 1 : b1 = y
490 a2 = x : b2 = y
500 a3 = x + 1 : b3 = y
510 a4 = x + 1 : b4 = y - 1
520 return
500 DATA -2,0, -1,0, 0,0, 1,0: rem Shape 1, rot 1; straight piece horizontal
510 DATA 0,-1, 0,0, 0,1, 0,2: rem Shape 1, rot 2; straight piece vertical
530 rem Shape 2, rot 2; L shape horizontal
540 a1 = x - 1 : b1 = y - 1
550 a2 = x : b2 = y - 1
560 a3 = x : b3 = y
570 a4 = x : b4 = y + 1
580 return
520 DATA -1,0, 0,0, 1,0, 1,-1: rem Shape 2, rot 1; L shape horizontal
530 DATA -1,-1, 0,-1, 0,0, 0,1:rem Shape 2, rot 2; L shape vertical
590 DATA -1,1, -1,0, 0,0, 1,0: rem Shape 2, rot 3
650 DATA 0,-1, 0,0, 0,1, 1,1: rem Shape 2, rot 4
590 rem Shape 2, rot 3
600 a1 = x - 1 : b1 = y + 1
610 a2 = x - 1 : b2 = y
620 a3 = x : b3 = y
630 a4 = x + 1 : b4 = y
640 return
710 DATA -1,0, 0,0, 1,0, 1,1: rem shape 3, rot 1; Reverse L shape
770 DATA 1,-1, 0,-1, 0,0, 0,1: rem shape 3, rot 2
830 DATA -1,-1, -1,0, 0,0, 1,0:rem shape 3, rot 3
840 DATA 0,-1, 0,0, 0,1, -1,1: rem shape 3, rot 4
650 rem Shape 2, rot 4
660 a1 = x : b1 = y - 1
670 a2 = x : b2 = y
680 a3 = x : b3 = y + 1
690 a4 = x + 1 : b4 = y + 1
700 return
850 DATA 0,-1, -1,0, 0,0, 1,0: rem shape 4, rot 1; T shape
860 DATA 0,-1, -1,0, 0,0, 0,1: rem shape 4, rot 2
870 DATA -1,0, 0,0, 1,0, 0,1: rem shape 4, rot 3
880 DATA 0,-1, 0,0, 1,0, 0,1: rem shape 4, rot 4
710 rem shape 3, rot 1; Reverse L shape
720 a1 = x - 1 : b1 = y
730 a2 = x : b2 = y
740 a3 = x + 1 : b3 = y
750 a4 = x + 1 : b4 = y + 1
760 return
890 DATA 0,-1, 1,-1, 0,0, 1,0: rem shape 5; square
770 rem shape 3, rot 4
780 a1 = x : b1 = y - 1
790 a2 = x : b2 = y
800 a3 = x : b3 = y + 1
810 a4 = x - 1 : b4 = y + 1
820 return
900 DATA 0,0, 1,0, -1,1, 0,1: rem shape 6, rot 1; S shape
910 DATA 0,-1, 0,0, 1,0, 1,1: rem shape 6, rot 2
830 rem shape 3, rot 3
840 a1 = x - 1 : b1 = y - 1
850 a2 = x - 1 : b2 = y
860 a3 = x : b3 = y
870 a4 = x + 1 : b4 = y
880 return
920 DATA -1,-1, 0,-1, 0,0, 1,0:rem shape 7, rot 1; Z shape
930 DATA 0,-1, -1,0, 0,0, -1,1:rem shape 7, rot 2
890 rem shape 3, rot 2
900 a1 = x + 1 : b1 = y - 1
910 a2 = x : b2 = y - 1
920 a3 = x : b3 = y
930 a4 = x : b4 = y + 1
940 return
1490 rem Shape "directory"
1500 a1 = D1(shape,rt) + x : b1 = E1(shape,rt) + y
1510 a2 = D2(shape,rt) + x : b2 = E2(shape,rt) + y
1520 a3 = D3(shape,rt) + x : b3 = E3(shape,rt) + y
1530 a4 = D4(shape,rt) + x : b4 = E4(shape,rt) + y
1540 return
950 rem shape 4, rot 1; T shape
960 a1 = x : b1 = y - 1
970 a2 = x - 1 : b2 = y
980 a3 = x : b3 = y
990 a4 = x + 1 : b4 = y
1000 return
1590 rem PAUSE
1600 VTAB 23 : HTAB 20 : PRINT "== PAUSED =="; : HTAB 20
1610 FOR a = 0 TO 1 : a = PEEK(49152) > 127 : NEXT
1620 POKE 49168,0 : CALL -868
1630 RETURN
1010 rem shape 4, rot 2
1020 a1 = x : b1 = y - 1
1030 a2 = x - 1 : b2 = y
1040 a3 = x : b3 = y
1050 a4 = x : b4 = y + 1
1060 return
1690 REM ERASE SHAPE IN "NEXT" WINDOW
1700 x = left + width + 5 : rem Offset shape for drawing in Next window
1710 y = 1 : rt = 1
1720 shape = lshape
1730 xdr = 1 : rem Set variable for erasing shape in last "next" window
1070 rem shape 4, rot 3
1080 a1 = x - 1 : b1 = y
1090 a2 = x : b2 = y
1100 a3 = x + 1 : b3 = y
1120 a4 = x : b4 = y + 1
1130 return
1140 rem shape 4, rot 4
1150 a1 = x : b1 = y - 1
1160 a2 = x : b2 = y
1170 a3 = x + 1 : b3 = y
1180 a4 = x : b4 = y + 1
1190 return
1200 rem shape 5; square
1210 a1 = x : b1 = y - 1
1220 a2 = x + 1 : b2 = y - 1
1230 a3 = x : b3 = y
1240 a4 = x + 1 : b4 = y
1250 return
1260 rem shape 6, rot 1; S shape
1270 a1 = x : b1 = y
1280 a2 = x + 1 : b2 = y
1290 a3 = x - 1 : b3 = y + 1
1300 a4 = x : b4 = y + 1
1310 return
1320 rem shape 6, rot 2
1330 a1 = x : b1 = y - 1
1340 a2 = x : b2 = y
1350 a3 = x + 1 : b3 = y
1360 a4 = x + 1 : b4 = y + 1
1370 return
1380 rem shape 7, rot 1; Z shape
1390 a1 = x - 1 : b1 = y - 1
1400 a2 = x : b2 = y - 1
1410 a3 = x : b3 = y
1420 a4 = x + 1 : b4 = y
1430 return
1440 rem shape 7, rot 2
1450 a1 = x : b1 = y - 1
1460 a2 = x - 1 : b2 = y
1470 a3 = x : b3 = y
1480 a4 = x - 1 : b4 = y + 1
1490 return
1500 rem Shape directory
1510 if shape <> 1 then 1570 : return
1520 if rt = 1 then gosub 350
1525 if rt = 2 then gosub 410
1560 return
1570 if shape <> 2 then 1620
1580 if rt = 1 then gosub 470 : return
1590 if rt = 2 then gosub 530 : return
1600 if rt = 3 then gosub 590 : return
1605 if rt = 4 then gosub 650
1610 return
1620 if shape <> 3 then 1670
1630 if rt = 1 then gosub 710 : return
1640 if rt = 2 then gosub 890 : return
1650 if rt = 3 then gosub 830 : return
1655 if rt = 4 then gosub 770 : return
1660 return
1670 if shape <> 4 then 1710
1680 if rt = 1 then gosub 950 : return
1690 if rt = 2 then gosub 1010 : return
1700 if rt = 3 then gosub 1070 : return
1705 if rt = 4 then gosub 1140 : return
1710 if shape = 5 then gosub 1200 : return
1720 if shape <> 6 then 1740
1730 if rt = 1 then gosub 1260 : return
1733 if rt = 2 then gosub 1320
1735 return
1740 if shape <> 7 then 1760
1750 if rt = 1 then gosub 1380 : return
1755 if rt = 2 then gosub 1440
1760 return
1770 rem Draw shape
1780 color= shape
1785 if xdr then color= 0
1760 rem Draw shape
1770 color= 0 : if not xdr then color= FN SHCOLR(shape)
1790 gosub 1500 : rem get shape from directory
1800 plot a1, b1
1810 plot a2, b2
@ -223,9 +114,9 @@
1850 rem Set up shapes at bottom of screen
1860 rt = 1
1870 y = 37
1880 x = 14
1890 for shape = 1 to 7
1870 x = 14
1880 for shape = 1 to 7
1890 y = 38 - (shape = 3 OR shape = 6)
1900 gosub 1770 : rem Draw shape
1910 x = x + 4
1920 next shape
@ -236,23 +127,15 @@
1950 cfl = 0
1960 gosub 1500 : rem Shape directory
1965 if a1 < 0 or b1 < 0 or a2 < 0 or b2 < 0 or a3 < 0 or b3 < 0 or a4 < 0 or b4 < 0 then cfl = 1 : return
1970 if array(a1, b1) then cfl = 1 : return
1980 if array(a2, b2) then cfl = 1 : return
1990 if array(a3, b3) then cfl = 1 : return
2000 if array(a4, b4) then cfl = 1 : return
1970 cfl = array(a1, b1) or array(a2, b2) or array(a3, b3) or array(a4, b4)
2010 return
2020 rem Make turn
2023 null = peek (49168) : rem Reset keyboard strobe
2025 t1 = time
2030 y = 1
2033 bot = 0
2035 drop = 0
2040 x = 1 + left + width + 4 : rem Offset shape for drawing in Next window
2050 rt = 1
2055 shape = lshape
2060 xdr = 1 : rem Set variable for erasing shape in last "next" window
2070 gosub 1770 : rem Draw (erase) shape
2030 null = peek (49168) : rem Reset keyboard strobe
2040 t1 = time
2050 bot = 0
2060 drop = 0
2070 gosub 1700 : rem Draw (erase) shape in "next" window
2080 xdr = 0
2090 ns = lshape
2100 gosub 3250 : rem Pick shape
@ -278,63 +161,39 @@
3210 y = y + 1
3215 cfl = 0
3220 if not bot then gosub 4740 : rem Move piece
3230 if cfl then gosub 3660 : return : rem Add to shape & check for complete line
3233 if not bot then 3180 : rem Back to top of Make move loop, else force to bottom
3230 if cfl goto 3660 : rem Add to shape & check for complete line
3233 if not bot goto 3180 : rem Back to top of Make move loop, else force to bottom
3235 y = y - 1 : xdr = 1
3239 gosub 1770 : rem Draw shape (erase)
3242 y = y + 1 : xdr = 0
3245 gosub 4430 : return : rem Send piece to bottom
3245 goto 4440 : rem Send piece to bottom
3250 rem Pick shape
3260 shape = 1 + int (7 * rnd(sd))
3260 shape = int (rnd(sd) * 7) + 1
3270 return
3280 rem Process input
3285 a = PEEK (49152)
3290 get g$
3300 if g$ = " " then gosub 3470 : return : rem Check for rotate
3310 if g$ = "J" or a = 136 then gosub 3350 : return : rem Check for move left
3320 if g$ = "K" or a = 149 then gosub 3410 : return : rem Check for move right
3325 if g$ = "D" or a = 138 then gosub 4480 : return : rem Force down
3300 if g$ = " " goto 3480 : rem Check for rotate
3310 if g$ = "J" or a = 136 then a = -1 : goto 4720 : rem Check for move left
3320 if g$ = "K" or a = 149 then a = 1 : goto 4720 : rem Check for move right
3325 if g$ = "D" or a = 138 goto 4480 : rem Force down
3330 if g$ = "M" then bot = 1 : return : rem Send piece to bottom
3335 if g$ = "S" then drop = 1 : rem Speed up piece
3337 if g$ = "P" then gosub 4700 : return : rem Pause game
3337 if g$ = "P" then goto 1600 : rem Pause game
3340 return
3350 rem Check for move left
3360 x1 = x : y1 = y : r1 = rt
3370 x = x - 1
3380 gosub 4740 : rem Move piece
3400 return
3470 rem Check for rotate (SHAPE 5 DOES NOT CHANGE)
3480 if shape = 5 then return
3490 r1 = rt : x1 = x : y1 = y
3500 gosub 3600 : rem Rotate directory
3510 goto 4740 : rem Move piece
3410 rem Check for move right
3420 x1 = x : y1 = y : r1 = rt
3430 x = x + 1
3450 gosub 4740 : rem Move piece
3460 return
3470 rem Check for rotate
3480 r1 = rt : x1 = x : y1 = y
3490 gosub 3530 : rem Rotate directory
3510 gosub 4740 : rem Move piece
3520 return
3530 rem Rotate directory
3540 if shape = 1 or shape = 7 or shape = 6 then gosub 3570 : return : rem Two way rotate
3550 if shape = 2 or shape = 3 or shape = 4 then gosub 3600 : return : rem Four way rotate
3560 return
3570 rem Two way rotate
3580 if rt = 1 then rt = 2 : return
3585 if rt = 2 then rt = 1
3590 return
3600 rem Four way rotate
3610 if rt = 1 then rt = 2 : return
3620 if rt = 2 then rt = 3 : return
3630 if rt = 3 then rt = 4 : return
3640 rt = 1
3650 return
3590 rem Rotate directory
3600 if shape = 1 or shape > 5 then rt = 3 - rt : return : rem Two way rotate
3610 if shape < 5 then rt = (rt < 4) * rt + 1 : rem Four way rotate
3620 return
3660 rem Check for complete line
3665 gosub 3770 : rem Add piece to board
@ -343,12 +202,12 @@
3677 if y + 2 = > height then dw = height
3680 for row = y - 1 to dw
3690 hit = 0
3700 for c = left + 1 to width + left
3700 for c = 1 to width
3710 if not array (c, row) then hit = 1
3720 next c
3730 if not hit then erase(row) = 1 : line = line + 1
3740 next row
3750 if line then gosub 3850 : rem Blink & erase lines
3750 if line goto 3850 : rem Blink & erase lines
3760 return
3770 rem Add to board
@ -372,12 +231,11 @@
3920 next row
3925 for zz = 0 to 300 : next zz : rem Time delay
3930 next blink
3933 gosub 4020 : rem Restack shape
3940 return
3933 goto 4020 : rem Restack shape
3950 rem Redraw line
3960 for c = left + 1 to left + width
3980 color= array(c, row)
3960 for c = 1 to width
3980 color= FN SHCOLR(array(c, row))
3990 plot c, row
4000 next c
4010 return
@ -391,7 +249,7 @@
4045 if not erase (row) then gosub 4080 : goto 4060 : rem Shift row
4050 if erase (row) then sh = sh + 1 : erase (row) = 0
4060 row = row - 1
4065 if row + sh > 0 then 4043
4065 if row + sh > 0 then 4044
4070 return
4080 rem Shift row
@ -399,7 +257,7 @@
4090 for c = 1 to width
4095 if array (c, row) then hit = 1 :rem If there is an active cell, it's not a completely blank line.
4100 array (c, row + sh) = array (c, row)
4110 color= array (c, row)
4110 color= FN SHCOLR(array (c, row))
4120 plot c, row + sh
4130 next c
4135 if not hit then l1 = l1 + 1 : rem If the line is completely blank
@ -409,76 +267,73 @@
4160 rem calculate & print total shapes picked
4170 sp (shape) = sp (shape) + 1
4190 vtab 21
4200 htab 10 + (shape * 4)
4200 htab shape * 4 + 10
4210 print sp(shape);
4230 return
4240 rem set up total line labels
4245 htab 1
4250 vtab 21 : print "SIN"
4255 htab 1
4260 vtab 22 : print "DOU"
4265 htab 1
4270 vtab 23 : print "TRI"
4275 htab 1
4280 vtab 24 : print "TET";
4285 htab 24
4290 htab 10 : print "TOT";
4250 htab 1: vtab 21 : print "SIN"
4260 print "DOU" : print "TRI"
4270 print "TET" tab (10) "TOT";
4280 FOR a = 0 TO 4 : tl(a) = 0 : NEXT
4290 FOR a = 1 TO 7 : sp(a) = 0 : NEXT
4300 return
4310 rem calculate & print total lines cleared
4320 tl (line) = tl (line) + 1 : tt = tt + line
4350 htab 7
4360 vtab 20 + line
4370 print tl (line);
4320 tl(line) = tl(line) + 1 : tt = tt + line
4350 htab 6
4360 vtab 20 + line
4370 print tl(line);
4390 htab 15
4400 vtab 24
4410 print tt;
4420 return
4430 rem Send piece to bottom
4430 rem Send piece to bottom - DROP IT DOWN UNTIL "CONFLICT" OCCURS (HITS OTHER PIECES OR BOTTOM)
4440 y = y + 1
4450 gosub 1940 : rem Check for conflict
4460 if cfl then y = y - 1 : gosub 1770 : gosub 3660 : return : rem Draw, Add to bottom
4460 if cfl then y = y - 1 : gosub 1770 : goto 3660 : rem Draw, Add to bottom
4470 goto 4440
4480 rem Force piece down
4490 y1 = y : x1 = x : r1 = rt
4500 y = y + 1
4510 gosub 4740 : rem Move piece
4540 return
4510 goto 4740 : rem Move piece
4550 rem Title screen and random number seed
4550 rem Title screen
4555 pr#0
4560 text : home
4570 print "Tetris for Applesoft BASIC"
4580 print "Programed by Arthur Allen"
4580 print "Programmed by Arthur Allen"
4590 print "Based on Tetris by Alexey Pajitnov"
4680 print
4690 print "Press Enter to begin"
4600 print : print : print "Keys:"
4610 print "<-- or J to move piece left"
4620 print "--> or K to move piece right"
4630 print "<SPACE> to rotate piece anti-clockwise"
4640 print " | M to send piece to bottom"
4650 print " | or D to force piece down"
4660 print "\|/ S to speed up piece"
4670 htab 7 : print "P to pause game"
4680 print : GOSUB 400 : REM READ SHAPE DATA
4690 INPUT "Press Enter to begin";g$
4695 RETURN
4700 for sd = 0 to 9999999
4710 if peek (49152) = 141 then get g$ : null = peek (49168) : return
4712 null = peek (49168) : rem Reset keyboard strobe
4715 a = rnd (sd)
4720 next sd
4730 goto 4700
4710 rem PREPARE TO MOVE PIECE LEFT OR RIGHT, THEN MOVE IT
4720 x1 = x : y1 = y : r1 = rt : x = x + a
4740 rem move piece
4750 c1 = a1 : d1 = b1
4730 rem move piece
4740 c1 = a1 : d1 = b1
4760 c2 = a2 : d2 = b2
4770 c3 = a3 : d3 = b3
4780 c4 = a4 : d4 = b4
4790 gosub 1940 : rem Check for conflict
4795 rem vtab 21 : htab 1 : print "4795 Move piece: x, y , g$, cfl "; x; " "; y; " "; g$; cfl; : rem temp code
4796 rem if y = 40 then vtab 22 : htab 1 : print "4796 y=40, cfl = "; cfl
4800 if cfl then gosub 4890 : return : rem Return old values
4800 if cfl goto 4900 : rem Return old values
4805 color= 0
4810 plot c1, d1
4820 plot c2, d2
4830 plot c3, d3
4840 plot c4, d4
4845 color= shape
4845 color= FN SHCOLR(shape)
4850 plot a1, b1
4860 plot a2, b2
4870 plot a3, b3
@ -493,8 +348,7 @@
4940 rt = r1
4950 x = x1
4960 y = y1
4965 gosub 1500 : rem Shape directory
4970 return
4965 goto 1500 : rem Shape directory
4980 rem Clear top of shape
4990 color= 0
@ -504,4 +358,4 @@
5030 next c
5040 return
5050 rem End of listing
5050 rem End of listing