用Excel制作贪吃蛇
此文章最先發布于我的博客
廢話不多說,先放成果。在GitHub上查看源代碼 。
開始編寫
閱讀此教程,你需要了解
-
什么是VBA,對VBA初步了解
-
如何在Excel中編輯VBA,并啟用它
否則請另行百度。
##最重要的兩個函數
Range和Cells是整個游戲程序中的核心,它們都能返回一個 表示一個單元格、一行、一列、一個包含單個或若干連續單元格區域的選定單元格范圍,或者一個三維區域。(摘自https://docs.microsoft.com/zh-cn/office/vba/api/excel.range(object))
簡單來說姐是能幫助我們獲取到Excel中的每一個格子,以便我們操作他們的屬性。
如以下代碼:
Cells(2, 22) = "貪吃蛇撞墻過猛,游戲結束"獲取了y坐標為2,x坐標為22的單元格,并設置它的文本。(這里可能和我們平時的認知不太一樣,Cells函數是y在前x在后的)
初始化
游戲初始化過程的代碼如下:
Option Explicit'定義貪吃蛇坐標變量 Dim snackX(400) As Integer Dim snackY(400) As Integer '定義貪吃蛇坐標引索 Dim snackIndex As Integer '定義貪吃蛇移動變量 Dim snackMoveX As Integer Dim snackMoveY As Integer '蘋果坐標 Dim appleX As Integer Dim appleY As Integer '游戲是否運行 Dim isGameRunning As Integer'導入win32API模塊 #If VBA7 And Win64 ThenPrivate Declare PtrSafe Function GetTickCount Lib "kernel32" () As Long #ElsePrivate Declare Function GetTickCount Lib "kernel32" () As Long #End If'工具類函數 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其中,第一行規定全局的變量必須定義后才可以使用,當然取消后代碼也能正確運行,但會存在許多潛在的漏洞。
之后,是貪吃蛇和蘋果位置信息的定義,以便我們可以全局使用它。需要注意的是,貪吃蛇坐標變量定義了兩個長度為400的整形數組,這是經過了計算的,即貪吃蛇沾滿格子的長度。
最后,我們導入了kernel32模塊。又利用其中的GetTickCount定義了一個Sleep函數,用于延時,以控制游戲幀數。
游戲基礎——畫布類
'畫布類 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函數,顧名思義,我們用其清理畫布的區域。其中,使用Range("B2:S19")獲取了Excel中的格子區域(圖中框選區域),并將它清空。
CanvasReLoad中,我們將整個黑框區域恢復原樣,及在CanvasClean的基礎上,將黑框也重新繪制。
為什么要這么做,給你看個圖就知道了:
主角——貪吃蛇類
'貪吃蛇類 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) = "貪吃蛇撞墻過猛,游戲結束"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) = "貪吃蛇把自己吃了,游戲結束"isGameRunning = 0End IfNext End Sub如果你熟悉VB,那你一定看出來了,TextBox1_Change是TextBox1中的文本改變時自動調用的一個過程。我們在這里進行判斷,已根據WASD的方向鍵調整貪吃蛇的移動量,最后再將其內容清空,以便下一次檢測 。
其次,就是故名思意了:
- snackCreate——創建貪吃蛇
- snackMove——根據貪吃蛇的移動量移動貪吃蛇
- snackDraw——繪制貪吃蛇
- snackHitWall——檢測貪吃蛇是否撞到墻
- snackEatApple——檢測貪吃蛇是否吃到蘋果
- snackHitHimself——檢測貪吃蛇是否把自己吃了
食物——蘋果類
'蘋果類 Public Sub appleCreate()appleX = Int(Rnd * 15) + 3appleY = Int(Rnd * 15) + 3 End SubPublic Sub appleDraw()Cells(appleY, appleX).Interior.Color = 100 End Sub與貪吃蛇基本相同,但簡單許多:
- appleCreate——創建蘋果
- appleDraw——繪制蘋果
游戲中的Main函數——游戲類
'游戲類 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) = "游戲結束" End SubrestGame重置游戲,stopGame停止游戲。
beginGame函數的邏輯為。
Created with Rapha?l 2.3.0 開始游戲 將游戲狀態設置為Ture 重置游戲 重置畫布 創建貪食蛇 創建蘋果 游戲狀態是否為True 清空畫布 繪制蘋果 移動貪吃蛇 繪制貪吃蛇 檢測貪吃蛇是否撞到墻 檢測貪吃蛇是否吃到蘋果 檢測貪吃蛇是否把自己吃了 延時300秒 游戲結束 yes no總結
以上是生活随笔為你收集整理的用Excel制作贪吃蛇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JS基础之数组--概述、创建数组的几种方
- 下一篇: 云原生|kubernetes|minik