'===========================================================================
' Subject: SPACE INVADERS                     Date: 03-12-96 (19:38)       
'  Author: Alan Bruzzi                        Code: QB, QBasic, PDS        
'  Origin: FidoNet QUIK_BAS Echo            Packet: GAMES.ABC
'===========================================================================
1  DIM A$(10, 5), FLAG(10, 5), PS(40), PT(40)
  RANDOMIZE 10
  SCREEN 13: CLS
  DX = 1: DY = 1: DDX = 1: X3 = 20: X1 = 20: Y1 = 23: SC = 0: C = 0
  JK = 0: SHIPS = 3: COLOR 1: I1 = X1: JJ = 0
  COLOR 15: LOCATE 24, 1: FOR T = 1 TO 40: PRINT "-"; : NEXT
5  COLOR 3: LOCATE 17, 5: PRINT "ллл"
   LOCATE 18, 4: PRINT "лл"; : PRINT "1"; :  PRINT "лл"
   LOCATE 19, 4: PRINT "лл лл"

   LOCATE 17, 20: PRINT "ллл"
   LOCATE 18, 19: PRINT "лл"; : PRINT "2"; : PRINT "лл"
   LOCATE 19, 19: PRINT "лл лл"

   LOCATE 17, 34:  PRINT "ллл"
   LOCATE 18, 33:  PRINT "лл"; : PRINT "3"; : PRINT "лл"
   LOCATE 19, 33:  PRINT "лл лл"

  FOR Y = 1 TO 5: FOR X = 1 TO 10: A$(X, Y) = CHR$(234): FLAG(X, Y) = 0: NEXT: NEXT
  FOR J = 2 TO 10 STEP 2: FOR K = 2 TO 20 STEP 2: PS(K) = K: PT(J) = J: NEXT: NEXT
  MISY = PT(10)
15 X = 1: Y = 1: FOR J = 2 TO 10 STEP 2: FOR K = 2 TO 20 STEP 2
IF FLAG(X, Y) = 0 THEN LOCATE PT(J), PS(K): COLOR INT(RND(1) * 15) + 1: PRINT A$(X, Y)
X = X + 1: IF X > 10 THEN X = 1
NEXT: Y = Y + 1: IF PT(J) = 22 OR SHIPS <= 0 THEN LOCATE 10, 17: PRINT "GAME OVER": FOR O = 1 TO 100000: NEXT: GOTO 1
NEXT
FOR M = 1 TO 5000: NEXT
GOSUB 50: GOSUB 300
LOCATE 1, 1: COLOR 15: PRINT "SCORE ="; SC: LOCATE 1, 30: PRINT "SHIPS ="; SHIPS
GOSUB 100
IF Y1 <= 2 THEN JJ = 0: LOCATE Y1, X1: PRINT CHR$(32): Y1 = 23
IF JJ = 0 THEN Y1 = 23
IF JJ = 1 THEN I1 = I1: LOCATE Y1, I1: COLOR 15: PRINT CHR$(254): FOR L = 1 TO 500: NEXT: GOSUB 200: LOCATE Y1, I1: PRINT CHR$(32)
Y1 = Y1 - 1
FOR J = 2 TO 10 STEP 2: FOR K = 2 TO 20 STEP 2
LOCATE PT(J), PS(K): PRINT " "
NEXT: NEXT
FOR M = 1 TO 5000: NEXT
GOSUB 50
GOSUB 300
FOR X = 2 TO 20 STEP 2
   PS(X) = PS(X) + DDX: IF PS(X) > 38 THEN DDX = -DDX: FOR Y = 2 TO 20 STEP 2: PT(Y) = PT(Y) + 1: NEXT
IF PS(X) = 0 THEN PS(X) = PS(X) + 2: DDX = -DDX: FOR Y = 2 TO 20 STEP 2: PT(Y) = PT(Y) + 1: NEXT
   NEXT
   GOTO 15
50    LOCATE 23, X1: COLOR 14: PRINT CHR$(127)
      RETURN
100 A$ = INKEY$: IF A$ = "" THEN RETURN
    IF A$ = "," THEN LOCATE 23, X1: PRINT " ": X1 = X1 - 1: A$ = ""
    IF A$ = "." THEN LOCATE 23, X1: PRINT " ": X1 = X1 + 1:  A$ = ""
    IF A$ = " " THEN JJ = 1: I1 = X1
    IF A$ = CHR$(27) THEN END
    IF X1 = 0 THEN X1 = X1 + 1
    IF X1 = 39 THEN X1 = X1 - 1
    RETURN
200 FOR J1 = 2 TO 10 STEP 2: FOR J2 = 2 TO 20
    IF FLAG(J2 / 2, J1 / 2) = 0 AND I1 = PS(J2) AND Y1 = PT(J1) THEN A$(J2 / 2, J1 / 2) = " ": FLAG(J2 / 2, J1 / 2) = 1: BEEP: JJ = 0: Y1 = 23: SC = SC + 10
    NEXT: NEXT
    RETURN
300 IF JK = 0 THEN GOSUB 400: MISY = PT(10) + 1: JK = 1: MM = PS(M)
    LOCATE MISY, MM: COLOR 15: PRINT CHR$(254): FOR L = 1 TO 2000: NEXT: LOCATE MISY, MM: PRINT CHR$(32)
    MISY = MISY + 1: IF MISY = 23 THEN JK = 0
    L = SCREEN(MISY, MM): IF L = 127 THEN SHIPS = SHIPS - 1: BEEP: FOR T = 1 TO 1000: NEXT
    RETURN
400 M = INT(RND(1) * 20) + 2: N = M MOD 2
    IF N = 1 THEN 400
    RETURN

