'TANKWAR.BAS - from http://www.qbasic.com 'By Stinky (gnvqit980002@coleg-powys.ac.uk) ' TIMER ON ts = TIMER FOR s = 1 TO 1000 STEP .1 ss = SIN(s) NEXT s ts = TIMER - ts speed = CINT((ts / .269531) * 10000) / 10000 speed = speed * .6 clr = 63 SCREEN 9 COLOR 1, 15 PAINT (320, 240), 15, 15 INPUT "player 1 name"; plr1$ INPUT "player 2 name"; plr2$ snd: i$ = INKEY$ IF i$ <> "" THEN IF ASC(i$) = 27 THEN SYSTEM LOCATE 3, 1: PRINT "sound on?" IF LCASE$(i$) = "y" THEN snd = 1: GOTO begin IF LCASE$(i$) = "n" THEN snd = 0: GOTO begin GOTO snd begin: COLOR 15 SCREEN 12 CLS en1 = 20 en2 = 20 DIM expl(5, 8) DIM expl2(2, 8) tank = 0 c = 1 CONST pi = 3.141593 bom$ = "hl4d3r4e " bit$ = "g2f2e2h2" boom$ = "c4bl6e2u2r2e2f2r2d2f2g2d2l2g2h2l2u2h2br6p4,4c14bl3eurefrdfgdlghluhbr3s4p14,14" arrow$ = "ta0c1h5u2r2u10r6d10r2d2g5bu4p1,1" tank$ = "l7h2u2e2r14f2d2g2l11bu6u3er6fd3rg2df2l10e2uh2" RANDOMIZE TIMER by2 = 240 y = 240 lscape: yr = 80 * RND(1) xr = 6 * RND(1) FOR la = 0 TO 6.283 STEP .1 by = y + SIN(la) * yr x = x + xr FOR p = 1 TO 5 LINE (x, by + p)-(x2, by2 + p), 2 NEXT p sy = (480 - by) * RND(1) PSET (x, by + sy), 2 by2 = by: x2 = x IF x > 640 THEN GOTO fin NEXT la GOTO lscape fin: FOR d = 0 TO 30 STEP speed PALETTE 8, INT(d) PAINT (320, 470), 8, 2 NEXT FOR skel = 1 TO 5 sk: sx = INT(640 * RND(1)) sy = INT(100 * RND(1)) + 300 IF POINT(sx, sy) <> 8 THEN GOTO sk PSET (sx, sy), 7: DRAW "c7dfr2dr2u6r2d8r2u8r2d8r2u6r2d3m+9,+2" PSET (sx, sy), 7: DRAW "c7u2er2f2d4g4br15h4" NEXT LINE (1, 440)-(320, 460), 0, BF LINE (0, 439)-(321, 461), 2, B LINE (400, 420)-(500, 430), 6, BF LINE (400, 433)-(500, 445), 6, BF LINE (399, 419)-(501, 431), 2, B LINE (399, 433)-(501, 445), 2, B LINE (350 + en1 * 5, 420)-(450, 430), 0, BF LINE (350 + en2 * 5, 433)-(450, 445), 0, BF COLOR 2 LOCATE 27, 65: PRINT plr1$ LOCATE 28, 65: PRINT plr2$ tank2: tx = INT(620 * RND(1)) + 10 FOR ty = 200 TO 480 IF POINT(tx, ty) > 0 THEN GOTO start NEXT ty start: IF tank = 1 AND plr = 0 THEN IF SQR(((tx - qx) * (tx - qx)) + ((ty - qy) * (ty - qy))) < 200 THEN GOTO tank2 ELSE plr = 1 drw: FOR fobj = ty - 20 TO 480 ft% = POINT(tx + 5 + (12 * SIN(ang + 1.570796)), fobj) IF ft% > 0 THEN GOTO bk NEXT fobj bk: FOR bobj = ty - 20 TO 480 bk% = POINT(tx - 5 - (12 * SIN(ang + 1.570796)), bobj) IF bk% > 0 THEN GOTO calc NEXT bobj calc: ang = -ATN((fobj - bobj) / ((tx + 12) - (tx - 12))) ta$ = "ta" + STR$(INT(ang / (pi / 180))) ty = ((bobj + fobj) / 2) tch: IF POINT(tx, ty) > 0 THEN ty = ty - 2: GOTO tch IF POINT(tx, ty + 2) = 0 THEN ty = ty + 2: GOTO tch IF tank = 1 THEN x = tx: y = ty: a$ = ta$ IF tank = 0 AND plr = 0 THEN tank = 1: qx = tx: qy = ty: qa$ = ta$: GOTO tank2 IF tank = 0 AND plr > 0 THEN tank = 1: qx = tx: qy = ty: qa$ = ta$: tx = x: ty = y: GOTO drw: PSET (qx, qy) DRAW "c11" + STR$(c) + qa$ + tank$ PSET (x, y) DRAW "c12" + STR$(c) + a$ + tank$ game: IF plr = 1 THEN arx = qx: ary = qy - 20: ang$ = qa$: nary = y - 20: narx = x: plr$ = plr1$ IF plr = 2 THEN arx = x: ary = y - 20: ang$ = a$: nary = qy - 20: narx = qx: plr$ = plr2$ by = ary + 20: bx = arx COLOR 12 LOCATE 25, 7: PRINT "WIND" LOCATE 27, 35: PRINT "POWER" wind = ((RND(1) - .5) / 60) * speed LINE (20, 400)-(120, 410), 0, BF LINE (19, 399)-(121, 411), 10, B FOR w = 1 TO wind * 5000 / speed STEP (wind * 3) * speed LINE (70, 400)-(70 + w, 405), 12 LINE (70, 410)-(70 + w, 405), 12 LINE (70, 400)-(70, 410), 10 NEXT w arrow: FOR ac = 63 TO 1 STEP -speed PALETTE 1, ac LINE (narx - 5, nary)-(narx + 5, nary - 20), 0, BF PRESET (arx, ary), 0 DRAW arrow$ LOCATE INT((30 / 480) * ary) - 3, INT((80 / 640) * arx) COLOR 1 PRINT plr$ COLOR 0 LOCATE INT((30 / 480) * nary) - 3, INT((80 / 640) * narx) PRINT plr2$ i$ = INKEY$ IF i$ <> "" THEN IF ASC(i$) = 27 THEN SYSTEM IF i$ <> "" THEN GOTO cont NEXT GOTO arrow cont: PALETTE 1, 0 PSET (arx, ary), 0 DRAW arrow$ LINE (arx - 5, ary)-(arx + 5, ary - 20), 0, BF LOCATE INT((30 / 480) * ary) - 3, INT((80 / 640) * arx) COLOR 0 PRINT plr$ ang$ = RIGHT$(ang$, 3) ang = VAL(ang$) * (pi / 180) gx = bx + COS(-ang - pi / 2) * 10 gy = by + SIN(-ang - pi / 2) * 10 a = ang COLOR 11 gun: bx2 = bx: by2 = by bx = gx + COS(-a) * 14 by = gy + SIN(-a) * 14 LINE (gx, gy)-(bx, by), 15 IF bx2 <> bx OR by2 <> by THEN LINE (gx, gy)-(bx2, by2), 0 i$ = INKEY$ IF i$ <> "" THEN IF ASC(i$) = 27 THEN SYSTEM IF i$ = "8" THEN a = a + .1 * speed IF i$ = "2" THEN a = a - .1 * speed LOCATE 27, 1: PRINT "ANGLE:"; INT((a / (pi / 180))) IF i$ = " " THEN bx = gx + COS(-a) * 12: by = gy + SIN(-a) * 12: LINE (gx, gy)-(bx2, by2), 0: GOTO shoot IF LCASE$(i$) = "t" THEN GOTO tport IF (a - ang) < 0 THEN a = a + .1 * speed IF (a - ang) > pi THEN a = a - .1 * speed GOTO gun shoot: i$ = INKEY$ IF i$ <> "" THEN IF ASC(i$) = 27 THEN SYSTEM IF pwr > 320 OR i$ = " " THEN byv = (SIN(a) * pwr / 750) * speed: bxv = (COS(a) * pwr / 750) * speed IF pwr > 320 OR i$ = " " THEN IF snd = 1 THEN SOUND 200, 2 IF pwr > 320 OR i$ = " " THEN drag = bxv + wind: GOTO fire pwr = pwr + .15 * speed LINE (1, 440)-(pwr, 460), c, BF c = 2 IF pwr > 100 THEN c = 12 IF pwr > 250 THEN c = 4 GOTO shoot: fire: bx2 = bx: by2 = by bx = bx + bxv bxv = bxv + wind / 100 IF bxv = drag THEN wind = 0 by = by - byv byv = byv - (.0002 * speed) IF bxv <> 0 AND byv <> 0 THEN ag = ATN(byv / bxv) + pi / 2 IF bxv < 0 THEN ag = ag + pi ag2$ = ag$ ag$ = "ta" + STR$(INT((ag - (pi / 2)) / (pi / 180))) PSET (bx, by), 13: DRAW ag$ + bom$ IF bx <> bx2 THEN PRESET (bx2, by2), 0: DRAW ag2$ + bom$ IF bx > 640 OR bx < 0 OR by > 420 OR POINT(bx + SIN(ag) * 4, by + COS(ag) * 4) > 0 THEN GOTO expl GOTO fire expl: i$ = INKEY$: IF i$ <> "" THEN GOTO expl IF bx > 640 THEN bx = 639 IF bx < 0 THEN bx = 1 IF snd = 1 THEN SOUND 100, 2 FOR boom = 4 TO 8 STEP 2 * speed PSET (bx, by + 10), 0 DRAW "s" + STR$(INT(boom)) + "ta" + STR$(INT(boom * 44)) + boom$ FOR del = 1 TO 5000: NEXT del CIRCLE (bx, by + 10), boom * 1.5, 0 PAINT (bx, by + 10), 0, 0 NEXT pwr = 0 LINE (1, 440)-(320, 460), 0, BF FOR shp = 1 TO 5 expl(1, shp) = bx expl(2, shp) = by expl(3, shp) = ((RND(1) - .5) / 2) * speed expl(4, shp) = (-RND(1) - .25) * speed expl(5, shp) = CINT(5 * RND(1)) + 7 NEXT shp erk: FOR xpl = 1 TO 5 expl(1, xpl) = expl(1, xpl) + expl(3, xpl) expl(2, xpl) = expl(2, xpl) + expl(4, xpl) expl(4, xpl) = expl(4, xpl) + .004 * speed PSET (expl(1, xpl), expl(2, xpl)), expl(5, xpl) DRAW bit$ PRESET (expl2(1, xpl), expl2(2, xpl)), 0 DRAW bit$ expl2(1, xpl) = expl(1, xpl) expl2(2, xpl) = expl(2, xpl) IF POINT(expl(1, xpl) + 4, expl(2, xpl) + 6) > 0 OR expl(2, xpl) > 400 OR expl(1, xpl) > 640 OR expl(1, xpl) < 0 THEN expl(3, xpl) = 0: expl(4, xpl) = 0: expl(5, xpl) = 1 IF expl(5, 1) = 1 AND expl(5, 2) = 1 AND expl(5, 3) = 1 AND expl(5, 4) = 1 AND expl(5, 5) = 1 THEN PRESET (expl(1, xpl), expl(2, xpl)), 0: DRAW bit$: gy% = by: GOTO ground NEXT GOTO erk ground: FOR gx = bx - 25 TO bx + 25 FOR gy = by + 25 TO by - 100 STEP -1 ns: gd% = POINT(gx, gy) IF gd% > 0 AND gd% < 15 THEN GOTO fall NEXT NEXT GOTO plr fall: FOR fall% = gy TO 420 PSET (gx, fall%), 0: PSET (gx, fall% + 1), gd%: ld% = POINT(gx, fall% + 2): IF ld% > 0 AND ld% < 15 THEN GOTO ns NEXT fall% plr: dist1 = SQR(((qx - bx) * (qx - bx)) + ((qy - by) * (qy - by))) dist2 = SQR(((x - bx) * (x - bx)) + ((y - by) * (y - by))) IF dist1 / 100 THEN en1 = en1 - (1 / (dist1 / 100)) IF dist2 / 100 THEN en2 = en2 - (1 / (dist2 / 100)) IF en < 0 THEN en = 0 IF en2 < 0 THEN en2 = 0 LINE (400 + en1 * 5, 420)-(500, 430), 0, BF LINE (400 + en2 * 5, 433)-(500, 445), 0, BF LINE (399, 419)-(501, 431), 2, B LINE (399, 433)-(501, 446), 2, B IF en2 = 0 AND en1 = 0 THEN dr = 1: GOTO win IF en1 <= 0 THEN dx = qx: dy = qy - 10: dang$ = qang$: winner$ = plr2$: loser$ = plr1$: GOTO dead IF en2 <= 0 THEN dx = x: dy = y - 10: dang$ = ang$: winner$ = plr1$: loser$ = plr2$: GOTO dead GOTO xtport: tport: IF plr = 1 THEN PRESET (qx, qy): DRAW "c0" + qa$ + tank$: ELSE PRESET (x, y): DRAW "c0" + a$ + tank$ LINE (gx, gy)-(bx, by), 0 px = INT(620 * RND(1)) + 10 IF snd = 1 THEN PLAY "l32o6cf<gc>g" FOR py = 160 TO 480 IF POINT(px, py + 5) > 0 THEN GOTO mov NEXT mov: FOR cl = 1 TO 63 STEP 2 PALETTE 4, 64 - cl CIRCLE (gx, gy - 5), 11 - cl2 / 6, 0 PAINT (gx, gy - 5), 0, 0 CIRCLE (gx, gy - 5), 11 - cl / 6, 4 PAINT (gx, gy - 5), 4, 4 PALETTE 4, cl CIRCLE (px, py - 5), (cl / 6) + 1, 0 CIRCLE (px, py - 5), cl / 6, 4 PAINT (px, py - 5), 4, 4 CIRCLE (px, py - 5), cl / 6, 4 cl2 = cl NEXT CIRCLE (px, py - 5), (cl / 6), 0 PAINT (px, py - 4), 0, 0 PSET (gx, gy - 5), 0 PAINT (gx, gy - 5), 0, 0 IF plr = 1 THEN qx = px: qy = py: ELSE x = px: y = py xtport: PRESET (qx, qy) DRAW "c0" + qa$ + tank$ PRESET (x, y) DRAW "c0" + a$ + tank$ IF plr = 1 THEN plr = 2: tank = 0: tx = qx: ty = qy: GOTO drw IF plr = 2 THEN plr = 1: tank = 0: tx = qx: ty = qy: GOTO drw dead: FOR f = 1 TO 3 FOR d = 1 TO 63 STEP 5 * speed PALETTE 1, d IF snd = 1 THEN SOUND 37 + 20 * d, 1 LINE (dx - 7, dy - 10)-(dx + 7, dy - 25), 0, BF PSET (dx, dy + 10), 1 DRAW "ta" + dang$ + tank$ NEXT NEXT PRESET (dx, dy + 10), 0 DRAW "ta" + dang$ + tank$ FOR shp = 1 TO 8 expl(1, shp) = dx expl(2, shp) = dy expl(3, shp) = (RND(1) - .5) * 4 expl(4, shp) = (-RND(1) - 1) * 2 expl(5, shp) = 3 NEXT shp cr = 64 IF snd = 0 THEN GOTO derk FOR blw = 1 TO 5 SOUND 200, 1 SOUND 37, 1 NEXT derk: cr = cr - .5 PALETTE 3, INT(cr) FOR xpl = 1 TO 8 expl(1, xpl) = expl(1, xpl) + expl(3, xpl) expl(2, xpl) = expl(2, xpl) + expl(4, xpl) expl(4, xpl) = expl(4, xpl) + .04 PSET (expl(1, xpl), expl(2, xpl)), 3 1 DRAW bit$ expl2(1, xpl) = expl(1, xpl) expl2(2, xpl) = expl(2, xpl) IF cr = 1 THEN GOTO win NEXT GOTO derk win: SLEEP 1 CLS COLOR 15 FOR cl = 1 TO 63 STEP 2 * speed PALETTE 2, cl COLOR 2 IF dr = 0 THEN LOCATE 10, 30: PRINT winner$ + " wins the game. Another game(y/n)?" IF dr = 1 THEN LOCATE 10, 30: PRINT "round drawn: Another game?(y/n)" i$ = INKEY$ IF i$ <> "" THEN IF ASC(i$) = 27 THEN SYSTEM IF LCASE$(i$) = "y" OR LCASE$(i$) = "n" THEN GOTO dec NEXT GOTO win dec: IF LCASE$(i$) = "y" THEN RUN SYSTEM