📄 gorilla.bas
字号:
GetNum# = VAL(Result$)
END FUNCTION
'GorillaIntro:
' Displays gorillas on screen for the first time
' allows the graphical data to be put into an array
'Parameters:
' Player1$, Player2$ - The names of the players
'
SUB GorillaIntro (Player1$, Player2$)
LOCATE 16, 34: PRINT "--------------"
LOCATE 18, 34: PRINT "V = View Intro"
LOCATE 19, 34: PRINT "P = Play Game"
LOCATE 21, 35: PRINT "Your Choice?"
DO WHILE Char$ = ""
Char$ = INKEY$
LOOP
IF Mode = 1 THEN
x = 125
y = 100
ELSE
x = 278
y = 175
END IF
SCREEN Mode
SetScreen
IF Mode = 1 THEN Center 5, "Please wait while gorillas are drawn."
VIEW PRINT 9 TO 24
IF Mode = 9 THEN PALETTE OBJECTCOLOR, BackColor
DrawGorilla x, y, ARMSDOWN
CLS 2
DrawGorilla x, y, LEFTUP
CLS 2
DrawGorilla x, y, RIGHTUP
CLS 2
VIEW PRINT 1 TO 25
IF Mode = 9 THEN PALETTE OBJECTCOLOR, 46
IF UCASE$(Char$) = "V" THEN
Center 2, "Q B A S I C G O R I L L A S"
Center 5, " STARRING: "
P$ = Player1$ + " AND " + Player2$
Center 7, P$
PUT (x - 13, y), GorD&, PSET
PUT (x + 47, y), GorD&, PSET
Rest 1
PUT (x - 13, y), GorL&, PSET
PUT (x + 47, y), GorR&, PSET
PLAY "t120o1l16b9n0baan0bn0bn0baaan0b9n0baan0b"
Rest .3
PUT (x - 13, y), GorR&, PSET
PUT (x + 47, y), GorL&, PSET
PLAY "o2l16e-9n0e-d-d-n0e-n0e-n0e-d-d-d-n0e-9n0e-d-d-n0e-"
Rest .3
PUT (x - 13, y), GorL&, PSET
PUT (x + 47, y), GorR&, PSET
PLAY "o2l16g-9n0g-een0g-n0g-n0g-eeen0g-9n0g-een0g-"
Rest .3
PUT (x - 13, y), GorR&, PSET
PUT (x + 47, y), GorL&, PSET
PLAY "o2l16b9n0baan0g-n0g-n0g-eeen0o1b9n0baan0b"
Rest .3
FOR i = 1 TO 4
PUT (x - 13, y), GorL&, PSET
PUT (x + 47, y), GorR&, PSET
PLAY "T160O0L32EFGEFDC"
Rest .1
PUT (x - 13, y), GorR&, PSET
PUT (x + 47, y), GorL&, PSET
PLAY "T160O0L32EFGEFDC"
Rest .1
NEXT
END IF
END SUB
'Intro:
' Displays game introduction
SUB Intro
SCREEN 0
WIDTH 80, 25
MaxCol = 80
COLOR 15, 0
CLS
Center 4, "Q B a s i c G O R I L L A S"
COLOR 7
Center 6, "Copyright (C) Microsoft Corporation 1990"
Center 8, "Your mission is to hit your opponent with the exploding"
Center 9, "banana by varying the angle and power of your throw, taking"
Center 10, "into account wind speed, gravity, and the city skyline."
Center 11, "The wind speed is shown by a directional arrow at the bottom"
Center 12, "of the playing field, its length relative to its strength."
Center 24, "Press any key to continue"
PLAY "MBT160O1L8CDEDCDL4ECC"
SparklePause
IF Mode = 1 THEN MaxCol = 40
END SUB
'MakeCityScape:
' Creates random skyline for game
'Parameters:
' BCoor() - a user-defined type array which stores the coordinates of
' the upper left corner of each building.
SUB MakeCityScape (BCoor() AS XYPoint)
x = 2
'Set the sloping trend of the city scape. NewHt is new building height
Slope = FnRan(6)
SELECT CASE Slope
CASE 1: NewHt = 15 'Upward slope
CASE 2: NewHt = 130 'Downward slope
CASE 3 TO 5: NewHt = 15 '"V" slope - most common
CASE 6: NewHt = 130 'Inverted "V" slope
END SELECT
IF Mode = 9 THEN
BottomLine = 335 'Bottom of building
HtInc = 10 'Increase value for new height
DefBWidth = 37 'Default building height
RandomHeight = 120 'Random height difference
WWidth = 3 'Window width
WHeight = 6 'Window height
WDifV = 15 'Counter for window spacing - vertical
WDifh = 10 'Counter for window spacing - horizontal
ELSE
BottomLine = 190
HtInc = 6
NewHt = NewHt * 20 \ 35 'Adjust for CGA
DefBWidth = 18
RandomHeight = 54
WWidth = 1
WHeight = 2
WDifV = 5
WDifh = 4
END IF
CurBuilding = 1
DO
SELECT CASE Slope
CASE 1
NewHt = NewHt + HtInc
CASE 2
NewHt = NewHt - HtInc
CASE 3 TO 5
IF x > ScrWidth \ 2 THEN
NewHt = NewHt - 2 * HtInc
ELSE
NewHt = NewHt + 2 * HtInc
END IF
CASE 4
IF x > ScrWidth \ 2 THEN
NewHt = NewHt + 2 * HtInc
ELSE
NewHt = NewHt - 2 * HtInc
END IF
END SELECT
'Set width of building and check to see if it would go off the screen
BWidth = FnRan(DefBWidth) + DefBWidth
IF x + BWidth > ScrWidth THEN BWidth = ScrWidth - x - 2
'Set height of building and check to see if it goes below screen
BHeight = FnRan(RandomHeight) + NewHt
IF BHeight < HtInc THEN BHeight = HtInc
'Check to see if Building is too high
IF BottomLine - BHeight <= MaxHeight + GHeight THEN BHeight = MaxHeight + GHeight - 5
'Set the coordinates of the building into the array
BCoor(CurBuilding).XCoor = x
BCoor(CurBuilding).YCoor = BottomLine - BHeight
IF Mode = 9 THEN BuildingColor = FnRan(3) + 4 ELSE BuildingColor = 2
'Draw the building, outline first, then filled
LINE (x - 1, BottomLine + 1)-(x + BWidth + 1, BottomLine - BHeight - 1), BACKGROUND, B
LINE (x, BottomLine)-(x + BWidth, BottomLine - BHeight), BuildingColor, BF
'Draw the windows
c = x + 3
DO
FOR i = BHeight - 3 TO 7 STEP -WDifV
IF Mode <> 9 THEN
WinColr = (FnRan(2) - 2) * -3
ELSEIF FnRan(4) = 1 THEN
WinColr = 8
ELSE
WinColr = WINDOWCOLOR
END IF
LINE (c, BottomLine - i)-(c + WWidth, BottomLine - i + WHeight), WinColr, BF
NEXT
c = c + WDifh
LOOP UNTIL c >= x + BWidth - 3
x = x + BWidth + 2
CurBuilding = CurBuilding + 1
LOOP UNTIL x > ScrWidth - HtInc
LastBuilding = CurBuilding - 1
'Set Wind speed
Wind = FnRan(10) - 5
IF FnRan(3) = 1 THEN
IF Wind > 0 THEN
Wind = Wind + FnRan(10)
ELSE
Wind = Wind - FnRan(10)
END IF
END IF
'Draw Wind speed arrow
IF Wind <> 0 THEN
WindLine = Wind * 3 * (ScrWidth \ 320)
LINE (ScrWidth \ 2, ScrHeight - 5)-(ScrWidth \ 2 + WindLine, ScrHeight - 5), ExplosionColor
IF Wind > 0 THEN ArrowDir = -2 ELSE ArrowDir = 2
LINE (ScrWidth / 2 + WindLine, ScrHeight - 5)-(ScrWidth / 2 + WindLine + ArrowDir, ScrHeight - 5 - 2), ExplosionColor
LINE (ScrWidth / 2 + WindLine, ScrHeight - 5)-(ScrWidth / 2 + WindLine + ArrowDir, ScrHeight - 5 + 2), ExplosionColor
END IF
END SUB
'PlaceGorillas:
' PUTs the Gorillas on top of the buildings. Must have drawn
' Gorillas first.
'Parameters:
' BCoor() - user-defined TYPE array which stores upper left coordinates
' of each building.
SUB PlaceGorillas (BCoor() AS XYPoint)
IF Mode = 9 THEN
XAdj = 14
YAdj = 30
ELSE
XAdj = 7
YAdj = 16
END IF
SclX# = ScrWidth / 320
SclY# = ScrHeight / 200
'Place gorillas on second or third building from edge
FOR i = 1 TO 2
IF i = 1 THEN BNum = FnRan(2) + 1 ELSE BNum = LastBuilding - FnRan(2)
BWidth = BCoor(BNum + 1).XCoor - BCoor(BNum).XCoor
GorillaX(i) = BCoor(BNum).XCoor + BWidth / 2 - XAdj
GorillaY(i) = BCoor(BNum).YCoor - YAdj
PUT (GorillaX(i), GorillaY(i)), GorD&, PSET
NEXT i
END SUB
'PlayGame:
' Main game play routine
'Parameters:
' Player1$, Player2$ - player names
' NumGames - number of games to play
SUB PlayGame (Player1$, Player2$, NumGames)
DIM BCoor(0 TO 30) AS XYPoint
DIM TotalWins(1 TO 2)
J = 1
FOR i = 1 TO NumGames
CLS
RANDOMIZE (TIMER)
CALL MakeCityScape(BCoor())
CALL PlaceGorillas(BCoor())
DoSun SUNHAPPY
Hit = FALSE
DO WHILE Hit = FALSE
J = 1 - J
LOCATE 1, 1
PRINT Player1$
LOCATE 1, (MaxCol - 1 - LEN(Player2$))
PRINT Player2$
Center 23, LTRIM$(STR$(TotalWins(1))) + ">Score<" + LTRIM$(STR$(TotalWins(2)))
Tosser = J + 1: Tossee = 3 - J
'Plot the shot. Hit is true if Gorilla gets hit.
Hit = DoShot(Tosser, GorillaX(Tosser), GorillaY(Tosser))
'Reset the sun, if it got hit
IF SunHit THEN DoSun SUNHAPPY
IF Hit = TRUE THEN CALL UpdateScores(TotalWins(), Tosser, Hit)
LOOP
SLEEP 1
NEXT i
SCREEN 0
WIDTH 80, 25
COLOR 7, 0
MaxCol = 80
CLS
Center 8, "GAME OVER!"
Center 10, "Score:"
LOCATE 11, 30: PRINT Player1$; TAB(50); TotalWins(1)
LOCATE 12, 30: PRINT Player2$; TAB(50); TotalWins(2)
Center 24, "Press any key to continue"
SparklePause
COLOR 7, 0
CLS
END SUB
'PlayGame:
' Plots banana shot across the screen
'Parameters:
' StartX, StartY - starting shot location
' Angle - shot angle
' Velocity - shot velocity
' PlayerNum - the banana thrower
FUNCTION PlotShot (StartX, StartY, Angle#, Velocity, PlayerNum)
Angle# = Angle# / 180 * pi# 'Convert degree angle to radians
Radius = Mode MOD 7
InitXVel# = COS(Angle#) * Velocity
InitYVel# = SIN(Angle#) * Velocity
oldx# = StartX
oldy# = StartY
'draw gorilla toss
IF PlayerNum = 1 THEN
PUT (StartX, StartY), GorL&, PSET
ELSE
PUT (StartX, StartY), GorR&, PSET
END IF
'throw sound
PLAY "MBo0L32A-L64CL16BL64A+"
Rest .1
'redraw gorilla
PUT (StartX, StartY), GorD&, PSET
adjust = Scl(4) 'For scaling CGA
xedge = Scl(9) * (2 - PlayerNum) 'Find leading edge of banana for check
Impact = FALSE
ShotInSun = FALSE
OnScreen = TRUE
PlayerHit = 0
NeedErase = FALSE
StartXPos = StartX
StartYPos = StartY - adjust - 3
IF PlayerNum = 2 THEN
StartXPos = StartXPos + Scl(25)
direction = Scl(4)
ELSE
direction = Scl(-4)
END IF
IF Velocity < 2 THEN 'Shot too slow - hit self
x# = StartX
y# = StartY
pointval = OBJECTCOLOR
END IF
DO WHILE (NOT Impact) AND OnScreen
Rest .02
'Erase old banana, if necessary
IF NeedErase THEN
NeedErase = FALSE
CALL DrawBan(oldx#, oldy#, oldrot, FALSE)
END IF
x# = StartXPos + (InitXVel# * t#) + (.5 * (Wind / 5) * t# ^ 2)
y# = StartYPos + ((-1 * (InitYVel# * t#)) + (.5 * gravity# * t# ^ 2)) * (ScrHeight / 350)
IF (x# >= ScrWidth - Scl(10)) OR (x# <= 3) OR (y# >= ScrHeight - 3) THEN
OnScreen = FALSE
END IF
IF OnScreen AND y# > 0 THEN
'check it
LookY = 0
LookX = Scl(8 * (2 - PlayerNum))
DO
pointval = POINT(x# + LookX, y# + LookY)
IF pointval = 0 THEN
Impact = FALSE
IF ShotInSun = TRUE THEN
IF ABS(ScrWidth \ 2 - x#) > Scl(20) OR y# > SunHt THEN ShotInSun = FALSE
END IF
ELSEIF pointval = SUNATTR AND y# < SunHt THEN
IF NOT SunHit THEN DoSun SUNSHOCK
SunHit = TRUE
ShotInSun = TRUE
ELSE
Impact = TRUE
END IF
LookX = LookX + direction
LookY = LookY + Scl(6)
LOOP UNTIL Impact OR LookX <> Scl(4)
IF NOT ShotInSun AND NOT Impact THEN
'plot it
rot = (t# * 10) MOD 4
CALL DrawBan(x#, y#, rot, TRUE)
NeedErase = TRUE
END IF
oldx# = x#
oldy# = y#
oldrot = rot
END IF
t# = t# + .1
LOOP
IF pointval <> OBJECTCOLOR AND Impact THEN
CALL DoExplosion(x# + adjust, y# + adjust)
ELSEIF pointval = OBJECTCOLOR THEN
PlayerHit = ExplodeGorilla(x#, y#)
END IF
PlotShot = PlayerHit
END FUNCTION
'Rest:
' pauses the program
SUB Rest (t#)
s# = TIMER
t2# = MachSpeed * t# / SPEEDCONST
DO
LOOP UNTIL TIMER - s# > t2#
END SUB
'Scl:
' Pass the number in to scaling for cga. If the number is a decimal, then we
' want to scale down for cga or scale up for ega. This allows a full range
' of numbers to be generated for scaling.
' (i.e. for 3 to get scaled to 1, pass in 2.9)
FUNCTION Scl (n!)
IF n! <> INT(n!) THEN
IF Mode = 1 THEN n! = n! - 1
END IF
IF Mode = 1 THEN
Scl = CINT(n! / 2 + .1)
ELSE
Scl = CINT(n!)
END IF
END FUNCTION
'SetScreen:
' Sets the appropriate color statements
SUB SetScreen
IF Mode = 9 THEN
ExplosionColor = 2
BackColor = 1
PALETTE 0, 1
PALETTE 1, 46
PALETTE 2, 44
PALETTE 3, 54
PALETTE 5, 7
PALETTE 6, 4
PALETTE 7, 3
PALETTE 9, 63 'Display Color
ELSE
ExplosionColor = 2
BackColor = 0
COLOR BackColor, 2
END IF
END SUB
'SparklePause:
' Creates flashing border for intro and game over screens
SUB SparklePause
COLOR 4, 0
A$ = "* * * * * * * * * * * * * * * * * "
WHILE INKEY$ <> "": WEND 'Clear keyboard buffer
WHILE INKEY$ = ""
FOR A = 1 TO 5
LOCATE 1, 1 'print horizontal sparkles
PRINT MID$(A$, A, 80);
LOCATE 22, 1
PRINT MID$(A$, 6 - A, 80);
FOR b = 2 TO 21 'Print Vertical sparkles
c = (A + b) MOD 5
IF c = 1 THEN
LOCATE b, 80
PRINT "*";
LOCATE 23 - b, 1
PRINT "*";
ELSE
LOCATE b, 80
PRINT " ";
LOCATE 23 - b, 1
PRINT " ";
END IF
NEXT b
NEXT A
WEND
END SUB
'UpdateScores:
' Updates players' scores
'Parameters:
' Record - players' scores
' PlayerNum - player
' Results - results of player's shot
SUB UpdateScores (Record(), PlayerNum, Results)
IF Results = HITSELF THEN
Record(ABS(PlayerNum - 3)) = Record(ABS(PlayerNum - 3)) + 1
ELSE
Record(PlayerNum) = Record(PlayerNum) + 1
END IF
END SUB
'VictoryDance:
' gorilla dances after he has eliminated his opponent
'Parameters:
' Player - which gorilla is dancing
SUB VictoryDance (Player)
FOR i# = 1 TO 4
PUT (GorillaX(Player), GorillaY(Player)), GorL&, PSET
PLAY "MFO0L32EFGEFDC"
Rest .2
PUT (GorillaX(Player), GorillaY(Player)), GorR&, PSET
PLAY "MFO0L32EFGEFDC"
Rest .2
NEXT
END SUB
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -