Skip to content

Instantly share code, notes, and snippets.

@cwt8805
Created April 17, 2018 07:28
Show Gist options
  • Select an option

  • Save cwt8805/70ac3efd4a495e3d94285819826c0034 to your computer and use it in GitHub Desktop.

Select an option

Save cwt8805/70ac3efd4a495e3d94285819826c0034 to your computer and use it in GitHub Desktop.
Const WIDTH = 20
Const HEIGHT = 20
Enum DATA
SNAKE_DATA
BACK_DATA
FOOD_DATA
End Enum
Enum DIR
UP_DIR
DOWN_DIR
LEFT_DIR
RIGHT_DIR
End Enum
Dim currentDir As DIR
Dim fireTime As Date
Dim background(HEIGHT - 1, WIDTH - 1) As DATA
Dim snake(HEIGHT * WIDTH - 1, 1) As Integer
Dim snakeLen As Integer
Dim score As Integer
Sub start()
score = 0
currentDir = DIR.RIGHT_DIR
snakeLen = 0
initTable
addSnakeNode 0, 0
addSnakeNode 1, 0
createFood
Application.OnKey "{UP}", "'changeDir " & "1'"
Application.OnKey "{DOWN}", "'changeDir " & "2'"
Application.OnKey "{LEFT}", "'changeDir " & "3'"
Application.OnKey "{RIGHT}", "'changeDir " & "4'"
tick
End Sub
Sub initTable()
Dim x As Integer, y As Integer
For y = 0 To HEIGHT - 1
For x = 0 To WIDTH - 1
background(y, x) = DATA.BACK_DATA
Next
Next
End Sub
Sub addSnakeNode(ByVal x As Integer, ByVal y As Integer)
background(y, x) = DATA.SNAKE_DATA
snake(snakeLen, 0) = x
snake(snakeLen, 1) = y
snakeLen = snakeLen + 1
End Sub
Sub createFood()
Dim x As Integer, y As Integer
Do
x = Int(Rnd * WIDTH)
y = Int(Rnd * HEIGHT)
Loop Until background(y, x) <> DATA.SNAKE_DATA
background(y, x) = DATA.FOOD_DATA
End Sub
Sub updateUI()
Dim x As Integer, y As Integer
For y = 0 To HEIGHT - 1
For x = 0 To WIDTH - 1
Select Case background(y, x)
Case DATA.BACK_DATA
Cells(y + 1, x + 1).Interior.ColorIndex = 0
Case DATA.SNAKE_DATA
Cells(y + 1, x + 1).Interior.Color = vbGreen
Case DATA.FOOD_DATA
Cells(y + 1, x + 1).Interior.Color = vbRed
End Select
Next
Next
End Sub
Sub tick()
updateUI
Dim newX As Integer, newY As Integer
Select Case currentDir
Case DIR.UP_DIR
newX = snake(snakeLen - 1, 0)
newY = snake(snakeLen - 1, 1) - 1
Case DIR.DOWN_DIR
newX = snake(snakeLen - 1, 0)
newY = snake(snakeLen - 1, 1) + 1
Case DIR.LEFT_DIR
newX = snake(snakeLen - 1, 0) - 1
newY = snake(snakeLen - 1, 1)
Case DIR.RIGHT_DIR
newX = snake(snakeLen - 1, 0) + 1
newY = snake(snakeLen - 1, 1)
End Select
'出界调整
If newX < 0 Then
newX = WIDTH - 1
ElseIf newX > WIDTH - 1 Then
newX = 0
End If
If newY < 0 Then
newY = HEIGHT - 1
ElseIf newY > HEIGHT - 1 Then
newY = 0
End If
'移动
If background(newY, newX) = DATA.FOOD_DATA Then
score = score + 1
addSnakeNode newX, newY
createFood
ElseIf background(newY, newX) = DATA.SNAKE_DATA Then
MsgBox "游戏结束!得分 " & score
End
Else
background(snake(0, 1), snake(0, 0)) = DATA.BACK_DATA
background(newY, newX) = DATA.SNAKE_DATA
For i = 0 To snakeLen - 2
snake(i, 0) = snake(i + 1, 0)
snake(i, 1) = snake(i + 1, 1)
Next
snake(snakeLen - 1, 0) = newX
snake(snakeLen - 1, 1) = newY
End If
fireTime = Now + TimeValue("00:00:01")
Application.OnTime EarliestTime:=fireTime, Procedure:="tick", Schedule:=True
End Sub
Sub changeDir(dirNum)
Select Case dirNum
Case 1
If currentDir <> DIR.DOWN_DIR Then currentDir = DIR.UP_DIR
Case 2
If currentDir <> DIR.UP_DIR Then currentDir = DIR.DOWN_DIR
Case 3
If currentDir <> DIR.RIGHT_DIR Then currentDir = DIR.LEFT_DIR
Case 4
If currentDir <> DIR.LEFT_DIR Then currentDir = DIR.RIGHT_DIR
End Select
End Sub
Sub pause()
Application.OnTime EarliestTime:=fireTime, Procedure:="tick", Schedule:=False
End Sub
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment