'=========================================================================== ' Subject: JACK'S GAME Date: 03-06-96 (09:55) ' Author: Jacques Mallah Code: QB, QBasic, PDS ' Origin: pages.nyu.edu/~jqm1584/ Packet: GAMES.ABC '=========================================================================== 'JGS.BAS by Jacques Mallah H = 5: RANDOMIZE TIMER: SCREEN 7: L = TIMER J: M = M + 1: IF TIMER - L < .4 THEN GOTO J M = M / 500: X = 2: Y = 10: BX = 38: BY = 10: FC = 16: OXP = -10: OYP = -10 MM = M: ZX = 38: ZY = 2: DIM UA(0 TO 7, 0 TO 7): XP = X * 8 - 4: YP = 76: DIM BA(0 TO 7, 0 TO 7) DIM A(0 TO 7, 0 TO 7): GOSUB 10: GOSUB 10: BH = 1: LOCATE 1, 1: PRINT "H= 5.00", "S="; S, "BH="; BH: LOCATE 3, 10: PRINT "J A C K 'S G A M E" PRINT "KILL THE BAD GUY, NOW."; : PUT (18 * 8, 24), BA PRINT "TO SURVIVE MORE SHOTS, PICK UP:": PRINT "H FOR 1 H, "; : COLOR 9: PRINT "H"; : COLOR 15: PRINT " FOR 3 H POINTS." PRINT "USE CURSOR TO MOVE AND ALMOST ANY OTHER KEY TO SHOOT WHEN "; : COLOR 14: PRINT "-"; : COLOR 15: PRINT " IS WHITE." LOCATE 12, 1: PRINT "H= # OF HITS YOU CAN TAKE.": PRINT "S= YOUR SCORE": PUT (BX * 8 - 8, BY * 8 - 8), BA: PUT (XP - 4, YP - 4), UA: LINE (XP + 5, YP)-(XP + 10, YP), 14 PRINT "BH= # OF HITS BAD GUY CAN TAKE.": PRINT "BAD GUYS WOUND YOU AT CLOSE RANGE.": PRINT "H AND "; : COLOR 9: PRINT "H"; : COLOR 15: PRINT " DON'T MOVE RANDOMLY.": PRINT "YOU CAN TURN AROUND BOUNCING OFF WALLS": PRINT : PRINT "PAUSE PAUSES IT." PRINT "ON SOME MACHINES, DON'T PRESS KEYS": PRINT "TOO OFTEN, TO AVOID BACKUP.": PRINT "PRESS ONLY ONE KEY AT A TIME." PRINT "PRESS S FOR SOUND." TX = 33: TY = 12: LOCATE TY, TX: PRINT "H"; : LOCATE ZY, ZX: COLOR 9: PRINT "H"; COLOR 15: LOCATE 25, 1: PRINT "PRESS ANY KEY (NOT S) TO START"; : Q = 1: OTY = TY: OTX = TX: OZX = ZX: OZY = ZY DC = .8 ^ (1 / M): Z = 11 * M ^ 2: NB = M * .14: PS = 1.5 / M: INJ = 1 SS = 3.3 / M: VX = .1 / M: RV = -VX: RR = 1.0013 ^ (1 / M) IK: I$ = INKEY$: IF I$ = "" THEN GOTO IK IF UCASE$(I$) <> "S" THEN LINE (XP - 5, YP)-(XP - 10, YP), 0: LINE (0, 176)-(319, 199), 0, BF: GOTO 1 IF SSS = 0 THEN SSS = 1: LOCATE 23, 1: PRINT "PRESS S FOR NO SOUND.": GOTO IK IF SSS = 1 THEN SSS = 0: LOCATE 23, 1: PRINT "PRESS S FOR SOUND. ": GOTO IK G: TX = INT(2 + RND * 36): TY = INT(2 + RND * 21): VTY = 0 1 C = C + PS * .61 IF ZB < TIMER THEN LINE (OBX * 8 - 8, OBY * 8 - 8)-(OBX * 8, OBY * 8), 0, BF IF Q = 1 THEN IF INJ = 1 THEN PUT (BX * 8 - 8, BY * 8 - 8), BA ELSE Q = 1: CLS : PUT (0, 0), BA: GOSUB Q: GOSUB P: ZB = ZB + 4 END IF END IF LOCATE OTY, OTX: PRINT " "; : LOCATE OZY, OZX: PRINT " "; : OTY = TY: OTX = TX: OZY = ZY: OZX = ZX LOCATE 1, 1: PRINT USING "H= ##.##&"; H: LOCATE 1, 15: PRINT "S="; S, "BH="; BH LOCATE TY, TX: PRINT "H"; LOCATE ZY, ZX: COLOR 9: PRINT "H"; : COLOR 15 IF RV > 2.5 / M THEN VX = VX * 2.5 / RV / M: VY = VY * 2.5 / RV / M: RV = 2.5 / M I$ = RIGHT$(INKEY$, 1) ON (BZ + Q) GOSUB 200, 200, 200, 210, 220, 230, 240, 250, 250, 250 IF I$ = "H" THEN VY = VY - .08 / NB: GOTO 2 IF I$ = "P" THEN VY = VY + .08 / NB: GOTO 2 IF I$ = "K" THEN VX = VX - .1 / NB: GOTO 2 IF I$ = "M" THEN VX = VX + .1 / NB: GOTO 2 IF I$ = "" THEN 2 IF FC < 33 THEN I$ = INKEY$ ELSE SOUND 450, 1 * SSS LINE (SX + VSX, SY + VSY)-(SX - VSX, SY - VSY), 0: BS = 0 FC = 0: VSX = VX / RV * 4: VSY = VY / RV * 4: SF = 1: SX = XP: SY = YP END IF 2 R = ((X - BX) ^ 2 + ((Y - BY) * 1.25) ^ 2) ^ .5 + .01 LINE (XP - 4, YP - 4)-(XP + 4, YP + 4), 0, BF LINE (XP + XPV * 5, YP + YPV * 5)-(XP + VXP * 10, YP + VYP * 10), 0, BF X = X + VX: IF X < 2 OR X > 38 THEN X = X - VX: VX = -VX * .4: GOSUB DEP: IF VY ^ 2 > .0000001 THEN VY = VY * .3 Y = Y + VY: IF Y < 2 OR Y > 23 THEN Y = Y - VY: VY = -VY * .4: GOSUB DEP: IF VX ^ 2 > .0000001 THEN VX = VX * .3 JX = 10000: IF (VX * 10) ^ 2 * M > .0000001 * JY THEN VX = VX * DC: JX = 1 JY = 10000: IF (VY * 10) ^ 2 * M > .0000001 * JX THEN VY = VY * DC: JY = 1 XP = X * 8 - 4: YP = Y * 8 - 4: PUT (XP - 4, YP - 4), UA RV = ((VX) ^ 2 + (1.25 * VY) ^ 2) ^ .5: FC = FC + SS * .9: IF RV > .4 / M THEN DC = .8 ^ (1 / M) ELSE DC = .6 ^ (1 / M) VXP = VX / RV: VYP = VY / RV: LINE (XP + VXP * 5, YP + VYP * 5)-(XP + VXP * 10, YP + VYP * 10), 14 - (FC > 32) IF SF = 1 THEN LINE (SX + VSX, SY + VSY)-(SX - VSX, SY - VSY), 0 DD = (BX * 8 - 4 - SX) * VSX / 4 + (BY * 8 - 4 - SY) * VSY * 1.25 ^ 2 / 4 DE = (BX * 8 - 4 - SX) ^ 2 + ((BY * 8 - 4 - SY) * 1.25) ^ 2 - (DD ^ 2) IF DD > -6 AND DD < 8 + 3 * 4 * SS AND DE < 75 THEN IF Q = 1 AND TIMER > ZB AND BS = 0 THEN BH = BH - 1: S = S + 2 * BZ + 2: SF = 0: CLS : GOSUB TBASE: BS = 1 IF BH <= 0 THEN BZ = BZ + 1: Q = 0: LINE (BX * 8 - 8, BY * 8 - 8)-(BX * 8, BY * 8), 0, BF: BH = BZ: GOSUB 10: ZB = TIMER + 5: PS = (1.5 + .08 * BH) / M: VBX = VBX + (RND * 2 - 1) / M: VBY = VBY * (RND * 1.6 - .8) / M IF BZ = 5 THEN INJ = 1 IF BZ > 4 THEN PS = 2 / M IF BZ < 8 THEN BX = 38: BY = 2 + RND * 21: VBX = (RND - .5) / M: VBY = (RND - .5) / M ELSE EEP = 1 END IF END IF SX = SX + VSX * SS * 3: SY = SY + VSY * SS * 3 IF SF = 1 THEN LINE (SX + VSX, SY + VSY)-(SX - VSX, SY - VSY), 13 END IF VTY = VTY + .02 / M ^ 2: TY = TY + VTY: IF TY > 23 OR TY < 2 THEN VTY = -VTY: TY = TY + VTY IF (X - TX) ^ 2 + ((Y - TY) * 1.25) ^ 2 < 1.1 THEN S = S + CINT(BZ / 2) + 1: H = H + 1: GOTO G VZX = VZX * .99 ^ (1 / M) + (TX - ZX) / 72 / M ^ 2: ZX = ZX + VZX VZY = VZY * .99 ^ (1 / M) + (TY - ZY) / 90 / M ^ 2: ZY = ZY + VZY IF ZX + VZX > 38 OR ZX + VZX < 2 THEN VZX = -VZX IF ZY + VZY > 23 OR ZY + VZY < 2 THEN VZY = -VZY IF INT(X + .5) = CINT(ZX) AND INT(Y + .5) = INT(ZY + .5) THEN S = S + CINT(BZ / 2) + 1: H = H + 3: ZX = 38: ZY = 2: VZY = 0: VZX = -RND * 3 / M IF Q = 0 OR TIMER < ZB THEN GOTO B VBX = VBX * .9 ^ (1 / M) + (X - BX) / R / Z + (RND - .5) / Z * 1.9 VBY = VBY * .9 ^ (1 / M) + (Y - BY) / Z / 1.25 / R + (RND - .5) / Z * 1.52 IF BX + VBX > 38 OR BX + VBX < 2 THEN VBX = -VBX IF BY + VBY > 24 OR BY + VBY < 2 THEN VBY = -VBY OBX = BX: OBY = BY: BX = BX + VBX: BY = BY + VBY IF INT(X + .5) = INT(.5 + BX) AND INT(Y + .5) = INT(BY + .5) THEN H = H - .4 / M: LINE (0, 0)-(319, 199), 4, BF: CLS B: IF C <= 14 THEN GOTO SM IF Q = 1 AND TIMER > ZB THEN SOUND 750, 1 * SSS EEP = 0: LINE ((FX + VFX) * 8 - 4, (FY + VFY) * 8 - 4)-((FX - VFX) * 8 - 4, (FY - VFY) * 8 - 4), 0 FX = BX: FY = BY: RVF = (((X - BX) + VX * R / PS / 3) ^ 2 + (((Y - BY) + VY * R / PS / 3) * 1.25) ^ 2) ^ .5 VFX = ((X - BX) + VX * R / PS / 3) / 2 / RVF: VFY = ((Y - BY) + VY * R / PS / 3) / 2 / RVF: C = 0: F = 0 ELSE F = 1 END IF SM: DD = (X - FX) * VFX * 2 + (Y - FY) * VFY * 1.25 ^ 2 * 2 DE = (X - FX) ^ 2 + (Y - FY) ^ 2 * 1.25 ^ 2 - (DD ^ 2) LINE ((FX + VFX) * 8 - 4, (FY + VFY) * 8 - 4)-((FX - VFX) * 8 - 4, (FY - VFY) * 8 - 4), 0 IF DD > -.5 AND DD < .5 + 3 * .5 * PS AND DE < .8 AND F = 0 THEN H = H - 1: F = 1: TFK = TIMER + 1: LINE (0, 0)-(319, 199), 4, BF: GOSUB TBASE: CLS : IF ZB > TIMER THEN LOCATE 3, 1: PRINT "BAD GUY:": PRINT F$ FX = FX + VFX * PS * 3: FY = FY + VFY * PS * 3 IF F = 0 THEN LINE ((FX + VFX) * 8 - 4, (FY + VFY) * 8 - 4)-((FX - VFX) * 8 - 4, (FY - VFY) * 8 - 4), 4 S = S * RR: IF H > 0 THEN 1 CLS 3 GOSUB DEP: S = INT(S): COLOR 15: GOTO 50 7 CLS : PP = 0: IF BH < 9 THEN PRINT "ENTER S TO SEE HIGH SCORES" PRINT "S ="; S: PP = 0: INPUT "ANOTHER GAME(Y/DEFAULT = NO)"; Y$ IF Y$ = "Y" OR Y$ = "y" THEN CLS : RUN IF (Y$ = "S" OR Y$ = "s") AND BH < 9 THEN 51 END DEP: I$ = INKEY$: IF I$ <> "" THEN GOTO DEP SOUND 600, 1 * SSS: RETURN TBASE: FOR T = 1 TO 90 * (M - 1): NEXT: SOUND 300, 1 * SSS: RETURN Q: IF BZ > 7 THEN RETURN FOR C = 0 TO 7: FOR T = 0 TO 7: A(C, T) = POINT(C, T): NEXT: NEXT FOR N = 1 TO 6 STEP 1 / MM FOR C = 0 TO 7: I$ = INKEY$: FOR T = 0 TO 7 LINE (C * N, T * N)-(C * N + N - 1, T * N + N - 1), A(C, T), BF NEXT: NEXT: NEXT: GOSUB DEP: CLS : RETURN P: IF BZ < 9 AND Q = 0 THEN READ F$ IF BZ = 0 THEN LOCATE 9, 1: PRINT F$ IF BZ < 9 AND BZ <> 0 THEN LOCATE 3, 1: PRINT "BAD GUY:": PRINT F$ IF BZ = 9 THEN LOCATE 4, 1: PRINT "IF YOU DISPEL ITS FORM A THIRD TIME": PRINT "IT WILL BE BANISHED" RETURN 10 IF BZ > 1 THEN BH = BH - 1: IF BH > 6 THEN BH = 6 IF BZ = 2 THEN RETURN IF BZ = 10 THEN 15 IF BZ < 8 THEN READ F1, F2, F3, F4: LOCATE 1, 1: PRINT " " LINE (3, 0)-(4, 1), F1, B: LINE (7, 5)-(7, 5), F1: LINE (0, 5)-(0, 5), F1 LINE (1, 2)-(6, 2), F2: LINE (3, 3)-(4, 4), F2, B: LINE (0, 3)-(0, 4), F2 LINE (7, 3)-(7, 4), F2: LINE (3, 5)-(2, 6), F3: LINE (4, 5)-(5, 6), F3 LINE (0, 7)-(1, 7), F4: LINE (6, 7)-(7, 7), F4 IF AU = 0 THEN GET (0, 0)-(7, 7), UA: AU = 1: GOSUB Q: GOSUB P: RETURN GET (0, 0)-(7, 7), BA: IF BZ = 0 THEN GOSUB Q GOSUB P: RETURN DATA 6,9,1,8,,6,8,8,8,"THE BAD GUY NOW IS A SECURITY GUARD",6,2,2,2,"ARMY GUY",6,6,15,6,"KARATE MASTER - STUN SHOTS" DATA 6,0,0,0,"NINJA - INVISIBILITY",8,8,8,8,"ROBOT - HEAT SEEKING SHOTS",8,2,2,2,"ARMY ROBOT - EXPLOSIVE SHOTS",4,4,4,4,"DEMON - CAN TELEPORT" DATA "CAN IT BE DEAD?" 15 S = S * 1.5: PAINT (100, 100), 5, 12: COLOR 0 FOR T = 0 TO 6000 * M STEP 9: A = T * ATN(1) / 180 * 4: R = T / 30 IF T > 33000 THEN FOR JH = 1 TO M * 10000: NEXT: EXIT FOR LINE (150 - R * COS(A), 95 - SIN(A) * R * .8)-(150 + R * .25, 95 - R * .25) NEXT: DIM LX(-1 TO 1, -1 TO 1): DIM LY(-1 TO 1, -1 TO 1): X = 20: Y = 27 DIM VLX(-1 TO 1, -1 TO 1): DIM VLY(-1 TO 1, -1 TO 1): SCREEN 0 FOR C = 9 TO 15: COLOR C EX = 0: VS = -.83 - RND / 7: X = 17 + 6 * RND FOR T = -1 TO 1: FOR A = -1 TO 1: VLY(T, A) = VS: VLX(T, A) = 0 LX(T, A) = X: LY(T, A) = Y: NEXT: NEXT 20 FOR T = -1 TO 1: FOR A = -1 TO 1 IF LX(T, A) > .5 AND LX(T, A) < 40 AND LY(T, A) > .5 AND LY(T, A) < 25 THEN FOR R = 0 TO M: LOCATE LY(T, A), LX(T, A): PRINT "`"; : NEXT END IF VLY(T, A) = VLY(T, A) + .02: LY(T, A) = LY(T, A) + VLY(T, A): LX(T, A) = LX(T, A) + VLX(T, A) IF LX(T, A) > .5 AND LX(T, A) < 40 AND LY(T, A) > .5 AND LY(T, A) < 25 THEN FOR R = 0 TO M: LOCATE LY(T, A), LX(T, A): PRINT "*"; : NEXT END IF NEXT: NEXT IF VLY(0, 0) > 0 AND EX = 0 THEN EX = 1: FOR T = -1 TO 1: FOR A = -1 TO 1 R = 1.5 / (3 + 3 * RND): VLX(T, A) = T * R: VLY(T, A) = VLY(T, A) + A * R: NEXT: NEXT END IF IF LY(-1, -1) < 26 OR EX = 0 OR LY(1, -1) < 26 THEN GOTO 20 LOCATE 1, 1: COLOR 0: PRINT " ": LOCATE 1, 1: SLEEP 1: CLS NEXT LOCATE 1, 1: PRINT "YOU WON": PRINT : GOTO 3 50 DIM N$(1 TO 10): DIM S$(1 TO 10): DIM S(1 TO 10) SCREEN 8: ON ERROR GOTO 100 51 OPEN "SDF.12" FOR INPUT ACCESS READ AS #1 FOR T = 1 TO 10: LINE INPUT #1, N$(T): LINE INPUT #1, S$(T) S(T) = VAL(S$(T)): NEXT: CLOSE #1 IF S <= S(10) AND Y$ <> "S" AND Y$ <> "s" THEN GOTO CL IF UCASE$(Y$) = "S" THEN 52 PP = 0: FOR T = 10 TO 1 STEP -1: IF S > S(T) THEN PP = T NEXT 52 CLS : PRINT "#", "NAME", , , "SCORE": PUT (88, 0), UA FOR T = 10 TO 2 STEP -1: IF PP < T AND UCASE$(Y$) <> "S" THEN N$(T) = N$(T - 1): S(T) = S(T - 1): S$(T) = STR$(S(T)) NEXT: FOR T = 1 TO 10: LOCATE T + 1, 1: PRINT T, : IF T <> PP THEN PRINT N$(T) ELSE PRINT " {You}" LOCATE T + 1, 56: IF T <> PP THEN PRINT S$(T) ELSE PRINT S NEXT: IF UCASE$(Y$) = "S" THEN GOTO 101 KILL "SDF.12" 100 IF ERR > 0 THEN PP = 1: CLOSE #1 IF S < 1 THEN BH = 10: GOTO CL IF PP < 1 THEN GOTO CL PRINT : PRINT "S ="; S: GOSUB DEP INPUT "NAME? ", N$(PP): IF LEN(N$(PP)) > 40 THEN N$(PP) = LEFT$(N$(PP), 40) S(PP) = S: S$(PP) = STR$(S) OPEN "SDF.12" FOR OUTPUT ACCESS WRITE AS #1 FOR T = 1 TO 10: PRINT #1, N$(T): PRINT #1, S$(T): NEXT GOSUB DEP: FOR T = 1 TO 15000 * M: NEXT CL: CLOSE #1 101 IF Y$ = "S" OR Y$ = "s" THEN PRINT : INPUT "ELIMINATE CURRENT LIST (YES/DEFAULT = NO)?", Y$ IF UCASE$(Y$) = "YES" THEN KILL "SDF.12": BH = 10: OPEN "SDF.12" FOR OUTPUT ACCESS WRITE AS #1: FOR T = 10 TO 100 * RND + 20: PRINT #1, "@"; : NEXT: CLOSE #1 END IF GOTO 7 200 RETURN 210 IF TFK > TIMER THEN KM = 1 ELSE KM = 0 LINE (OXP - 8, OYP + 8)-(OXP + 7, OYP + 8), 0 IF KM = 1 THEN I$ = INKEY$: I$ = "": KM = 0: LINE (XP - 8, YP + 8)-(XP + 7, YP + 8), 7: OXP = XP: OYP = YP RETURN 220 IF BZ = 5 THEN RETURN IF Q = 0 OR ZB > TIMER THEN INJ = -1: RETURN IF TB < TIMER THEN TB = TIMER + 3 + INJ / 2: INJ = -INJ RETURN 230 IF F = 1 OR C > 14 THEN RETURN DD = (X - FX) * VFX * 2 + (Y - FY) * VFY * 1.25 ^ 2 * 2 + .001 RUF = ((X - FX) ^ 2 + (Y - FY) ^ 2 * 1.25 ^ 2) ^ .5 + .001 RF = 42 * (DD) ^ 2 ^ .5 / RUF * M LINE ((FX + VFX) * 8 - 4, (FY + VFY) * 8 - 4)-((FX - VFX) * 8 - 4, (FY - VFY) * 8 - 4), 0 VFX = VFX + (X - FX) / RF: VFY = VFY + (Y - FY) / RF / 1.25 RF = (VFX ^ 2 + (VFY ^ 2 * 1.25 ^ 2)) ^ .5: VFX = VFX * .5 / RF: VFY = VFY * .5 / RF C = C - PS * .2 LINE ((FX + VFX) * 8 - 4, (FY + VFY) * 8 - 4)-((FX - VFX) * 8 - 4, (FY - VFY) * 8 - 4), 4 RETURN 240 IF F = 1 OR EEP = 1 OR C > 14 THEN RETURN IF FX < 1 THEN EX = 0: EY = FY * 8 - 1: EEP = 1 IF FX > 40 THEN EX = 319: EY = FY * 8 - 1: EEP = 1 IF FY < 1 THEN EY = 0: EX = FX * 8 - 1: EEP = 1 IF FY > 25 THEN EY = 199: EX = FX * 8 - 1: EEP = 1 IF EEP = 0 THEN RETURN IF EX < 0 THEN EX = 0 IF EX > 319 THEN EX = 319 IF EY < 0 THEN EY = 0 IF EY > 199 THEN EY = 199 CIRCLE (EX, EY), 69, 4: PAINT (EX, EY), 4, 4: GOSUB TBASE: PAINT (EX, EY), 0, 0: CIRCLE (EX, EY), 69, 0 IF (X * 8 - 4 - EX) ^ 2 + (Y * 8 - 4 - EY) ^ 2 * 1.25 ^ 2 < 70 ^ 2 THEN H = H - 1 RETURN 250 IF EEP = 1 THEN RETURN EEP = 1: PLZ = PLZ + 1: IF PLZ < 6 THEN RETURN PLZ = 0: LINE (BX * 8 - 8, BY * 8 - 8)-(BX * 8, BY * 8), 0, BF BX = 2 + RND * 36: BY = 2 + RND * 21: RETURN