'=========================================================================== ' Subject: SPECTRA (LIKE GORILLAS) Date: 07-11-97 (14:11) ' Author: Kevin Weber Code: QB, QBasic, PDS ' Origin: microhof@marshallnet.com Packet: GAMES.ABC '=========================================================================== ' Spectra v1.0 ' -------------- ' This game was programmed by Kevin Weber, of Marshalltown, Iowa. ' MicroHof Programming posseses distribution and claim rights. ' Spectra is a simple game in which the object is to hit your opponent ' (computer or 2nd player) with a projectile after inputting an angle ' and a velocity. ' Kevin included several new twists on the game, including a computer ' opponent as well as simultaneous firing, allowing ties in the game. ' ' This program is available at MicroHof WebQuarters, located at : ' http://microhof.home.ml.org ' OR ' http://www.geocities.com/CapeCanaveral/6769 ' ' E-mail all comments to : microhof@marshallnet.com ' ' To run this program, hold down Shift and press F5 DIM bullet(11) bullet(0) = 4 bullet(1) = 6 bullet(2) = 12 bullet(3) = 14 bullet(4) = 10 bullet(5) = 2 bullet(6) = 1 bullet(7) = 9 bullet(8) = 5 bullet(9) = 13 SCREEN 12 RANDOMIZE TIMER COLOR 15 PRINT "Player 1, enter your name" INPUT pan$ pan$ = LEFT$(pan$, 8) fan$ = pan$ + ".ply" OPEN fan$ FOR APPEND AS #1 FOR yu = 1 TO 3 q = 0 WRITE #1, q NEXT yu CLOSE #1 OPEN fan$ FOR INPUT AS #1 INPUT #1, a winsa = a INPUT #1, a lossesa = a INPUT #1, a tiesa = a CLOSE #1 computer = 0 PRINT "Player 2, enter your name" COLOR 8 PRINT " If you want a computer opponent, type" PRINT " compute and then a number. The lower the" PRINT " number, the higher the skill. (Max of 9)" COLOR 15 INPUT pbn$ pbn$ = LEFT$(pbn$, 8) IF UCASE$(LEFT$(pbn$, 7)) = "COMPUTE" THEN computer = 1 skill = 5 g = VAL(RIGHT$(pbn$, 1)) IF g > 0 THEN skill = g fbn$ = pbn$ + ".ply" OPEN fbn$ FOR APPEND AS #1 q = 0 FOR yu = 1 TO 3 WRITE #1, q NEXT yu CLOSE #1 OPEN fbn$ FOR INPUT AS #1 INPUT #1, a winsb = a INPUT #1, a lossesb = a INPUT #1, a tiesb = a CLOSE #1 PRINT "OK. How many matches do you want to play?" INPUT games CLS ties = 0 total = 0 sa = 0 sb = 0 detail = 5000 size = 15 guntrail = 20 10 'new level shots = 0 amount = (skill ^ 1.5) ^ (.75 ^ shots) hillloc = INT(RND(1) * 100) + 270 b = RND * 2 / 25 + .02 h = INT(RND(1) * 300) + 100 wind = INT(RND(1) * 100) - 50 IF wind = 0 THEN wind = 1 wn = (wind / ABS(wind)) * 4 neg = INT(RND(1) * 2) * 2 - 1 FOR x = 1 TO 640 y = h / (2 + (1 + b * neg) ^ (x - hillloc)) + 400 - h / 2 LINE (x, y)-(x, 480), 2 LINE (x, y)-(x, y + 1), 10 NEXT x LINE (320, 460)-(320 + wind, 460) LINE (320 + wind, 460)-(320 - wn + wind, 456) LINE (320 + wind, 460)-(320 - wn + wind, 464) pax = INT(RND(1) * 50) + 50 pay = h / (2 + (1 + b * neg) ^ (pax - hillloc)) + 400 - h / 2 - size pbx = INT(RND(1) * 50) + 540 pby = h / (2 + (1 + b * neg) ^ (pbx - hillloc)) + 400 - h / 2 - size LINE (pax - size, pay - size)-(pax + size, pay + size), 15, BF LINE (pax - size + 2, pay - size + 2)-(pax + size - 2, pay + size), 12, BF LINE (pax - size + 4, pay - size + 4)-(pax + size - 4, pay + size), 4, BF LINE (pbx - size, pby - size)-(pbx + size, pby + size), 15, BF LINE (pbx - size + 2, pby - size + 2)-(pbx + size - 2, pby + size), 9, BF LINE (pbx - size + 4, pby - size + 4)-(pbx + size - 4, pby + size), 1, BF GOSUB 20 33 'shot a LOCATE 1, 1 PRINT "Player 1, your angle" INPUT paa# IF paa# > 360 OR paa# < 0 THEN GOSUB 20: GOTO 33 21 'a2 LOCATE 3, 1 PRINT "Player 1, your velocity" INPUT pab IF pab > 360 OR pab < 0 THEN GOSUB 20: GOTO 21 22 'player 2 shot redo LOCATE 5, 1 IF computer = 0 THEN PRINT "Player 2, your angle" INPUT pba# IF pba# > 360 OR pba# < 0 THEN GOSUB 20: GOTO 22 23 'b2 LOCATE 7, 1 PRINT "Player 2, your velocity" INPUT pbb IF pbb > 360 OR pbb < 0 THEN GOSUB 20: GOTO 23 END IF IF computer = 1 THEN vv = 70 distvert = (pay - pby) time = (70 + (4900 + 20 * distvert) ^ .5) / 10 windtake = .03 * wind * time ^ 2 dist = pax - pbx - windtake + size hv = dist / time pbh = hv pbv = vv xoff = RND * amount * 2 - amount yoff = RND * amount * 2 - amount PRINT xoff, yoff pbh = pbh + xoff pbv = pbv + yoff END IF pba# = 180 - pba# pah = pab * COS(paa# / 57.3) pav = pab * SIN(paa# / 57.3) IF computer = 0 THEN pbh = pbb * COS(pba# / 57.3) pbv = pbb * SIN(pba# / 57.3) END IF t = 0 pha = 0 phb = 0 sha = 0 shb = 0 shga = 0 shgb = 0 tstep = .04 gobacka = 1 gobackb = 1 PLAY "MFO0L32EFGEFDC" 100 'shot retry ot = t - tstep * guntrail sax = pah * t + wind * .03 * t ^ 2 + pax + size say = 5 * t ^ 2 - pav * t + pay - size sbx = pbh * t + wind * .03 * t ^ 2 + pbx - size sby = 5 * t ^ 2 - pbv * t + pby - size osax = pah * ot + wind * .03 * ot ^ 2 + pax + size osay = 5 * ot ^ 2 - pav * ot + pay - size osbx = pbh * ot + wind * .03 * ot ^ 2 + pbx - size osby = 5 * ot ^ 2 - pbv * ot + pby - size col = bullet(((t / 4) / tstep) MOD 10) IF sha = 0 THEN PSET (sax, say), col IF shb = 0 THEN PSET (sbx, sby), col IF sha = 0 AND t / tstep > guntrail THEN PSET (osax, osay), 0 IF shb = 0 AND t / tstep > guntrail THEN PSET (osbx, osby), 0 t = t + tstep IF ABS(pax - sax) < size AND ABS(pay - say) < size THEN sha = 1 pha = 1 IF gobacka = 1 THEN bx = pax: by = pay: gobacka = 0: GOSUB 2000 END IF IF ABS(pax - sbx) < size AND ABS(pay - sby) < size THEN shb = 1 pha = 1 IF gobacka = 1 THEN bx = pax: by = pay: gobacka = 0: GOSUB 2000 END IF IF ABS(pbx - sax) < size AND ABS(pby - say) < size THEN sha = 1 phb = 1 IF gobackb = 1 THEN bx = pbx: by = pby: gobackb = 0: GOSUB 2000 END IF IF ABS(pbx - sbx) < size AND ABS(pby - sby) < size THEN shb = 1 phb = 1 IF gobackb = 1 THEN bx = pbx: by = pby: gobackb = 0: GOSUB 2000 END IF ga = h / (2 + (1 + b * neg) ^ (sax - hillloc)) + 400 - h / 2 gb = h / (2 + (1 + b * neg) ^ (sbx - hillloc)) + 400 - h / 2 IF say > ga THEN sha = 1 IF sby > gb THEN shb = 1 IF sha = 1 AND shga = 0 THEN FOR hg = 1 TO guntrail osax = pah * ot + wind * .03 * ot ^ 2 + pax + size osay = 5 * ot ^ 2 - pav * ot + pay - size PSET (osax, osay), 0 shga = 1 ot = ot + tstep NEXT hg END IF IF shb = 1 AND shgb = 0 THEN FOR hg = 1 TO guntrail osbx = pbh * ot + wind * .03 * ot ^ 2 + pbx - size osby = 5 * ot ^ 2 - pbv * ot + pby - size PSET (osbx, osby), 0 shgb = 1 ot = ot + tstep NEXT hg END IF IF sha + shb < 2 THEN GOTO 100 GOSUB 20 IF pha + phb < 1 THEN GOTO 33 total = total + 1 sa = sa + phb sb = sb + pha IF pha + phb = 2 THEN ties = ties + 1 IF total < games THEN CLS : GOTO 10 GOTO 1000 20 'erase LINE (0, 0)-(300, 150), 0, BF COLOR 15 RETURN 1000 'end of game winsa = winsa + sa - ties winsb = winsb + sb - ties lossesa = lossesa + sb - ties lossesb = lossesb + sa - ties tiesa = tiesa + ties tiesb = tiesb + ties CLS totala = winsa + lossesa + tiesa totalb = winsb + lossesb + tiesb IF sa > sb THEN PRINT pan$; " wins" IF sb > sa THEN PRINT pbn$; " wins" IF sa = sb THEN PRINT "It's a stalemate!" PRINT sa; " to "; sb PRINT PRINT "-------------------------" PRINT PRINT "Stats for "; pan$ PRINT PRINT "Wins : "; winsa PRINT "Losses : "; lossesa PRINT "Ties : "; tiesa PRINT "Skill Level : "; INT((winsa + tiesa / 2) / totala ^ .8 * 50) PRINT PRINT PRINT "Stats for "; pbn$ PRINT PRINT "Wins : "; winsb PRINT "Losses : "; lossesb PRINT "Ties : "; tiesb PRINT "Skill Level : "; INT((winsb + tiesb / 2) / totala ^ .8 * 50) IF UCASE$(LEFT$(pbn$, 7)) = "COMPUTE" THEN GOTO 1432 OPEN fan$ FOR OUTPUT AS #1 WRITE #1, winsa WRITE #1, lossesa WRITE #1, tiesa CLOSE #1 1432 'We skipped ya, player 1 OPEN fbn$ FOR OUTPUT AS #1 WRITE #1, winsb WRITE #1, lossesb WRITE #1, tiesb CLOSE #1 END 2000 'blowup PLAY "MBO0L32EFGEFDC" FOR rad# = 1 TO size * 1.5 COLOR ((rad# MOD 2) * 2 + 4) CIRCLE (bx, by), rad# CIRCLE (bx + 1, by), rad# CIRCLE (bx + 1, by), rad# IF rad# < size * 1.5 THEN FOR y = 1 TO 600 NEXT y END IF NEXT rad# COLOR 15 RETURN