'=========================================================================== ' Subject: QBASIC SPACE INVADERS Date: 12-16-98 (23:38) ' Author: mr whisper Code: QB, QBasic, PDS ' Origin: mrwhisper@odos.freeserve.co.uk Packet: GAMES.ABC '=========================================================================== ' ' Q B a s i c S p a c e I n v a d e r s ' ' Copyright (C) mr whisper 1992 ' ' ' (1997 version with improved keyborad control (from ABC snippets) ' thanks to marky boy for getting them for me...) ' ' "o" and "p" for left and right (or "q" and "w"), space to fire...... ' ' ' Flippin' Heck Tucker!! A QBASIC version of the fantastic arcade game ' Space Invaders...only 10p a go...if ye dinny ken how tae play this yin ' ye must be a dafty.... ' ' To run this game, press Shift+F5. ' ' To exit QBasic, press Alt, F, X. ' 'Set default data type to integer for faster game play DEFINT A-Z 'User-defined TYPEs 'Sub Declarations DECLARE FUNCTION StillWantsToPlay () 'Constants CONST TRUE = -1 DECLARE SUB Delay (Value#) DECLARE SUB CalculateDelay () DIM SHARED MilliDelay AS DOUBLE: ' Delay value for 1 millisecond CONST FALSE = NOT TRUE CONST STARTOVER = 1 ' Parameters to 'Level' SUB CONST SAMELEVEL = 2 CONST NEXTLEVEL = 3 'Graphix Variables DIM SHARED Vader1&(63) DIM SHARED Vader2&(63) DIM SHARED Vader3&(63) DIM SHARED Vader4&(63) DIM SHARED Vader5&(63) DIM SHARED Vader6&(63) DIM SHARED Man&(63) DIM SHARED Barrier&(100) DIM SHARED Ufo1&(70) DIM SHARED Ufo2&(70) DIM SHARED Explosion&(60) DIM SHARED Bullet1&(40) DIM SHARED Bullet2&(40) DIM SHARED Blank&(66) DIM SHARED Bullets&(20, 3) DIM SHARED Vaders&(100, 2) 'keyboard stuff - dont ask me DIM KS(255), SC(255), DU(255) FOR E = 0 TO 127 ' Setup key data table KSC() SC(E) = E: DU(E) = 1 NEXT FOR E = 128 TO 255 SC(E) = E - 128: DU(E) = 0 NEXT 'initialise delay CALL CalculateDelay 'Do ra Bizzo RANDOMIZE TIMER GOSUB ClearKeyLocks GOSUB SetColors GOSUB getgraphics 'main gameplay loop stillplay = 1 DO WHILE stillplay = 1 'intro GOSUB initvars GOSUB intro GOSUB setupscreen GOSUB govaders DO WHILE lives > 0 GOSUB playinvaders IF deadind = 0 THEN GOSUB setupscreen GOSUB govaders END IF LOOP IF StillWantsToPlay THEN stillplay = 1 ELSE stillplay = 0 END IF LOOP GOSUB RestoreKeyLocks COLOR 15, 0 CLS END ClearKeyLocks: DEF SEG = 0 ' Turn off CapLock, NumLock and ScrollLock KeyFlags = PEEK(1047) POKE 1047, &H0 DEF SEG RETURN RestoreKeyLocks: DEF SEG = 0 ' Restore CapLock, NumLock and ScrollLock states POKE 1047, KeyFlags DEF SEG RETURN SetColors: COLOR 0, 15 SCREEN 7 ' SCREEN 12 CLS RETURN initvars: deadind = 0 vaderdead = 0 lives = 3 level = 1 score = 0 RETURN getgraphics: ' Draw Billet PSET (0, 0), 15 PSET (1, 1), 15 PSET (2, 2), 15 PSET (1, 3), 15 PSET (0, 4), 15 PSET (1, 5), 15 PSET (2, 6), 15 PSET (1, 7), 15 GET (0, 0)-(2, 7), Bullet1& CLS 0 GET (0, 0)-(13, 11), Blank& ' Draw Billet LINE (1, 0)-(1, 7), 15 PSET (0, 2), 15 PSET (2, 2), 15 GET (0, 0)-(2, 7), Bullet2& CLS 0 'Draw Vaders LINE (4, 0)-(6, 0), 15 LINE (3, 1)-(7, 1), 15 LINE (2, 2)-(8, 2), 15 LINE (2, 3)-(8, 3), 15 LINE (1, 4)-(9, 4), 15 LINE (1, 5)-(9, 5), 15 LINE (1, 6)-(9, 6), 15 LINE (2, 7)-(8, 7), 15 PSET (4, 3), 0 PSET (6, 3), 0 PSET (4, 5), 0 PSET (5, 5), 0 PSET (6, 5), 0 PSET (2, 8), 15 PSET (4, 8), 15 PSET (5, 8), 15 PSET (7, 8), 15 PSET (1, 9), 15 PSET (3, 9), 15 PSET (6, 9), 15 PSET (8, 9), 15 PSET (0, 10), 15 PSET (4, 10), 15 PSET (5, 10), 15 PSET (9, 10), 15 GET (0, 0)-(9, 10), Vader1& LINE (0, 10)-(9, 10), 0 PSET (2, 10), 15 PSET (7, 10), 15 GET (0, 0)-(9, 10), Vader2& CLS 0 LINE (2, 0)-(3, 0), 15 PSET (4, 1), 15 PSET (7, 1), 15 PSET (8, 0), 15 PSET (9, 0), 15 LINE (2, 2)-(9, 6), 15, BF LINE (0, 3)-(0, 5), 15 PSET (1, 3), 15 LINE (11, 3)-(11, 5), 15 PSET (10, 3), 15 PSET (4, 3), 0 PSET (7, 3), 0 PSET (3, 7), 15 PSET (5, 7), 15 PSET (6, 7), 15 PSET (8, 7), 15 PSET (2, 8), 15 PSET (4, 8), 15 PSET (7, 8), 15 PSET (9, 8), 15 PSET (1, 9), 15 PSET (5, 9), 15 PSET (6, 9), 15 PSET (10, 9), 15 GET (0, 0)-(11, 10), Vader3& LINE (0, 10)-(9, 10), 0 LINE (0, 0)-(1, 8), 0, BF LINE (10, 0)-(11, 8), 0, BF LINE (0, 9)-(11, 9), 0 PSET (3, 9), 15 PSET (8, 9), 15 LINE (0, 2)-(0, 4), 15 LINE (11, 2)-(11, 4), 15 PSET (1, 4), 15 PSET (10, 4), 15 GET (0, 0)-(11, 10), Vader4& CLS 0 LINE (2, 1)-(9, 1), 15 LINE (0, 2)-(11, 5), 15, BF LINE (2, 6)-(9, 6), 15, BF PSET (4, 3), 0 PSET (7, 3), 0 PSET (3, 7), 15 PSET (5, 7), 15 PSET (6, 7), 15 PSET (8, 7), 15 PSET (2, 8), 15 PSET (4, 8), 15 PSET (7, 8), 15 PSET (9, 8), 15 PSET (1, 9), 15 PSET (5, 9), 15 PSET (6, 9), 15 PSET (10, 9), 15 GET (0, 0)-(11, 9), Vader5& LINE (0, 9)-(11, 9), 0 PSET (3, 9), 15 PSET (8, 9), 15 GET (0, 0)-(11, 9), Vader6& CLS 0 'Draw yerweeman LINE (0, 5)-(8, 9), 14, BF PSET (0, 5), 0 PSET (1, 5), 0 PSET (0, 6), 0 PSET (8, 5), 0 PSET (7, 5), 0 PSET (8, 6), 0 ' PSET (3, 4), 14 PSET (4, 4), 14 ' PSET (5, 4), 14 ' PSET (4, 3), 14 PSET (2, 5), 0 PSET (6, 5), 0 GET (0, 0)-(8, 9), Man& CLS 0 'Draw UFO LINE (6, 0)-(11, 0), 2 LINE (4, 1)-(13, 1), 2 LINE (4, 2)-(13, 2), 2 LINE (2, 3)-(15, 3), 2 LINE (2, 4)-(15, 4), 2 LINE (1, 5)-(16, 5), 2 LINE (1, 6)-(16, 6), 2 LINE (2, 7)-(15, 7), 2 LINE (2, 8)-(15, 8), 2 PSET (4, 9), 2 PSET (5, 9), 2 PSET (8, 9), 2 PSET (9, 9), 2 PSET (12, 9), 2 PSET (13, 9), 2 PSET (2, 5), 0 PSET (4, 5), 0 PSET (6, 5), 0 PSET (8, 5), 0 PSET (10, 5), 0 PSET (12, 5), 0 PSET (14, 5), 0 PSET (2, 6), 0 PSET (4, 6), 0 PSET (6, 6), 0 PSET (8, 6), 0 PSET (10, 6), 0 PSET (12, 6), 0 PSET (14, 6), 0 GET (0, 0)-(16, 9), Ufo1& LINE (2, 5)-(14, 6), 2, BF PSET (3, 5), 0 PSET (5, 5), 0 PSET (7, 5), 0 PSET (9, 5), 0 PSET (11, 5), 0 PSET (13, 5), 0 PSET (15, 5), 0 PSET (3, 6), 0 PSET (5, 6), 0 PSET (7, 6), 0 PSET (9, 6), 0 PSET (11, 6), 0 PSET (13, 6), 0 PSET (15, 6), 0 GET (0, 0)-(16, 9), Ufo2& CLS 0 'Draw xplode PSET (0, 0), 15 PSET (1, 1), 15 PSET (3, 3), 15 PSET (3, 0), 15 PSET (3, 1), 15 PSET (5, 1), 15 PSET (6, 1), 15 PSET (0, 3), 15 PSET (1, 3), 15 PSET (4, 3), 15 PSET (6, 3), 15 PSET (3, 4), 15 PSET (1, 5), 15 PSET (3, 5), 15 PSET (5, 5), 15 PSET (0, 6), 15 PSET (4, 6), 15 GET (0, 0)-(6, 6), Explosion& CLS 0 'Draw Barrier LINE (0, 0)-(26, 15), 10, BF LINE (10, 13)-(16, 15), 0, BF PSET (0, 0), 0 PSET (1, 0), 0 PSET (0, 1), 0 PSET (2, 0), 0 PSET (1, 1), 0 PSET (0, 2), 0 PSET (26, 0), 0 PSET (25, 0), 0 PSET (24, 0), 0 PSET (26, 1), 0 PSET (25, 1), 0 PSET (26, 2), 0 GET (0, 0)-(26, 15), Barrier& CLS 0 RETURN playinvaders: GOSUB resetscreen vadertog = vaderspeed - 1 GOSUB movevaders DO UNTIL vaderno <= vaderdead OR deadind = 1 ' move$ = INKEY$ GOSUB moveman IF laserongo THEN GOSUB killvaders END IF GOSUB moveufo GOSUB movevaders GOSUB vaderbullets GOSUB checkdead LOCATE 1, 7 IF score > hiscore THEN hiscore = score END IF PRINT "LEVEL"; level; " HI "; hiscore; " SCORE 1UP"; score; IF explodey = 1 THEN LINE (xplode, yplode)-(xplode + xfactor, yplode + yfactor), 0, BF explodey = 0 END IF LOOP CALL Delay(MilliDelay * 2000) IF deadind = 1 THEN lives = lives - 1 ELSE level = level + 1 vaderdead = 0 score = score + (level * 10) END IF IF level = 5 THEN lives = lives + 1 END IF RETURN resetscreen: CLS 0 move$ = INKEY$ move$ = INKEY$ deadind = 0 direction = 0 xman = 10 yman = 180 IF lives > 1 THEN PUT (0, 0), Man&, OR END IF IF lives > 2 THEN PUT (15, 0), Man&, OR END IF IF lives > 3 THEN PUT (30, 0), Man&, OR END IF PUT (xman, yman), Man&, OR PUT (40, 160), Barrier&, OR PUT (115, 160), Barrier&, OR PUT (190, 160), Barrier&, OR PUT (265, 160), Barrier&, OR FOR setup = 1 TO 20 Bullets&(setup, 0) = 0 Bullets&(setup, 1) = 0 Bullets&(setup, 2) = 0 Bullets&(setup, 3) = 0 NEXT setup LOCATE 1, 7 PRINT "LEVEL"; level; " HI "; hiscore; " SCORE 1UP"; score; RETURN setupscreen: CLS 0 move$ = INKEY$ move$ = INKEY$ deadind = 0 direction = 0 xman = 10 yman = 180 vaderspeed = 60 - (level * 2) vaderdead = 0 vaderno = 60 vaderfire = 140 - (level * 15) IF vaderfire < 10 THEN vaderfire = 10 END IF IF lives > 1 THEN PUT (0, 0), Man&, OR END IF IF lives > 2 THEN PUT (15, 0), Man&, OR END IF IF lives > 3 THEN PUT (30, 0), Man&, OR END IF PUT (xman, yman), Man&, OR PUT (40, 160), Barrier&, OR PUT (115, 160), Barrier&, OR PUT (190, 160), Barrier&, OR PUT (265, 160), Barrier&, OR FOR crapname = 1 TO 20 Bullets&(crapname, 0) = 0 Bullets&(crapname, 1) = 0 Bullets&(crapname, 2) = 0 Bullets&(crapname, 3) = 0 NEXT crapname LOCATE 1, 7 PRINT "LEVEL"; level; " HI "; hiscore; " SCORE 1UP"; score; RETURN govaders: xvader = 84 yvader = 8 + (level * 5) FOR doity = 1 TO 5 yvader = yvader + 16 FOR doitx = 1 TO 12 xvader = xvader + 16 doit = doit + 1 IF doit < 13 THEN PUT (xvader, yvader), Vader1&, OR ELSEIF doit < 37 THEN PUT (xvader, yvader), Vader3&, OR ELSE PUT (xvader, yvader), Vader5&, OR END IF Vaders&(doit, 0) = xvader Vaders&(doit, 1) = yvader NEXT doitx xvader = 84 NEXT doity doit = 0 RETURN moveman: IF laserongo = 1 THEN GOSUB movelaser END IF GOSUB getkeys IF KS(25) = 1 OR KS(17) = 1 THEN PUT (xman, yman), Blank&, AND xman = xman + 2 PUT (xman, yman), Man&, OR ELSEIF KS(24) = 1 OR KS(16) = 1 THEN PUT (xman, yman), Blank&, AND xman = xman - 2 IF xman < 2 THEN xman = 2 END IF PUT (xman, yman), Man&, OR END IF IF KS(57) = 1 AND laserongo = 0 THEN GOSUB blastem END IF IF xman < 2 THEN xman = 2 ELSEIF xman > 305 THEN xman = 305 END IF RETURN blastem: laserongo = 1 xlaser = xman + 5 ylaser = yman - 3 LINE (xlaser, ylaser)-(xlaser, ylaser - 3), 14 RETURN movelaser: LINE (xlaser, ylaser)-(xlaser, ylaser - 3), 0 ylaser = ylaser - 4 barriercheck = POINT(xlaser, ylaser) IF barriercheck = 10 THEN PSET (xlaser, ylaser - 2), 0 blankx = (RND * 3) blanky = (RND * 3) PSET (xlaser + blankx, ylaser - blanky), 0 blankx = (RND * 3) blanky = (RND * 3) PSET (xlaser - blankx, ylaser - blanky), 0 blankx = (RND * 3) blanky = (RND * 3) PSET (xlaser + blankx, ylaser - blanky), 0 PSET (xlaser - blankx, ylaser - blanky), 0 blankx = (RND * 3) blanky = (RND * 3) PSET (xlaser - blankx, ylaser - blanky), 0 blankx = (RND * 3) blanky = (RND * 3) PSET (xlaser + blankx, ylaser - blanky), 0 laserongo = 0 ELSE LINE (xlaser, ylaser)-(xlaser, ylaser - 3), 14 END IF IF ylaser < 6 THEN LINE (xlaser, ylaser)-(xlaser, ylaser - 3), 0 laserongo = 0 END IF RETURN moveufo: IF ufoongo = 1 THEN IF xlaser >= xufo AND xlaser <= xufo + 16 AND ylaser >= yufo AND ylaser <= yufo + 9 THEN LINE (xufo, yufo)-(xufo + 16, yufo + 9), 0, BF PUT (xufo, yufo), Explosion&, OR score = score + ufoscore ufoongo = 0 laserongo = 0 explodey = 1 xplode = xufo yplode = yufo xfaxtor = 16 yfactor = 9 END IF IF ufotog > ufospeed THEN LINE (xufo, yufo)-(xufo + 16, yufo + 9), 0, BF xufo = xufo - ufomove IF ufokoff = 1 THEN PUT (xufo, yufo), Ufo1&, OR ufokoff = 0 ELSE PUT (xufo, yufo), Ufo2&, OR ufokoff = 1 END IF IF xufo < 5 OR xufo > 300 THEN ufoongo = 0 LINE (xufo, yufo)-(xufo + 16, yufo + 9), 0, BF END IF ufotog = 0 ELSE ufotog = ufotog + 1 END IF ELSE ufogo = (RND * 1000) IF ufogo = 69 THEN ufoongo = 1 ufospeed = 3 + (RND * 10) ufoscore = 10 * (RND * 7) coin = (RND * 2) IF coin = 1 THEN ufomove = -2 xufo = 5 yufo = 10 ELSE ufomove = 2 xufo = 300 yufo = 10 END IF END IF END IF RETURN killvaders: FOR checkdead = 0 TO 72 IF Vaders&(checkdead, 0) > 0 THEN xvader = Vaders&(checkdead, 0) yvader = Vaders&(checkdead, 1) IF (xlaser >= xvader AND xlaser <= xvader + 10) AND (ylaser >= yvader AND ylaser < yvader + 8) THEN LINE (xvader, yvader)-(xvader + 11, yvader + 10), 0, BF PUT (xvader + 1, yvader + 1), Explosion&, OR explodey = 1 xplode = xvader yplode = yvader xfactor = 9 yfactor = 10 laserongo = 0 LINE (xlaser, ylaser)-(xlaser, ylaser - 4), 0 Vaders&(checkdead, 0) = 0 Vaders&(checkdead, 1) = 0 vaderdead = vaderdead + 1 score = score + 10 IF vaderspeed > 1 THEN vaderspeed = vaderspeed - 1 END IF IF vaderfire > 4 THEN vaderfire = vaderfire - 1 END IF END IF END IF NEXT checkdead RETURN movevaders: ' move all living vaders.. lowestvade = 0 dropvaders = 0 vadertog = vadertog + 1 IF vadertog > vaderspeed THEN FOR boogie = 0 TO 72 IF Vaders&(boogie, 0) < 10 AND Vaders&(boogie, 0) > 0 AND vaderdirection = 0 THEN dropvaders = 1 vaderdirection = 1 ELSEIF Vaders&(boogie, 0) > 280 AND vaderdirection = 1 THEN dropvaders = 1 vaderdirection = 0 END IF IF Vaders&(boogie, 1) > lowestvade THEN lowestvade = Vaders&(boogie, 1) END IF NEXT boogie FOR movevade = 0 TO 72 xvader = Vaders&(movevade, 0) yvader = Vaders&(movevade, 1) IF xvader > 0 AND yvader > 0 THEN PUT (xvader, yvader), Blank&, AND IF dropvaders = 1 THEN yvader = yvader + 8 ELSEIF vaderdirection = 0 THEN xvader = xvader - 4 ELSEIF vaderdirection = 1 THEN xvader = xvader + 4 END IF IF yvader > 180 THEN deadind = 1 END IF IF Vaders&(movevade, 2) = 1 THEN IF movevade < 13 THEN PUT (xvader, yvader), Vader1&, OR Vaders&(movevade, 2) = 0 ELSEIF movevade < 37 THEN PUT (xvader, yvader), Vader3&, OR Vaders&(movevade, 2) = 0 ELSE PUT (xvader, yvader), Vader5&, OR Vaders&(movevade, 2) = 0 END IF ELSE IF movevade < 13 THEN PUT (xvader, yvader), Vader2&, OR Vaders&(movevade, 2) = 1 ELSEIF movevade < 37 THEN PUT (xvader, yvader), Vader4&, OR Vaders&(movevade, 2) = 1 ELSE PUT (xvader, yvader), Vader6&, OR Vaders&(movevade, 2) = 1 END IF END IF Vaders&(movevade, 1) = yvader Vaders&(movevade, 0) = xvader IF yvader >= lowestvade - 17 THEN GOSUB firevader END IF END IF NEXT movevade vadertog = 0 ELSE ' if we aren't moving the invaders, do a wee delay thingy CALL Delay(MilliDelay * 10) END IF RETURN firevader: bullgo = 1 mibby = (RND * vaderfire) IF mibby = 5 THEN DO UNTIL Bullets&(bullgo, 0) = 0 OR bullgo > 19 bullgo = bullgo + 1 LOOP IF bullgo < 20 THEN Bullets&(bullgo, 0) = xvader + 4 Bullets&(bullgo, 1) = yvader + 8 Bullets&(bullgo, 2) = 10 + (RND * 20) - (level * 3) Bullets&(bullgo, 3) = 0 END IF END IF RETURN vaderbullets: FOR ploppy = 1 TO 20 xbullet = Bullets&(ploppy, 0) ybullet = Bullets&(ploppy, 1) thisbullspeed = Bullets&(ploppy, 2) thisbulltog = Bullets&(ploppy, 3) IF xbullet > 0 THEN IF thisbulltog > thisbullspeed THEN LINE (xbullet, ybullet)-(xbullet + 3, ybullet + 6), 0, BF ybullet = ybullet + 4 IF thisbullspeed < 20 THEN PUT (xbullet, ybullet), Bullet1&, OR ELSE PUT (xbullet, ybullet), Bullet2&, OR END IF IF xbullet + 2 >= xman AND xbullet <= xman + 8 AND ybullet + 8 >= yman THEN deadind = 1 ELSEIF ybullet > 188 THEN LINE (xbullet, ybullet)-(xbullet + 3, ybullet + 7), 0, BF xbullet = 0 ybullet = 0 ELSEIF POINT(xbullet + 1, ybullet + 9) = 10 THEN PSET (xbullet, ybullet), 0 blankx = (RND * 3) blanky = (RND * 3) PSET (xbullet + blankx, ybullet + 9 + blanky), 0 blankx = (RND * 3) blanky = (RND * 3) PSET (xbullet - blankx, (ybullet + 9) - blanky), 0 blankx = (RND * 3) blanky = (RND * 3) PSET (xbullet + blankx, ybullet + 9 + blanky), 0 PSET (xbullet - blankx, ybullet + 9 + blanky), 0 blankx = (RND * 3) blanky = (RND * 3) PSET (xbullet - blankx, (ybullet + 9) - blanky), 0 blankx = (RND * 3) blanky = (RND * 3) PSET (xbullet + blankx, ybullet + 9 + blanky), 0 LINE (xbullet, ybullet)-(xbullet + 3, ybullet + 9), 0, BF xbullet = 0 ybullet = 0 END IF Bullets&(ploppy, 0) = xbullet Bullets&(ploppy, 1) = ybullet Bullets&(ploppy, 3) = 0 ELSE Bullets&(ploppy, 3) = thisbulltog + 1 IF xbullet + 2 >= xman AND xbullet <= xman + 8 AND ybullet + 8 >= yman THEN deadind = 1 END IF END IF END IF NEXT ploppy RETURN checkdead: IF deadind = 1 THEN FOR x = 1 TO 30 CALL Delay(MilliDelay) LINE (xman, yman + 8)-(xman + 9, yman + 8), 14 FOR z = 1 TO 10 PSET (xman + xrandy1, yman + yrandy1), 0 PSET (xman + xrandy2, yman + yrandy2), 0 PSET (xman + xrandy3, yman + yrandy3), 0 PSET (xman + xrandy4, yman + yrandy4), 0 xrandy1 = (RND * 9) yrandy1 = (RND * 8) xrandy2 = (RND * 9) yrandy2 = (RND * 8) xrandy3 = (RND * 9) yrandy3 = (RND * 8) xrandy4 = (RND * 9) yrandy5 = (RND * 8) PSET (xman + xrandy1, yman + yrandy1), 14 PSET (xman + xrandy2, yman + yrandy2), 14 PSET (xman + xrandy3, yman + yrandy3), 14 PSET (xman + xrandy4, yman + yrandy4), 14 NEXT z CALL Delay(MilliDelay * 100) NEXT x END IF RETURN getkeys: I$ = INKEY$ ' So the keyb buffer doesn't get full I = INP(&H60) ' Get keyboard scan code from port 60h OUT &H61, INP(&H61) OR &H82: OUT &H20, &H20 ' KS(SC(I)) = DU(I) ' This says what keys are pressed RETURN intro: GOSUB setupscreen GOSUB govaders throw$ = INKEY$ throw$ = INKEY$ LOCATE 8, 10 PRINT " PRESS ANY KEY TO START "; DO UNTIL throw$ <> "" throw$ = INKEY$ LOOP RETURN SUB CalculateDelay Test# = 5000 ' Test variable to pass number to Subrountine StartTimer# = TIMER CALL Delay(Test#) StopTimer# = TIMER Difference# = StopTimer# - StartTimer# SecondDelay# = Test# / Difference# MilliDelay = SecondDelay# / 1000 END SUB SUB Delay (Value#) FOR A# = 1 TO Value# NEXT A# END SUB 'StillWantsToPlay: ' Determines if users want to play game again. FUNCTION StillWantsToPlay LOCATE 6, 12 PRINT "G A M E O V E R" LOCATE 8, 11 PRINT "Play Again? (Y/N)" WHILE INKEY$ <> "": WEND DO kbd$ = UCASE$(INKEY$) LOOP UNTIL kbd$ = "Y" OR kbd$ = "N" IF kbd$ = "Y" THEN StillWantsToPlay = TRUE ELSE StillWantsToPlay = FALSE END IF END FUNCTION