'=========================================================================== ' Subject: BUG SHOOT Date: 05-07-97 (01:40) ' Author: Jim Emptage Code: QB, PDS ' Origin: 75504.2526@Compuserve.com Packet: GAMES.ABC '=========================================================================== ' dosdelay sub routine Released to the Public Domain by Kurt Kuzba ' game by jim emptage 75504.2526@compuserve.com ' only authorized distributor is William Yu of All Basic Code ' works ok on my 486 DX266 ' could use a better speed control ' my version has 14 bugs to shoot at and a high score feature ' but they are in separate data files and I wanted this to be ' a single file program for uploading ' if you improve this game send me a copy ' enjoy your QBasic hobby! ' jim emptage DECLARE SUB dosdelay (seconds!) DECLARE SUB FIRSTLOOP () DECLARE SUB INITIAL () DEFINT A-Y DEFSNG Z DECLARE SUB loadbug () DECLARE SUB boombug () DECLARE SUB RULES () DECLARE SUB wwait () DECLARE SUB tit () DECLARE SUB spidey () DECLARE SUB MOUSE (m0%, m1%, m2%, m3%) DECLARE SUB hidemouse () DECLARE SUB showmouse () DECLARE SUB getmxy (mx%, my%) DECLARE SUB setmxy (mx%, my%) DECLARE SUB mborders (X%, y%, h%, v%) DECLARE FUNCTION mbtn% () COMMON SHARED xx, yy, sx, sy, my%, mx%, clr, ODX, dy, DDX, ddy COMMON SHARED s1, s2, score, turns, zcr, DOBUG, speed, X$ COMMON SHARED chx, chy, xu, yu, sss, xsh, YSH, ztx, zty ON ERROR GOTO ERRS TYPE RegType ax AS INTEGER bx AS INTEGER cx AS INTEGER dx AS INTEGER bp AS INTEGER si AS INTEGER di AS INTEGER flags AS INTEGER END TYPE DIM SHARED sp(18, 18) AS INTEGER DIM SHARED nt AS STRING * 30 CALL loadbug CALL RULES speed = 1 SCREEN 13 FOR t = 101 TO 115 yo = yo + 1 PALETTE t, yo * 4 NEXT PALETTE 200, 60 CALL hidemouse CALL setmxy(5, 5) LOCATE 1, 1, 0, 0, 0 DOBUG = 10 RESTART: VIEW VIEW (1, 1)-(319, 189) s1 = 0 s2 = 1 score = 0 turns = 11 START: turns = turns - 1 CLS COLOR 12 LOCATE 25, 1 PRINT " SCORE: "; score; COLOR 10 PRINT " TURNS LEFT: "; turns; COLOR 11 PRINT " RVS "; IF turns = 0 THEN COLOR 12 LOCATE 12, 3 PRINT " RVS BUG SHOOT - E N D OF GAME"; DO LOOP WHILE INKEY$ = "" GOTO RESTART END IF RANDOMIZE TIMER CALL INITIAL 1 X$ = "" WHILE INKEY$ <> "" WEND IF sss = 0 THEN CALL FIRSTLOOP END IF IF sss = 1 THEN SWAP s1, s2 IF s1 = 0 THEN CALL getmxy(ODX, dy) CALL spidey END IF END IF DDX = ODX ddy = dy PSET (xs + 1, ys + 1), 0 PSET (xs - 1, ys - 1), 0 PSET (xs - 1, ys + 1), 0 PSET (xs + 1, ys - 1), 0 IF X$ = "" THEN GOTO 11 IF X$ <> "" THEN SELECT CASE UCASE$(X$) CASE CHR$(27) ' ESC PALETTE CALL tit END CASE "S" SOUND 80, 3 speed = speed + 1 IF speed = 6 THEN speed = 1 LOCATE 25, 38 PRINT speed; GOTO 1 END SELECT GOTO 1 END IF 11 IF mbtn% <> 0 AND sss = 0 THEN CALL getmxy(xsh, YSH) IF YSH > 188 THEN GOTO 88 IF xsh = 160 THEN xsh = 161 PSET (xsh, YSH), 11 sss = 1 OAX = ABS(160 - xsh) ay = ABS(200 - YSH) zdx = OAX / ay da = 2000 * (zdx / 144) ztx = 160 zty = 200 END IF IF sss = 1 THEN FOR mmm = 1 TO da NEXT PSET (xsh, YSH), 11 PSET (tempx, tempy), 0 IF xsh > 160 THEN ztx = ztx + (zdx) zty = zty - (1) END IF IF xsh <= 160 THEN ztx = ztx - (zdx) zty = zty - (1) END IF tempx = ztx tempy = zty PSET (ztx, zty), 14 IF ztx = xsh OR zty = YSH THEN FOR a = 15 TO 1 STEP -1 CIRCLE (ztx, zty), a, a + 50 PAINT (ztx, zty), a + 50, a + 50 SOUND 40 + (a * 100), .1 NEXT dosdelay .2 f = 0 IF ztx > 318 THEN f = 1 IF ztx < 2 THEN f = -1 CIRCLE (ztx, zty), 15, 100 PAINT (ztx - f, zty), 0, 100 CIRCLE (ztx, zty), 15, 0 sss = 0 uu = 5 IF hhh = 0 THEN zXD& = ABS(ztx - (xu + 9)) zYD& = ABS(zty - (yu + 9)) zcr = SQR((zXD& * zXD&) + (zYD& * zYD&)) IF zcr < 20 THEN hhh = 1 END IF IF hhh = 1 THEN CALL boombug hhh = 0 GOTO START END IF turns = turns - 1 COLOR 12 LOCATE 25, 1 PRINT " SCORE: "; score; COLOR 10 PRINT " TURNS LEFT: "; turns; COLOR 11 PRINT " RVS "; IF turns = 0 THEN COLOR 12 LOCATE 12, 3 PRINT " RVS BUG SHOOT - E N D of game"; DO LOOP WHILE INKEY$ = "" GOTO RESTART END IF END IF END IF 88 IF sss = 0 THEN CALL getmxy(xs, ys) PSET (xs + 1, ys + 1), 200 PSET (xs - 1, ys - 1), 200 PSET (xs - 1, ys + 1), 200 PSET (xs + 1, ys - 1), 200 END IF GOTO 1 99 WHILE INKEY$ <> "" WEND SLEEP 4 END ERRS: CLS SCREEN 0 PRINT "ERROR" PRINT PRINT "VGA AND MOUSE REQUIRED" PRINT PRINT RESUME 99 DATA 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 30 , 0 ,0 , 0 , 0 , 0 DATA 3 , 3 , 3 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 12, 12 , 12 , 12 , 3 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 12 ,10 , 10 , 10 , 12 , 3 DATA 3 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 12 , 10 , 0 , 10 , 12, 3 , 14 , 3 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 3 , 12 , 10 , 0 , 10 ,12 , 3 , 14 , 14 , 3 , 0 DATA 1 , 1 , 1 , 1 , 30 , 0 , 0 , 3 , 12 , 10 , 10 , 10 , 12 , 13 , 3 , 14, 14 , 3 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 3 , 13 , 13 , 13 , 13 , 13 , 13 , 3, 14 , 14 , 3 , 1 , 0 , 0 , 0 DATA 0 , 0 , 0 , 3 , 13 , 13 , 13 , 13 , 13 , 13 , 3 , 14 , 14 , 3 , 1 , 0, 0 , 0 , 0 , 0 , 0 , 3 , 12 , 10 , 10 , 10 , 12 , 13 , 3 , 14 , 14 , 3 , 1, 0 , 0 , 0 , 0 , 0 , 0 , 3 DATA 12 , 10 , 0 , 10 , 12 , 3 , 14 , 14 , 3 , 0 , 1 , 1 , 1 , 1 , 30 , 0 ,0 , 0 , 12 , 10 , 0 , 10 , 12 , 3 , 14 , 3 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0, 0 , 0 , 12 , 10 , 10 , 10 DATA 12 , 3 , 3 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 12 , 12 ,12 , 12 , 3 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 3 , 3, 3 , 0 , 0 , 0 DATA 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0, 0 , 0 , 0 , 0 , 0 , 1 , 30 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,0 , 0 , 0 , 0 DATA 0 , 0 , 0 , 0 SUB boombug FOR BBB = 30 TO 1 STEP -1 CIRCLE (ztx, zty), BBB, 100 + (1 + (BBB MOD 14)) PAINT (ztx, zty), 100 + (1 + (BBB MOD 14)), 100 + (1 + (BBB MOD 14)) SOUND 40 + (BBB * 10), 1 NEXT dosdelay .5 FOR B = 2 TO 30 CIRCLE (ztx, zty), B, B + 200 PAINT (ztx, zty), 0, B + 200 NEXT score = score + (200 - zty) CLS END SUB DEFSNG A-Y SUB dosdelay (seconds!) DEF SEG = 0 d& = FIX(seconds! * 18.20444444#) FOR t& = t& TO d& d% = PEEK(&H46C) AND 255 WHILE d% = (PEEK(&H46C) AND 255) WEND NEXT END SUB DEFINT A-Y SUB FIRSTLOOP DO X$ = INKEY$ IF sss = 0 THEN SWAP s1, s2 IF s1 = 0 THEN CALL getmxy(ODX, dy) CALL spidey END IF END IF LOOP UNTIL DDX <> ODX OR ddy <> dy OR X$ <> "" OR mbtn% <> 0 END SUB DEFINT Z SUB getmxy (mx%, my%) STATIC MOUSE 3, 0, X, y ' get graphic coordinates mx% = X / 2 ' (x / 8) + 1 my% = y ' (y / 8) + 1 'convert to text coordinates END SUB SUB hidemouse STATIC CALL MOUSE(2, 0, 0, 0) END SUB DEFSNG Z SUB INITIAL xu = (RND * 200) + 50 yu = (RND * 100) + 50 chk = INT(RND * 3) SELECT CASE chk CASE 0 chx = 1 chy = 1 CASE 1 chx = -1 chy = 1 CASE 2 chx = 1 chy = -1 CASE 3 chx = -1 chy = -1 END SELECT END SUB SUB loadbug ' can have more bugs left out so data files not needed FOR X = 1 TO 18 FOR y = 1 TO 18 READ C sp(X, y) = C NEXT NEXT END SUB DEFINT Z SUB mborders (X, y, h, v) STATIC MOUSE 7, 0, (X - 1) * 8, (h - 1) * 8 MOUSE 8, 9, (y - 1) * 8, (v - 1) * 8 END SUB FUNCTION mbtn% STATIC MOUSE 3, buttons, 0, 0 mbtn% = buttons END FUNCTION SUB MOUSE (m0%, m1%, m2%, m3%) STATIC DIM inregs AS RegType, outregs AS RegType inregs.ax = m0% inregs.bx = m1% inregs.cx = m2% inregs.dx = m3% CALL INTERRUPT(51, inregs, outregs) m0% = outregs.ax m1% = outregs.bx m2% = outregs.cx m3% = outregs.dx END SUB DEFSNG Z SUB RULES CLS SCREEN 0 WIDTH 80, 25 COLOR 14 PRINT " BUG SHOOT - BY ROUGE VALLEY SOFTWARE - COPYRIGHT 1997" COLOR 10 PRINT " MOUSE REQUIRED - VGA REQUIRED" COLOR 12 PRINT "GAME PLAY:" PRINT PRINT "The bug bounces around the screen." PRINT PRINT "Move the mouse around the screen to determine where bomb is to travel to." PRINT "Click the mouse button to launch bomb. Timing is the key to success." PRINT PRINT "If bomb blast touches the bug the bug explodes." PRINT PRINT "You have 10 turns." PRINT PRINT "Your score for each correct hit is determined by the hight of the bug." PRINT "If the bug is right at the top of the screen you get 199 points." PRINT "If the bug is right at the bottom of the screen you get 11 points, same as a" PRINT "miss." PRINT PRINT "For each hit then, the score ranges from 11 to 199, in steps of 1." PRINT "A perfect score would be 1990 points [never been done at high speed]." PRINT "" PRINT "ESCAPE [ESC] TO END PROGRAM [S] TO CHANGE SPEED" COLOR 14 LOCATE 25, 1 PRINT "Press Any Key"; WHILE INKEY$ <> "" WEND DO LOOP WHILE INKEY$ = "" WHILE INKEY$ <> "" WEND CLS SCREEN 13 END SUB DEFINT Z SUB setmxy (X, y) STATIC MOUSE 4, 0, (X - 1) * 8, (y - 1) * 8 END SUB SUB showmouse STATIC MOUSE 1, 0, 0, 0 END SUB SUB spidey xc$ = INKEY$ WHILE INKEY$ <> "" WEND IF speed <> 1 THEN SELECT CASE speed CASE 2 FOR a& = 1 TO 5000 NEXT CASE 3 FOR a& = 1 TO 10000 NEXT CASE 4 FOR a& = 1 TO 20000 NEXT CASE 5 FOR a& = 1 TO 40000 NEXT END SELECT END IF xu = xu + chx yu = yu + chy FOR ys = 1 TO 18 ' put spidey FOR xs = 1 TO 18 pc = POINT(xu + xs, yu + ys) IF pc = 200 THEN GOTO 66 IF pc <> sp(xs, ys) THEN PSET (xu + xs, yu + ys), sp(xs, ys) END IF 66 NEXT NEXT 3 IF xu >= 300 THEN chx = 0 - chx IF xu <= 0 THEN chx = ABS(chx) IF yu >= 170 THEN chy = 0 - chy IF yu <= 0 THEN chy = ABS(chy) IF xc$ = CHR$(27) THEN END END SUB DEFSNG Z SUB tit VIEW CLS COLOR 7 PRINT "" PRINT " RVS BUG SHOOT" PRINT "" PRINT " Copyright (1997)" PRINT "" PRINT "PROGRAM WAS CREATED WITH QUICK BASIC" PRINT "" PRINT "LEARN TO BE A BASIC PROGRAMMER" PRINT "" PRINT "A GREAT INTELLECTUAL HOBBY" PRINT "" PRINT "" PRINT "" PRINT "ROUGE VALLEY SOFTWARE" PRINT "255 ROUGE HILLS DRIVE" PRINT "SCARBOROUGH, ONTARIO" PRINT "CANADA M1C 2Y9" PRINT "" PRINT "75504.2526@compuserve.com" PRINT RANDOMIZE TIMER FOR ix = 0 TO 320 FOR iy = 0 TO 200 IF POINT(ix, iy) = 7 THEN PSET (ix, iy), 70 + (10 * RND) NEXT NEXT COLOR 11 CALL wwait CLS END SUB SUB wwait PRINT "Please Wait 5 Seconds ..." t1& = TIMER DO t2& = TIMER t3& = ABS(t1& - t2&) IF dud <> INT(t3&) THEN dud = INT(t3&) LOCATE 25, 37 PRINT INT(t3&); SOUND 40 * (INT(t3&) + 1), 4 END IF LOOP UNTIL t3& >= 5 COLOR 14 LOCATE 24, 1 PRINT "Press Any Key"; WHILE INKEY$ <> "" WEND DO LOOP WHILE INKEY$ = "" WHILE INKEY$ <> "" WEND END SUB