722 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			QBasic
		
	
	
	
	
	
			
		
		
	
	
			722 lines
		
	
	
		
			24 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 SpacePause (text$)
 | ||
| DECLARE SUB PrintScore (NumPlayers%, score1%, score2%, lives1%, lives2%)
 | ||
| DECLARE SUB Intro ()
 | ||
| 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
 | ||
| 
 | ||
| '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) * 2 + 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#)
 | ||
| 
 | ||
| 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#
 | ||
| 
 | ||
|             '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
 | ||
|     END IF
 | ||
| 
 | ||
|     LOCATE 1, 49
 | ||
|     PRINT USING "SAMMY-->  Lives: #     #,###,#00"; lives1; score1
 | ||
| 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Ü
 | ||
|         sisterRow = row + arena(row, col).sister    'Get arena row of sister
 | ||
|         sisterColor = arena(sisterRow, col).acolor  'Determine sister's color
 | ||
| 
 | ||
|         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
 | ||
| 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
 | ||
| 
 | ||
|  |