下面这个用vb编写贪食蛇教程由图老师小编精心推荐选出,过程简单易学超容易上手,喜欢就要赶紧get起来哦!
【 tulaoshi.com - 编程语言 】
'' 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 playDEFINT A-Z'User-defined TYPEsTYPE snakeBody row AS INTEGER col AS INTEGEREND TYPE'This type defines the player's snakeTYPE 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 INTEGEREND 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'programsTYPE 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 isEND TYPE '-1 if sister point is above, +1 if below'Sub DeclarationsDECLARE 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)'ConstantsCONST TRUE = -1CONST FALSE = NOT TRUECONST MAXSNAKELENGTH = 1000CONST STARTOVER = 1 ' Parameters to 'Level' SUBCONST SAMELEVEL = 2CONST NEXTLEVEL = 3'Global VariablesDIM SHARED arena(1 TO 50, 1 TO 80) AS arenaTypeDIM SHARED curLevel, colorTable(10)RANDOMIZE TIMER GOSUB ClearKeyLocks Intro GetInputs NumPlayers, speed, diff$, monitor$ GOSUB SetColors DrawScreenDO PlayNibbles NumPlayers, speed, diff$ LOOP WHILE StillWantsToPlayGOSUB RestoreKeyLocks COLOR 15, 0 CLSENDClearKeyLocks: DEF SEG = 0 ' Turn off CapLock, NumLock and ScrollLock KeyFlags = PEEK(1047) POKE 1047, &H0 DEF SEG RETURNRestoreKeyLocks: DEF SEG = 0 ' Restore CapLock, NumLock and ScrollLock states POKE 1047, KeyFlags DEF SEG RETURNSetColors: IF monitor$ = "M" THEN RESTORE mono ELSE RESTORE normal END IFFOR a = 1 TO 6 READ colorTable(a) NEXT a RETURN'snake1 snake2 Walls Background Dialogs-Fore Backmono: DATA 15, 7, 7, 0, 15, 0normal: DATA 14, 13, 12, 1, 15, 4END'Center:' Centers text on given rowSUB Center (row, text$) LOCATE row, 41 - LEN(text$) / 2 PRINT text$;END SUB'DrawScreen:' Draws playing fieldSUB 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 rowEND SUB'EraseSnake:' Erases snake to facilitate moving through playing fieldSUB 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 inputsSUB GetInputs (NumPlayers, speed, diff$, monitor$)COLOR 7, 0 CLSDO 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 + 1DO 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 colorsSUB InitColors FOR row = 1 TO 50 FOR col = 1 TO 80 arena(row, col).acolor = colorTable(4) NEXT col NEXT rowCLS 'Set (turn on) pixels for screen border FOR col = 1 TO 80 Set 3, col, colorTable(3) Set 50, col, colorTable(3) NEXT colFOR row = 4 TO 49 Set row, 1, colorTable(3) Set row, 80, colorTable(3) NEXT rowEND SUB'Intro:' Displays game introductionSUB Intro SCREEN 0 WIDTH 80, 25 COLOR 15, 0 CLSCenter 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" SparklePauseEND SUB'Level:'Sets game levelSUB Level (WhatToDO, sammy() AS snaketype) STATIC SELECT CASE (WhatToDO)CASE STARTOVER curLevel = 1 CASE NEXTLEVEL curLevel = curLevel + 1 END SELECTsammy(1).head = 1 'Initialize Snakes sammy(1).length = 2 sammy(1).alive = TRUE sammy(2).head = 1 sammy(2).length = 2 sammy(2).alive = TRUEInitColors 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 = 4CASE 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 = 2CASE 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 = 2CASE 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 = 1CASE 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 = 1CASE 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 = 1CASE 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 = 1END SELECTEND SUB'PlayNibbles:' Main routine that controls game playSUB 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).colcurSpeed = speed'play Nibbles until finishedSpacePause " Level" + STR$(curLevel) + ", Push Space" gameOver = FALSE DO IF NumPlayers = 1 THEN sammy(2).row = 0 END IFnumber = 1 'Current number that snakes are trying to run into nonum = TRUE 'nonum = TRUE if a number is not on the screenplayerDied = FALSE PrintScore NumPlayers, sammy(1).score, sammy(2).score, sammy(1).lives, sammy(2).lives PLAY "T160O1L20CDEDCDL10ECC"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 SELECTFOR 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 "MBO0L16CCCE" 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 aFOR 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 aLOOP UNTIL playerDiedcurSpeed = 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 aLevel 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 = 0END SUB'PointIsThere:' Checks the global arena array to see if the boolean flag is setFUNCTION PointIsThere (row, col, acolor) IF row 0 THEN IF arena(row, col).acolor acolor THEN PointIsThere = TRUE ELSE PointIsThere = FALSE END IF END IFEND FUNCTION'PrintScore:' Prints players scores and number of lives remainingSUB 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 IFLOCATE 1, 49 PRINT USING "SAMMY-- Lives: # #,###,#00"; lives1; score1END 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 colorLOCATE realRow, colIF 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 IFEND SUB'SpacePause:' Pauses game play and waits for space bar to be pressed before continuingSUB 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 iEND SUB'SparklePause:' Creates flashing border for intro screenSUB SparklePauseCOLOR 4, 0 a$ = "* * * * * * * * * * * * * * * * * " WHILE INKEY$ "": WEND 'Clear keyboard bufferWHILE 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 WENDEND SUB'StillWantsToPlay:' Determines if users want to play game again.FUNCTION StillWantsToPlayCOLOR 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 IFEND FUNCTION(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)
来源:http://www.tulaoshi.com/n/20160219/1610406.html