用Excel制作贪吃蛇
此文章最先發(fā)布于我的博客
廢話不多說(shuō),先放成果。在GitHub上查看源代碼 。
開(kāi)始編寫
閱讀此教程,你需要了解
-
什么是VBA,對(duì)VBA初步了解
-
如何在Excel中編輯VBA,并啟用它
否則請(qǐng)另行百度。
##最重要的兩個(gè)函數(shù)
Range和Cells是整個(gè)游戲程序中的核心,它們都能返回一個(gè) 表示一個(gè)單元格、一行、一列、一個(gè)包含單個(gè)或若干連續(xù)單元格區(qū)域的選定單元格范圍,或者一個(gè)三維區(qū)域。(摘自https://docs.microsoft.com/zh-cn/office/vba/api/excel.range(object))
簡(jiǎn)單來(lái)說(shuō)姐是能幫助我們獲取到Excel中的每一個(gè)格子,以便我們操作他們的屬性。
如以下代碼:
Cells(2, 22) = "貪吃蛇撞墻過(guò)猛,游戲結(jié)束"獲取了y坐標(biāo)為2,x坐標(biāo)為22的單元格,并設(shè)置它的文本。(這里可能和我們平時(shí)的認(rèn)知不太一樣,Cells函數(shù)是y在前x在后的)
初始化
游戲初始化過(guò)程的代碼如下:
Option Explicit'定義貪吃蛇坐標(biāo)變量 Dim snackX(400) As Integer Dim snackY(400) As Integer '定義貪吃蛇坐標(biāo)引索 Dim snackIndex As Integer '定義貪吃蛇移動(dòng)變量 Dim snackMoveX As Integer Dim snackMoveY As Integer '蘋果坐標(biāo) Dim appleX As Integer Dim appleY As Integer '游戲是否運(yùn)行 Dim isGameRunning As Integer'導(dǎo)入win32API模塊 #If VBA7 And Win64 ThenPrivate Declare PtrSafe Function GetTickCount Lib "kernel32" () As Long #ElsePrivate Declare Function GetTickCount Lib "kernel32" () As Long #End If'工具類函數(shù) Private Sub Sleep(numa As Double)Dim num1 As DoubleDim num2 As DoubleDim numb As Doublenumb = 0num1 = GetTickCountDo While numa - numb > 0num2 = GetTickCountnumb = num2 - num1DoEventsLoop End Sub其中,第一行規(guī)定全局的變量必須定義后才可以使用,當(dāng)然取消后代碼也能正確運(yùn)行,但會(huì)存在許多潛在的漏洞。
之后,是貪吃蛇和蘋果位置信息的定義,以便我們可以全局使用它。需要注意的是,貪吃蛇坐標(biāo)變量定義了兩個(gè)長(zhǎng)度為400的整形數(shù)組,這是經(jīng)過(guò)了計(jì)算的,即貪吃蛇沾滿格子的長(zhǎng)度。
最后,我們導(dǎo)入了kernel32模塊。又利用其中的GetTickCount定義了一個(gè)Sleep函數(shù),用于延時(shí),以控制游戲幀數(shù)。
游戲基礎(chǔ)——畫布類
'畫布類 Public Sub CanvasClean()With Range("B2:S19").Interior.Pattern = xlNone.TintAndShade = 0.PatternTintAndShade = 0End With End SubPublic Sub CanvasReLoad()With Range("A1:T20").Interior.PatternColorIndex = xlAutomatic.ThemeColor = xlThemeColorLight1.TintAndShade = 0.PatternTintAndShade = 0End With End SubCanvasClean函數(shù),顧名思義,我們用其清理畫布的區(qū)域。其中,使用Range("B2:S19")獲取了Excel中的格子區(qū)域(圖中框選區(qū)域),并將它清空。
CanvasReLoad中,我們將整個(gè)黑框區(qū)域恢復(fù)原樣,及在CanvasClean的基礎(chǔ)上,將黑框也重新繪制。
為什么要這么做,給你看個(gè)圖就知道了:
主角——貪吃蛇類
'貪吃蛇類 Private Sub TextBox1_Change()Select Case TextBox1.TextCase Is = "w"If snackMoveY <> 1 ThensnackMoveY = -1snackMoveX = 0End IfCase Is = "s"If snackMoveY <> -1 ThensnackMoveY = 1snackMoveX = 0End IfCase Is = "a"If snackMoveX <> 1 ThensnackMoveX = -1snackMoveY = 0End IfCase Is = "d"If snackMoveX <> -1 ThensnackMoveX = 1snackMoveY = 0End IfEnd SelectTextBox1.Text = "" End SubPublic Sub snackCreate()snackIndex = 3Dim i As IntegerDim x As IntegerDim y As Integerx = Int(Rnd * 13) + 3y = Int(Rnd * 13) + 3For i = 0 To snackIndexsnackX(i) = xsnackY(i) = y + iNext End SubPublic Sub snackMove()Dim i As IntegerFor i = snackIndex To 1 Step -1snackX(i) = snackX(i - 1)snackY(i) = snackY(i - 1)NextsnackX(0) = snackX(0) + snackMoveXsnackY(0) = snackY(0) + snackMoveY End SubPublic Sub snackDraw()Dim i As IntegerFor i = 0 To snackIndexCells(snackY(i), snackX(i)).Interior.Color = 255Next End SubPublic Sub snackHitWall()If snackX(0) = 1 Or snackX(0) = 20 Or snackY(0) = 1 Or snackY(0) = 20 ThenCells(2, 22) = "貪吃蛇撞墻過(guò)猛,游戲結(jié)束"isGameRunning = 0End If End SubPublic Sub snackEatApple()If snackX(0) = appleX And snackY(0) = appleY ThenappleCreatesnackIndex = snackIndex + 1Cells(4, 22) = Int(Cells(4, 22).Value) + 1End If End SubPublic Sub snackHitHimself()Dim i As IntegerFor i = 1 To snackIndexIf snackX(0) = snackX(i) And snackY(0) = snackY(i) ThenCells(2, 22) = "貪吃蛇把自己吃了,游戲結(jié)束"isGameRunning = 0End IfNext End Sub如果你熟悉VB,那你一定看出來(lái)了,TextBox1_Change是TextBox1中的文本改變時(shí)自動(dòng)調(diào)用的一個(gè)過(guò)程。我們?cè)谶@里進(jìn)行判斷,已根據(jù)WASD的方向鍵調(diào)整貪吃蛇的移動(dòng)量,最后再將其內(nèi)容清空,以便下一次檢測(cè) 。
其次,就是故名思意了:
- snackCreate——?jiǎng)?chuàng)建貪吃蛇
- snackMove——根據(jù)貪吃蛇的移動(dòng)量移動(dòng)貪吃蛇
- snackDraw——繪制貪吃蛇
- snackHitWall——檢測(cè)貪吃蛇是否撞到墻
- snackEatApple——檢測(cè)貪吃蛇是否吃到蘋果
- snackHitHimself——檢測(cè)貪吃蛇是否把自己吃了
食物——蘋果類
'蘋果類 Public Sub appleCreate()appleX = Int(Rnd * 15) + 3appleY = Int(Rnd * 15) + 3 End SubPublic Sub appleDraw()Cells(appleY, appleX).Interior.Color = 100 End Sub與貪吃蛇基本相同,但簡(jiǎn)單許多:
- appleCreate——?jiǎng)?chuàng)建蘋果
- appleDraw——繪制蘋果
游戲中的Main函數(shù)——游戲類
'游戲類 Public Sub restGame()snackMoveY = 0snackMoveX = 1Cells(2, 22) = "游戲中"Cells(4, 22) = 0 End SubPublic Sub beginGame()isGameRunning = 1restGameCanvasReLoadsnackCreateappleCreateDo While isGameRunning = 1CanvasCleanappleDrawsnackMovesnackDrawsnackHitWallsnackEatApplesnackHitHimselfSleep (300)Loop End SubPublic Sub stopGame()isGameRunning = 0Cells(2, 22) = "游戲結(jié)束" End SubrestGame重置游戲,stopGame停止游戲。
beginGame函數(shù)的邏輯為。
Created with Rapha?l 2.3.0 開(kāi)始游戲 將游戲狀態(tài)設(shè)置為Ture 重置游戲 重置畫布 創(chuàng)建貪食蛇 創(chuàng)建蘋果 游戲狀態(tài)是否為True 清空畫布 繪制蘋果 移動(dòng)貪吃蛇 繪制貪吃蛇 檢測(cè)貪吃蛇是否撞到墻 檢測(cè)貪吃蛇是否吃到蘋果 檢測(cè)貪吃蛇是否把自己吃了 延時(shí)300秒 游戲結(jié)束 yes no總結(jié)
以上是生活随笔為你收集整理的用Excel制作贪吃蛇的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: JS基础之数组--概述、创建数组的几种方
- 下一篇: 云原生|kubernetes|minik