Back in the day Amstrad Computer User published this Shoot-em-up 10-Liner:
[attachimg=1]
though as
@Nich wrote, it was riddled with problems like being very slow because you could fire as many bullets as you wanted as well as a bad collision detection (bullets passing through the aliens).
Years ago I pulled the program apart into single lines, though the underlining problems obviously still existed, though with a basic idea of what's happening in template, I've decided to write the program structurally.
Obviously this is going to be taking the program out of the confines of a 10-Liner. I've written it using no GOTOs, a main loop is used which controls to move your Square Object as well as to check going to routines to move the alien "@" and to go to the firing sequence if Space is pressed. The original program used QAOP to move your object, though I've opted for Cursor Keys to move your object & Space to Fire a Bullet.
Firing the Bullet is the most critical part from the original program I had added here, much of that is original, however in the original program problems occur with Speed and would eventually lead to a Subscript out of Range error as the bx & by array's are filled to capacity. In my version I've tried to address this slowdown by limiting the number of bullets that can be fired at one time, the limit is 2 Bullets, however if you fire one bullet and it reaches the end of the screen, you only get one shot when another alien emerges, once that bullet has cleared the screen you get 2 back. Shooting an alien though will give you your 2 bullets back (even if 1 of them has missed).
Since everything has been coded to an orderly manner, it's easier to see where problems in the Collision Detection will occur. In the case of the original program, it was only checking at one stage which led to Bullets passing through the Alien. My version checks when the Bullet has either moved a position or the Alien has moved onto the Bullet! A similar problem also occurred for the Ship, where the Ship could move through the Alien. So checks have been added for when either situation has occurred. The only time I've noticed Bullets have passed through the Alien is when the Alien is too close, I guess this the laws from "The Hunt For The Red October" where the Torpedo hasn't had enough time to Arm itself.
100 ' Setup Inks and Screen Mode
110 INK 0,0
120 INK 1,26
130 INK 2,20
140 INK 3,18
150 BORDER 11
160 PAPER 0
170 PEN 1
180 MODE 1
200 ' Define Characters & Objects
210 DEFINT a-z
220 s$=CHR$(143)
230 a$="@"
240 b$="-"
250 x=1
260 y=1
270 DIM bx(2)
280 DIM by(2)
290 b=1
300 t=0
310 sc=0
320 ay=1+INT(RND*23)
330 ax=37
340 GOSUB 810 ' Print Ship
350 GOSUB 1010 ' Print Alien
360 LOCATE 1,25
370 PRINT"Score:"
400 ' Main Loop
410 WHILE 1
420 IF INKEY(1)<>-1 AND x<30 THEN GOSUB 910:x=x+1:GOSUB 810
430 IF INKEY(8)<>-1 AND x>1 THEN GOSUB 910:x=x-1:GOSUB 810
440 IF INKEY(0)<>-1 AND y>1 THEN GOSUB 910:y=y-1:GOSUB 810
450 IF INKEY(2)<>-1 AND y<24 THEN GOSUB 910:y=y+1:GOSUB 810
460 GOSUB 710
470 GOSUB 1140 : GOSUB 1010 ' Delete & Reprint Alien
480 IF INKEY(47)<>-1 AND t<>2 THEN t=t+1:bx(t)=x+1:by(t)=y
490 IF t<>0 THEN GOSUB 1210
500 WEND
600 ' Has bullet or alien collided?
610 IF ((bx(1)=ax) AND (by(1)=ay)) OR ((bx(2)=ax) AND (by(2)=ay)) THEN GOSUB 1410
620 RETURN
700 ' Has Alien Collided with Ship?
710 IF (x=ax) AND (y=ay) THEN GOSUB 1410:LOCATE 15,12:PRINT"You're Dead!":END
720 RETURN
800 ' Display Ship
810 LOCATE x,y
820 PEN 1
830 PRINT s$;
840 RETURN
900 ' Delete Ship
910 LOCATE x,y
920 PRINT" ";
930 RETURN
1000 ' Display and Move Alien
1010 LOCATE ax,ay
1020 PEN 2
1030 PRINT a$;
1040 ax=ax-1
1050 GOSUB 710
1060 WHILE ax=0
1070 LOCATE 1,ay
1080 PRINT" ";
1090 ax=37
1100 ay=1+INT(RND*23)
1110 WEND
1120 GOSUB 610
1130 RETURN
1140 LOCATE ax+1,ay
1150 PRINT" ";
1160 RETURN
1200 ' Routine to Move Shots Fired
1210 FOR n=b TO t
1220 LOCATE bx(n),by(n)
1230 PRINT" ";
1240 PEN 3
1250 bx(n)=bx(n)+1
1260 LOCATE bx(n),by(n)
1270 PRINT b$;
1280 IF bx(n)=38 THEN LOCATE 38,by(n):PRINT" ";:b=b+1
1290 NEXT n
1300 IF bx(n-1)=38 AND b=3 THEN GOSUB 1590
1310 GOSUB 610
1320 RETURN
1400 ' Death Sequence for Alien or Ship should they Collide
1410 LOCATE ax,ay
1420 PRINT" ";CHR$(238);
1430 sc=sc+20
1440 LOCATE 8,25
1450 PRINT sc;
1460 ax=39
1470 ay=1+INT(RND*23)
1480 FOR v=15 TO 0 STEP -1
1490 BORDER 6
1500 SOUND 1,0,3,v,,,31
1510 BORDER 11
1520 SOUND 2,1000,3,v,,,31
1530 NEXT v
1540 FOR c=1 TO t
1550 LOCATE bx(c),by(c)
1560 PRINT" ";
1570 bx(c)=0:by(c)=0
1580 NEXT c
1590 b=1:t=0
1600 RETURN