mirror of
https://github.com/QB64-Phoenix-Edition/QB64pe.git
synced 2024-08-31 11:10:16 +00:00
778 lines
22 KiB
QBasic
778 lines
22 KiB
QBasic
'
|
|
' Q B a s i c N i b b l e s
|
|
'
|
|
' Copyright (C) Microsoft Corporation 1990
|
|
'
|
|
' Nibbles is a game for one or two players. Navigate your snakes
|
|
' around the game board trying to eat up numbers while avoiding
|
|
' running into walls or other snakes. The more numbers you eat up,
|
|
' the more points you gain and the longer your snake becomes.
|
|
'
|
|
' To run this game, press Shift+F5.
|
|
'
|
|
' To exit QBasic, press Alt, F, X.
|
|
'
|
|
' To get help on a BASIC keyword, move the cursor to the keyword and press
|
|
' F1 or click the right mouse button.
|
|
'
|
|
|
|
|
|
'Set default data type to integer for faster game play
|
|
DEFINT A-Z
|
|
|
|
'User-defined TYPEs
|
|
TYPE snakeBody
|
|
row AS INTEGER
|
|
col AS INTEGER
|
|
END TYPE
|
|
|
|
'This type defines the player's snake
|
|
TYPE snaketype
|
|
head AS INTEGER
|
|
length AS INTEGER
|
|
row AS INTEGER
|
|
col AS INTEGER
|
|
direction AS INTEGER
|
|
lives AS INTEGER
|
|
score AS INTEGER
|
|
scolor AS INTEGER
|
|
alive AS INTEGER
|
|
END TYPE
|
|
|
|
'This type is used to represent the playing screen in memory
|
|
'It is used to simulate graphics in text mode, and has some interesting,
|
|
'and slightly advanced methods to increasing the speed of operation.
|
|
'Instead of the normal 80x25 text graphics using chr$(219) "Û", we will be
|
|
'using chr$(220)"Ü" and chr$(223) "ß" and chr$(219) "Û" to mimic an 80x50
|
|
'pixel screen.
|
|
'Check out sub-programs SET and POINTISTHERE to see how this is implemented
|
|
'feel free to copy these (as well as arenaType and the DIM ARENA stmt and the
|
|
'initialization code in the DrawScreen subprogram) and use them in your own
|
|
'programs
|
|
TYPE arenaType
|
|
realRow AS INTEGER 'Maps the 80x50 point into the real 80x25
|
|
acolor AS INTEGER 'Stores the current color of the point
|
|
sister AS INTEGER 'Each char has 2 points in it. .SISTER is
|
|
END TYPE '-1 if sister point is above, +1 if below
|
|
|
|
'Sub Declarations
|
|
DECLARE SUB Intro ()
|
|
DECLARE SUB SpacePause (text$)
|
|
DECLARE SUB PrintScore (numplayers%, score1%, score2%, lives1%, lives2%)
|
|
|
|
DECLARE SUB GetInputs (numplayers, speed, diff$, monitor$)
|
|
DECLARE SUB DrawScreen ()
|
|
DECLARE SUB PlayNibbles (numplayers, speed, diff$)
|
|
DECLARE SUB Set (row, col, acolor)
|
|
DECLARE SUB Center (row, text$)
|
|
DECLARE SUB DoIntro ()
|
|
DECLARE SUB Initialize ()
|
|
DECLARE SUB SparklePause ()
|
|
DECLARE SUB Level (WhatToDO, sammy() AS snaketype)
|
|
DECLARE SUB InitColors ()
|
|
DECLARE SUB EraseSnake (snake() AS ANY, snakeBod() AS ANY, snakeNum%)
|
|
DECLARE FUNCTION StillWantsToPlay ()
|
|
DECLARE FUNCTION PointIsThere (row, col, backColor)
|
|
|
|
'Constants
|
|
'CONST TRUE = -1
|
|
'CONST FALSE = NOT TRUE
|
|
'CONST MAXSNAKELENGTH = 1000
|
|
'CONST STARTOVER = 1 ' Parameters to 'Level' SUB
|
|
'CONST SAMELEVEL = 2
|
|
'CONST NEXTLEVEL = 3
|
|
DIM SHARED TRUE AS INTEGER
|
|
DIM SHARED FALSE AS INTEGER
|
|
DIM SHARED MAXSNAKELENGTH AS INTEGER
|
|
DIM SHARED STARTOVER AS INTEGER
|
|
DIM SHARED SAMELEVEL AS INTEGER
|
|
DIM SHARED NEXTLEVEL AS INTEGER
|
|
|
|
TRUE = -1
|
|
FALSE = NOT TRUE
|
|
MAXSNAKELENGTH = 1000
|
|
STARTOVER = 1
|
|
SAMELEVEL = 2
|
|
NEXTLEVEL = 3
|
|
|
|
|
|
'Global Variables
|
|
DIM SHARED arena(1 TO 50, 1 TO 80) AS arenaType
|
|
DIM SHARED curLevel, colorTable(10)
|
|
|
|
|
|
|
|
RANDOMIZE TIMER
|
|
GOSUB ClearKeyLocks
|
|
|
|
Intro
|
|
GetInputs numplayers, speed, diff$, monitor$
|
|
|
|
|
|
GOSUB SetColors
|
|
|
|
DrawScreen
|
|
|
|
|
|
|
|
DO
|
|
PlayNibbles numplayers, speed, diff$
|
|
LOOP WHILE StillWantsToPlay
|
|
|
|
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:
|
|
IF monitor$ = "M" THEN
|
|
RESTORE mono
|
|
ELSE
|
|
RESTORE normal
|
|
END IF
|
|
|
|
FOR a = 1 TO 6
|
|
READ colorTable(a)
|
|
NEXT a
|
|
RETURN
|
|
|
|
'snake1 snake2 Walls Background Dialogs-Fore Back
|
|
mono: DATA 15,7,7,0,15,0
|
|
normal: DATA 14,13,12,1,15,4
|
|
END
|
|
|
|
'Center:
|
|
' Centers text on given row
|
|
SUB Center (row, text$)
|
|
LOCATE row, 41 - LEN(text$) / 2
|
|
PRINT text$;
|
|
END SUB
|
|
|
|
'DrawScreen:
|
|
' Draws playing field
|
|
SUB DrawScreen
|
|
|
|
'initialize screen
|
|
VIEW PRINT
|
|
COLOR colorTable(1), colorTable(4)
|
|
CLS
|
|
|
|
'Print title & message
|
|
Center 1, "Nibbles!"
|
|
Center 11, "Initializing Playing Field..."
|
|
|
|
'Initialize arena array
|
|
FOR row = 1 TO 50
|
|
FOR col = 1 TO 80
|
|
arena(row, col).realRow = INT((row + 1) / 2)
|
|
arena(row, col).sister = (row MOD 2) * 2 - 1
|
|
NEXT col
|
|
NEXT row
|
|
|
|
END SUB
|
|
|
|
'EraseSnake:
|
|
' Erases snake to facilitate moving through playing field
|
|
SUB EraseSnake (snake() AS snaketype, snakeBod() AS snakeBody, snakeNum)
|
|
|
|
FOR c = 0 TO 9
|
|
FOR b = snake(snakeNum).length - c TO 0 STEP -10
|
|
tail = (snake(snakeNum).head + MAXSNAKELENGTH - b) MOD MAXSNAKELENGTH
|
|
Set snakeBod(tail, snakeNum).row, snakeBod(tail, snakeNum).col, colorTable(4)
|
|
NEXT b
|
|
NEXT c
|
|
|
|
END SUB
|
|
|
|
'GetInputs:
|
|
' Gets player inputs
|
|
SUB GetInputs (numplayers, speed, diff$, monitor$)
|
|
|
|
COLOR 7, 0
|
|
CLS
|
|
|
|
DO
|
|
LOCATE 5, 47: PRINT SPACE$(34);
|
|
LOCATE 5, 20
|
|
INPUT "How many players (1 or 2)"; num$
|
|
LOOP UNTIL VAL(num$) = 1 OR VAL(num$) = 2
|
|
numplayers = VAL(num$)
|
|
|
|
LOCATE 8, 21: PRINT "Skill level (1 to 100)"
|
|
LOCATE 9, 22: PRINT "1 = Novice"
|
|
LOCATE 10, 22: PRINT "90 = Expert"
|
|
LOCATE 11, 22: PRINT "100 = Twiddle Fingers"
|
|
LOCATE 12, 15: PRINT "(Computer speed may affect your skill level)"
|
|
DO
|
|
LOCATE 8, 44: PRINT SPACE$(35);
|
|
LOCATE 8, 43
|
|
INPUT gamespeed$
|
|
LOOP UNTIL VAL(gamespeed$) >= 1 AND VAL(gamespeed$) <= 100
|
|
speed = VAL(gamespeed$)
|
|
|
|
speed = (100 - speed) * 5 + 1
|
|
|
|
DO
|
|
LOCATE 15, 56: PRINT SPACE$(25);
|
|
LOCATE 15, 15
|
|
INPUT "Increase game speed during play (Y or N)"; diff$
|
|
diff$ = UCASE$(diff$)
|
|
LOOP UNTIL diff$ = "Y" OR diff$ = "N"
|
|
|
|
DO
|
|
LOCATE 17, 46: PRINT SPACE$(34);
|
|
LOCATE 17, 17
|
|
INPUT "Monochrome or color monitor (M or C)"; monitor$
|
|
monitor$ = UCASE$(monitor$)
|
|
LOOP UNTIL monitor$ = "M" OR monitor$ = "C"
|
|
|
|
' startTime# = TIMER ' Calculate speed of system
|
|
' FOR i# = 1 TO 1000: NEXT i# ' and do some compensation
|
|
' stopTime# = TIMER
|
|
'
|
|
' speed = speed * .5 / (stopTime# - startTime# + .01)
|
|
|
|
|
|
END SUB
|
|
|
|
'InitColors:
|
|
'Initializes playing field colors
|
|
SUB InitColors
|
|
|
|
|
|
FOR row = 1 TO 50
|
|
FOR col = 1 TO 80
|
|
arena(row, col).acolor = colorTable(4)
|
|
NEXT col
|
|
NEXT row
|
|
|
|
CLS
|
|
|
|
'Set (turn on) pixels for screen border
|
|
FOR col = 1 TO 80
|
|
Set 3, col, colorTable(3)
|
|
Set 50, col, colorTable(3)
|
|
NEXT col
|
|
|
|
|
|
|
|
FOR row = 4 TO 49
|
|
Set row, 1, colorTable(3)
|
|
Set row, 80, colorTable(3)
|
|
NEXT row
|
|
|
|
|
|
END SUB
|
|
|
|
'Intro:
|
|
' Displays game introduction
|
|
SUB Intro
|
|
SCREEN 0
|
|
WIDTH 80, 25
|
|
COLOR 15, 0
|
|
CLS
|
|
|
|
Center 4, "Q B a s i c N i b b l e s"
|
|
COLOR 7
|
|
Center 6, "Copyright (C) Microsoft Corporation 1990"
|
|
Center 8, "Nibbles is a game for one or two players. Navigate your snakes"
|
|
Center 9, "around the game board trying to eat up numbers while avoiding"
|
|
Center 10, "running into walls or other snakes. The more numbers you eat up,"
|
|
Center 11, "the more points you gain and the longer your snake becomes."
|
|
Center 13, " Game Controls "
|
|
Center 15, " General Player 1 Player 2 "
|
|
Center 16, " (Up) (Up) "
|
|
Center 17, "P - Pause " + CHR$(24) + " W "
|
|
Center 18, " (Left) " + CHR$(27) + " " + CHR$(26) + " (Right) (Left) A D (Right) "
|
|
Center 19, " " + CHR$(25) + " S "
|
|
Center 20, " (Down) (Down) "
|
|
Center 24, "Press any key to continue"
|
|
|
|
PLAY "MBT160O1L8CDEDCDL4ECC"
|
|
|
|
SparklePause
|
|
|
|
END SUB
|
|
|
|
'Level:
|
|
'Sets game level
|
|
SUB Level (WhatToDO, sammy() AS snaketype) 'STATIC
|
|
|
|
SELECT CASE (WhatToDO)
|
|
|
|
CASE STARTOVER
|
|
curLevel = 1
|
|
CASE NEXTLEVEL
|
|
curLevel = curLevel + 1
|
|
END SELECT
|
|
|
|
sammy(1).head = 1 'Initialize Snakes
|
|
sammy(1).length = 2
|
|
sammy(1).alive = TRUE
|
|
sammy(2).head = 1
|
|
sammy(2).length = 2
|
|
sammy(2).alive = TRUE
|
|
|
|
InitColors
|
|
|
|
|
|
|
|
SELECT CASE curLevel
|
|
CASE 1
|
|
sammy(1).row = 25: sammy(2).row = 25
|
|
sammy(1).col = 50: sammy(2).col = 30
|
|
sammy(1).direction = 4: sammy(2).direction = 3
|
|
|
|
|
|
CASE 2
|
|
FOR i = 20 TO 60
|
|
Set 25, i, colorTable(3)
|
|
NEXT i
|
|
sammy(1).row = 7: sammy(2).row = 43
|
|
sammy(1).col = 60: sammy(2).col = 20
|
|
sammy(1).direction = 3: sammy(2).direction = 4
|
|
|
|
CASE 3
|
|
FOR i = 10 TO 40
|
|
Set i, 20, colorTable(3)
|
|
Set i, 60, colorTable(3)
|
|
NEXT i
|
|
sammy(1).row = 25: sammy(2).row = 25
|
|
sammy(1).col = 50: sammy(2).col = 30
|
|
sammy(1).direction = 1: sammy(2).direction = 2
|
|
|
|
CASE 4
|
|
FOR i = 4 TO 30
|
|
Set i, 20, colorTable(3)
|
|
Set 53 - i, 60, colorTable(3)
|
|
NEXT i
|
|
FOR i = 2 TO 40
|
|
Set 38, i, colorTable(3)
|
|
Set 15, 81 - i, colorTable(3)
|
|
NEXT i
|
|
sammy(1).row = 7: sammy(2).row = 43
|
|
sammy(1).col = 60: sammy(2).col = 20
|
|
sammy(1).direction = 3: sammy(2).direction = 4
|
|
|
|
CASE 5
|
|
FOR i = 13 TO 39
|
|
Set i, 21, colorTable(3)
|
|
Set i, 59, colorTable(3)
|
|
NEXT i
|
|
FOR i = 23 TO 57
|
|
Set 11, i, colorTable(3)
|
|
Set 41, i, colorTable(3)
|
|
NEXT i
|
|
sammy(1).row = 25: sammy(2).row = 25
|
|
sammy(1).col = 50: sammy(2).col = 30
|
|
sammy(1).direction = 1: sammy(2).direction = 2
|
|
|
|
CASE 6
|
|
FOR i = 4 TO 49
|
|
IF i > 30 OR i < 23 THEN
|
|
Set i, 10, colorTable(3)
|
|
Set i, 20, colorTable(3)
|
|
Set i, 30, colorTable(3)
|
|
Set i, 40, colorTable(3)
|
|
Set i, 50, colorTable(3)
|
|
Set i, 60, colorTable(3)
|
|
Set i, 70, colorTable(3)
|
|
END IF
|
|
NEXT i
|
|
sammy(1).row = 7: sammy(2).row = 43
|
|
sammy(1).col = 65: sammy(2).col = 15
|
|
sammy(1).direction = 2: sammy(2).direction = 1
|
|
|
|
CASE 7
|
|
FOR i = 4 TO 49 STEP 2
|
|
Set i, 40, colorTable(3)
|
|
NEXT i
|
|
sammy(1).row = 7: sammy(2).row = 43
|
|
sammy(1).col = 65: sammy(2).col = 15
|
|
sammy(1).direction = 2: sammy(2).direction = 1
|
|
|
|
CASE 8
|
|
FOR i = 4 TO 40
|
|
Set i, 10, colorTable(3)
|
|
Set 53 - i, 20, colorTable(3)
|
|
Set i, 30, colorTable(3)
|
|
Set 53 - i, 40, colorTable(3)
|
|
Set i, 50, colorTable(3)
|
|
Set 53 - i, 60, colorTable(3)
|
|
Set i, 70, colorTable(3)
|
|
NEXT i
|
|
sammy(1).row = 7: sammy(2).row = 43
|
|
sammy(1).col = 65: sammy(2).col = 15
|
|
sammy(1).direction = 2: sammy(2).direction = 1
|
|
|
|
CASE 9
|
|
FOR i = 6 TO 47
|
|
Set i, i, colorTable(3)
|
|
Set i, i + 28, colorTable(3)
|
|
NEXT i
|
|
sammy(1).row = 40: sammy(2).row = 15
|
|
sammy(1).col = 75: sammy(2).col = 5
|
|
sammy(1).direction = 1: sammy(2).direction = 2
|
|
|
|
CASE ELSE
|
|
FOR i = 4 TO 49 STEP 2
|
|
Set i, 10, colorTable(3)
|
|
Set i + 1, 20, colorTable(3)
|
|
Set i, 30, colorTable(3)
|
|
Set i + 1, 40, colorTable(3)
|
|
Set i, 50, colorTable(3)
|
|
Set i + 1, 60, colorTable(3)
|
|
Set i, 70, colorTable(3)
|
|
NEXT i
|
|
sammy(1).row = 7: sammy(2).row = 43
|
|
sammy(1).col = 65: sammy(2).col = 15
|
|
sammy(1).direction = 2: sammy(2).direction = 1
|
|
|
|
END SELECT
|
|
END SUB
|
|
|
|
'PlayNibbles:
|
|
' Main routine that controls game play
|
|
SUB PlayNibbles (numplayers, speed, diff$)
|
|
|
|
'Initialize Snakes
|
|
DIM sammyBody(MAXSNAKELENGTH - 1, 1 TO 2) AS snakeBody
|
|
DIM sammy(1 TO 2) AS snaketype
|
|
sammy(1).lives = 5
|
|
sammy(1).score = 0
|
|
sammy(1).scolor = colorTable(1)
|
|
sammy(2).lives = 5
|
|
sammy(2).score = 0
|
|
sammy(2).scolor = colorTable(2)
|
|
|
|
Level STARTOVER, sammy()
|
|
|
|
|
|
|
|
|
|
|
|
startRow1 = sammy(1).row: startCol1 = sammy(1).col
|
|
startRow2 = sammy(2).row: startCol2 = sammy(2).col
|
|
|
|
|
|
curSpeed = speed
|
|
|
|
'play Nibbles until finished
|
|
|
|
|
|
SpacePause " Level" + STR$(curLevel) + ", Push Space"
|
|
gameOver = FALSE
|
|
DO
|
|
IF numplayers = 1 THEN
|
|
sammy(2).row = 0
|
|
END IF
|
|
|
|
number = 1 'Current number that snakes are trying to run into
|
|
nonum = TRUE 'nonum = TRUE if a number is not on the screen
|
|
|
|
playerDied = FALSE
|
|
PrintScore numplayers, sammy(1).score, sammy(2).score, sammy(1).lives, sammy(2).lives
|
|
PLAY "T160O1>L20CDEDCDL10ECC"
|
|
|
|
DO
|
|
'Print number if no number exists
|
|
IF nonum = TRUE THEN
|
|
DO
|
|
numberRow = INT(RND(1) * 47 + 3)
|
|
NumberCol = INT(RND(1) * 78 + 2)
|
|
sisterRow = numberRow + arena(numberRow, NumberCol).sister
|
|
LOOP UNTIL NOT PointIsThere(numberRow, NumberCol, colorTable(4)) AND NOT PointIsThere(sisterRow, NumberCol, colorTable(4))
|
|
numberRow = arena(numberRow, NumberCol).realRow
|
|
nonum = FALSE
|
|
COLOR colorTable(1), colorTable(4)
|
|
LOCATE numberRow, NumberCol
|
|
PRINT RIGHT$(STR$(number), 1);
|
|
count = 0
|
|
END IF
|
|
|
|
'Delay game
|
|
'FOR a# = 1 TO curSpeed: NEXT a#
|
|
DO: LOOP WHILE TIMER = oldtimer!
|
|
oldtimer! = TIMER
|
|
|
|
'Get keyboard input & Change direction accordingly
|
|
kbd$ = INKEY$
|
|
SELECT CASE kbd$
|
|
CASE "w", "W": IF sammy(2).direction <> 2 THEN sammy(2).direction = 1
|
|
CASE "s", "S": IF sammy(2).direction <> 1 THEN sammy(2).direction = 2
|
|
CASE "a", "A": IF sammy(2).direction <> 4 THEN sammy(2).direction = 3
|
|
CASE "d", "D": IF sammy(2).direction <> 3 THEN sammy(2).direction = 4
|
|
CASE CHR$(0) + "H": IF sammy(1).direction <> 2 THEN sammy(1).direction = 1
|
|
CASE CHR$(0) + "P": IF sammy(1).direction <> 1 THEN sammy(1).direction = 2
|
|
CASE CHR$(0) + "K": IF sammy(1).direction <> 4 THEN sammy(1).direction = 3
|
|
CASE CHR$(0) + "M": IF sammy(1).direction <> 3 THEN sammy(1).direction = 4
|
|
CASE "p", "P": SpacePause " Game Paused ... Push Space "
|
|
CASE ELSE
|
|
END SELECT
|
|
|
|
FOR a = 1 TO numplayers
|
|
'Move Snake
|
|
SELECT CASE sammy(a).direction
|
|
CASE 1: sammy(a).row = sammy(a).row - 1
|
|
CASE 2: sammy(a).row = sammy(a).row + 1
|
|
CASE 3: sammy(a).col = sammy(a).col - 1
|
|
CASE 4: sammy(a).col = sammy(a).col + 1
|
|
END SELECT
|
|
|
|
'If snake hits number, respond accordingly
|
|
IF numberRow = INT((sammy(a).row + 1) / 2) AND NumberCol = sammy(a).col THEN
|
|
PLAY "MBO0L16>CCCE"
|
|
|
|
IF sammy(a).length < (MAXSNAKELENGTH - 30) THEN
|
|
sammy(a).length = sammy(a).length + number * 4
|
|
END IF
|
|
sammy(a).score = sammy(a).score + number
|
|
PrintScore numplayers, sammy(1).score, sammy(2).score, sammy(1).lives, sammy(2).lives
|
|
number = number + 1
|
|
IF number = 10 THEN
|
|
EraseSnake sammy(), sammyBody(), 1
|
|
EraseSnake sammy(), sammyBody(), 2
|
|
LOCATE numberRow, NumberCol: PRINT " "
|
|
Level NEXTLEVEL, sammy()
|
|
PrintScore numplayers, sammy(1).score, sammy(2).score, sammy(1).lives, sammy(2).lives
|
|
SpacePause " Level" + STR$(curLevel) + ", Push Space"
|
|
IF numplayers = 1 THEN sammy(2).row = 0
|
|
number = 1
|
|
IF diff$ = "P" THEN speed = speed - 10: curSpeed = speed
|
|
END IF
|
|
nonum = TRUE
|
|
IF curSpeed < 1 THEN curSpeed = 1
|
|
END IF
|
|
NEXT a
|
|
|
|
FOR a = 1 TO numplayers
|
|
'If player runs into any point, or the head of the other snake, it dies.
|
|
IF PointIsThere(sammy(a).row, sammy(a).col, colorTable(4)) OR (sammy(1).row = sammy(2).row AND sammy(1).col = sammy(2).col) THEN
|
|
PLAY "MBO0L32EFGEFDC"
|
|
|
|
COLOR , colorTable(4)
|
|
LOCATE numberRow, NumberCol
|
|
PRINT " "
|
|
|
|
playerDied = TRUE
|
|
sammy(a).alive = FALSE
|
|
sammy(a).lives = sammy(a).lives - 1
|
|
|
|
'Otherwise, move the snake, and erase the tail
|
|
ELSE
|
|
sammy(a).head = (sammy(a).head + 1) MOD MAXSNAKELENGTH
|
|
sammyBody(sammy(a).head, a).row = sammy(a).row
|
|
sammyBody(sammy(a).head, a).col = sammy(a).col
|
|
tail = (sammy(a).head + MAXSNAKELENGTH - sammy(a).length) MOD MAXSNAKELENGTH
|
|
Set sammyBody(tail, a).row, sammyBody(tail, a).col, colorTable(4)
|
|
sammyBody(tail, a).row = 0
|
|
Set sammy(a).row, sammy(a).col, sammy(a).scolor
|
|
END IF
|
|
NEXT a
|
|
|
|
LOOP UNTIL playerDied
|
|
|
|
curSpeed = speed ' reset speed to initial value
|
|
|
|
FOR a = 1 TO numplayers
|
|
EraseSnake sammy(), sammyBody(), a
|
|
|
|
'If dead, then erase snake in really cool way
|
|
IF sammy(a).alive = FALSE THEN
|
|
'Update score
|
|
sammy(a).score = sammy(a).score - 10
|
|
PrintScore numplayers, sammy(1).score, sammy(2).score, sammy(1).lives, sammy(2).lives
|
|
|
|
IF a = 1 THEN
|
|
SpacePause " Sammy Dies! Push Space! --->"
|
|
ELSE
|
|
SpacePause " <---- Jake Dies! Push Space "
|
|
END IF
|
|
END IF
|
|
NEXT a
|
|
|
|
Level SAMELEVEL, sammy()
|
|
PrintScore numplayers, sammy(1).score, sammy(2).score, sammy(1).lives, sammy(2).lives
|
|
|
|
'Play next round, until either of snake's lives have run out.
|
|
LOOP UNTIL sammy(1).lives = 0 OR sammy(2).lives = 0
|
|
|
|
END SUB
|
|
|
|
'PointIsThere:
|
|
' Checks the global arena array to see if the boolean flag is set
|
|
FUNCTION PointIsThere (row, col, acolor)
|
|
IF row <> 0 THEN
|
|
IF arena(row, col).acolor <> acolor THEN
|
|
PointIsThere = TRUE
|
|
ELSE
|
|
PointIsThere = FALSE
|
|
END IF
|
|
END IF
|
|
END FUNCTION
|
|
|
|
'PrintScore:
|
|
' Prints players scores and number of lives remaining
|
|
SUB PrintScore (numplayers, score1, score2, lives1, lives2)
|
|
COLOR 15, colorTable(4)
|
|
|
|
IF numplayers = 2 THEN
|
|
LOCATE 1, 1
|
|
'PRINT USING "#,###,#00 Lives: # <--JAKE"; score2; lives2
|
|
PRINT STR$(score2 * 100) + " Lives:"; lives2; " <--JAKE"
|
|
END IF
|
|
|
|
LOCATE 1, 49
|
|
'PRINT USING "SAMMY--> Lives: # #,###,#00"; lives1; score1
|
|
PRINT "SAMMY--> Lives:"; lives1; " "; STR$(score1 * 100)
|
|
|
|
END SUB
|
|
|
|
'Set:
|
|
' Sets row and column on playing field to given color to facilitate moving
|
|
' of snakes around the field.
|
|
SUB Set (row, col, acolor)
|
|
IF row <> 0 THEN
|
|
arena(row, col).acolor = acolor 'assign color to arena
|
|
realRow = arena(row, col).realRow 'Get real row of pixel
|
|
|
|
topFlag = arena(row, col).sister + 1 / 2 'Deduce whether pixel
|
|
'is on topß, or bottomÜ
|
|
|
|
' IF arena(row, col).sister = 1 THEN topFlag = 2 ELSE topFlag = 0
|
|
|
|
|
|
sisterRow = row + arena(row, col).sister 'Get arena row of sister
|
|
sisterColor = arena(sisterRow, col).acolor 'Determine sister's color
|
|
|
|
'LOCATE 1, 1: PRINT topFlag, arena(row, col).sister
|
|
|
|
LOCATE realRow, col
|
|
|
|
IF acolor = sisterColor THEN 'If both points are same
|
|
COLOR acolor, acolor 'Print chr$(219) "Û"
|
|
PRINT CHR$(219);
|
|
ELSE
|
|
IF topFlag THEN 'Since you cannot have
|
|
IF acolor > 7 THEN 'bright backgrounds
|
|
COLOR acolor, sisterColor 'determine best combo
|
|
PRINT CHR$(223); 'to use.
|
|
ELSE
|
|
COLOR sisterColor, acolor
|
|
PRINT CHR$(220);
|
|
END IF
|
|
ELSE
|
|
IF acolor > 7 THEN
|
|
COLOR acolor, sisterColor
|
|
PRINT CHR$(220);
|
|
ELSE
|
|
COLOR sisterColor, acolor
|
|
PRINT CHR$(223);
|
|
END IF
|
|
END IF
|
|
END IF
|
|
END IF
|
|
'SLEEP
|
|
|
|
END SUB
|
|
|
|
'SpacePause:
|
|
' Pauses game play and waits for space bar to be pressed before continuing
|
|
SUB SpacePause (text$)
|
|
|
|
COLOR colorTable(5), colorTable(6)
|
|
Center 11, "ÛßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÛ"
|
|
Center 12, "Û " + LEFT$(text$ + SPACE$(29), 29) + " Û"
|
|
Center 13, "ÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛ"
|
|
WHILE INKEY$ <> "": WEND
|
|
WHILE INKEY$ <> " ": WEND
|
|
COLOR 15, colorTable(4)
|
|
|
|
FOR i = 21 TO 26 ' Restore the screen background
|
|
FOR j = 24 TO 56
|
|
Set i, j, arena(i, j).acolor
|
|
NEXT j
|
|
NEXT i
|
|
|
|
END SUB
|
|
|
|
'SparklePause:
|
|
' Creates flashing border for intro screen
|
|
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
|
|
|
|
'StillWantsToPlay:
|
|
' Determines if users want to play game again.
|
|
FUNCTION StillWantsToPlay
|
|
|
|
COLOR colorTable(5), colorTable(6)
|
|
Center 10, "ÛßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÛ"
|
|
Center 11, "Û G A M E O V E R Û"
|
|
Center 12, "Û Û"
|
|
Center 13, "Û Play Again? (Y/N) Û"
|
|
Center 14, "ÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛ"
|
|
|
|
WHILE INKEY$ <> "": WEND
|
|
DO
|
|
kbd$ = UCASE$(INKEY$)
|
|
LOOP UNTIL kbd$ = "Y" OR kbd$ = "N"
|
|
|
|
COLOR 15, colorTable(4)
|
|
Center 10, " "
|
|
Center 11, " "
|
|
Center 12, " "
|
|
Center 13, " "
|
|
Center 14, " "
|
|
|
|
IF kbd$ = "Y" THEN
|
|
StillWantsToPlay = TRUE
|
|
ELSE
|
|
StillWantsToPlay = FALSE
|
|
COLOR 7, 0
|
|
CLS
|
|
END IF
|
|
|
|
END FUNCTION
|
|
|