使用VB創建貪吃蛇
貪吃蛇作為一個經典游戲,在其開發成功后,有很長一段時間令很多人為之振奮,但隨著時間的流逝,貪吃蛇也逐漸淡出人們的視野。本次,我利用VB重現貪吃蛇的創建。主要使用到的控件:Label標簽,Command按鈕,Timer控件。
以下為創建過程:
貪吃蛇作為一個游戲來說,主要分為6個部分:
- 地圖創建部分;
- 地圖坐標初始化部分;
- 食物創建部分;
- 貪吃蛇創建部分;
- 貪吃蛇移動控制部分;
- 貪吃蛇吃食物身體變化部分。
在創建之前,我們需要為我們需要的變量進行定義:
1 Private MapXy(4900) As xy '用于存放全部的地圖坐標,這里以70*70為例 2 Private Snake() As xy '用于存放蛇的身體及頭的坐標 3 Private SnakeLength As Long '用于存放蛇身體長度 4 Private wbtemp As xy '用于存放尾巴坐標及類型 5 Private Food As xy '用于保存食物的坐標 6 Private Alive As Boolean'用于判斷是否活著 7 Private MapColors As Long 8 Private SnakeHeadColors As Long 9 Private SnakeBodyColors As Long 10 Private FoodColors As Long 11 Private MapCol As Long 12 Private MapTotal As Long 13 Private Key As Integer
地圖的創建:
1 Private Function CreateMap(ByVal TotalNum As Long, ByVal ColNum As Long, ByVal MapInitColor As Long) As Boolean 'Create the game map,if create success then return true,else return false 2 On Error Resume Next 3 Dim i As Long 4 If TotalNum <= 2 Then 5 CreateMap = False 6 Exit Function 7 Else 8 Map(1).BackColor = MapInitColor '初始顏色 9 For i = 2 To TotalNum '創建了70*70的區域 10 DoEvents 11 Load Map(i) 12 Map(i).Width = Map(i - 1).Width 13 Map(i).Visible = True 14 If (i - ColNum - 1) Mod ColNum = 0 Then 15 Map(i).Top = Map(i - 1).Top + Map(1).Height + 1 16 Map(i).Left = Map(1).Left 17 Else 18 Map(i).Top = Map(i - 1).Top 19 Map(i).Left = Map(i - 1).Left + Map(1).Width + 1 20 End If 21 22 Next 23 CreateMap = True 24 End If 25 End Function
地圖坐標初始化:
1 Private Sub MapXyInit() '地圖坐標初始化 2 Dim i As Integer 3 For i = 1 To MapTotal 4 MapXy(i).lx = 0 '0是無障礙,1是障礙(包含蛇自身),2是食物 5 MapXy(i).X = Fix(i / (1 + MapCol)) + 1 'x坐標是除數+1 6 MapXy(i).Y = i - (MapXy(i).X - 1) * MapCol 'y做差 7 Map(i).BackColor = MapColors 8 Next 9 End Sub
創建食物Food:
1 Sub CreatFood() '創建食物 2 3 Randomize 4 a: 5 Food.X = Int(Rnd() * (MapCol - 1 + 1) + 1) '這是food的x坐標:1-MapCol 6 Food.Y = Int(Rnd() * (MapCol - 1 + 1) + 1) '這是food的y坐標:1-MapCol 7 8 If MapXy(((Food.X) - 1) * MapCol + Food.Y).lx = 1 Then '這里就以食物所在的位置是否為紅就可以判斷是不是在蛇身上 9 GoTo a 10 Else 11 MapXy(((Food.X) - 1) * MapCol + Food.Y).lx = 2 '表示創建了食物,類型是2 12 Map((((Food.X) - 1) * MapCol + Food.Y)).BackColor = FoodColors '食物的顏色是綠色 13 End If 14 15 End Sub
創建蛇:
1 Private Sub CreateSnake() '創建蛇自身 2 On Error Resume Next 3 SnakeLength = 1 4 ReDim Preserve Snake(SnakeLength) '重新定義蛇的長度 5 Randomize 6 Snake(SnakeLength).X = Int(Rnd() * (MapCol - 1 + 1) + 1) 7 Snake(SnakeLength).Y = Int(Rnd() * (MapCol - 1 + 1) + 1) 8 MapXy((Snake(SnakeLength).X - 1) * MapCol + Snake(SnakeLength).Y).lx = 1 '表示為有障礙 9 Map((Snake(SnakeLength).X - 1) * MapCol + Snake(SnakeLength).Y).BackColor = SnakeHeadColors 10 End Sub
蛇吃食物的身體變化:
1 Sub EatFood() '吃food的坐標變化 2 3 Dim i 4 5 Dim temp() As xy 6 7 If Snake(SnakeLength).X = Food.X And Snake(SnakeLength).Y = Food.Y Then '表示吃到食物 8 ReDim Preserve temp(SnakeLength + 1) '暫時存放 9 10 For i = 1 To UBound(Snake) 11 temp(i + 1) = Snake(i) 12 Next 13 14 temp(1) = wbtemp '將尾巴坐標置入 15 SnakeLength = SnakeLength + 1 16 ReDim Preserve Snake(SnakeLength) '重新改變長度 17 18 For i = 1 To SnakeLength 19 Snake(i) = temp(i) 20 Next 21 Call CreatFood 22 End If 23 24 End Sub
蛇身體的移動:
1 Private Function SnakeMove(a() As xy, b As xy) '這是蛇身體的移動 2 Dim i As Long 3 If UBound(a) > 1 Then 4 wbtemp = a(1) 5 Map((a(1).X - 1) * MapCol + a(1).Y).BackColor = MapColors '尾巴顏色黑 6 MapXy(((a(1).X - 1) * MapCol + a(1).Y)).lx = 0 7 For i = 1 To UBound(a) - 1 8 a(i) = a(i + 1) 9 Map((a(i).X - 1) * MapCol + a(i).Y).BackColor = SnakeBodyColors '尾巴紅 10 Next 11 a(UBound(a)) = b 12 Map((b.X - 1) * MapCol + b.Y).BackColor = SnakeHeadColors '頭顏色藍 13 MapXy((b.X - 1) * MapCol + b.Y).lx = 1 14 Else '表明只有蛇頭 15 wbtemp = a(UBound(a)) 16 Map((wbtemp.X - 1) * MapCol + (wbtemp.Y)).BackColor = MapColors '尾巴顏色黑 17 MapXy(((a(UBound(a)).X - 1) * MapCol + a(UBound(a)).Y)).lx = 0 18 a(UBound(a)) = b 19 Map((b.X - 1) * MapCol + b.Y).BackColor = SnakeHeadColors '頭顏色藍 20 MapXy((b.X - 1) * MapCol + b.Y).lx = 1 21 End If 22 EatFood 23 End Function
蛇在移動的前提下向上移動,這里注意墻和障礙物的定義,不能穿墻和穿越自己的身體:
1 Sub Move_Up() '向上移動 2 Dim g As xy 3 If Snake(SnakeLength).X > 1 Then 4 If MapXy((Snake(SnakeLength).X - 2) * MapCol + Snake(SnakeLength).Y).lx <> 1 Then 5 g.X = Snake(SnakeLength).X - 1 6 g.Y = Snake(SnakeLength).Y 7 SnakeMove Snake, g 8 Else 9 Alive = False 10 End If 11 12 Else 13 Alive = False 14 End If 15 16 End Sub
蛇向下移動:
1 Sub Move_Down() '向下移動 2 Dim g As xy 3 If Snake(SnakeLength).X < MapCol Then 4 If MapXy((Snake(SnakeLength).X) * MapCol + Snake(SnakeLength).Y).lx <> 1 Then 5 g.X = Snake(SnakeLength).X + 1 6 g.Y = Snake(SnakeLength).Y 7 SnakeMove Snake, g 8 Else 9 Alive = False 10 End If 11 12 Else 13 Alive = False 14 End If 15 16 End Sub
蛇向左移動:
1 Sub Move_Left() '向左移動 2 Dim g As xy 3 If Snake(SnakeLength).Y > 1 Then 4 If MapXy((Snake(SnakeLength).X - 1) * MapCol + Snake(SnakeLength).Y - 1).lx <> 1 Then 5 g.X = Snake(SnakeLength).X 6 g.Y = Snake(SnakeLength).Y - 1 7 SnakeMove Snake, g 8 Else 9 Alive = False 10 End If 11 12 Else 13 Alive = False 14 End If 15 16 End Sub
蛇向右移動:
1 Sub Move_Right() '向右移動 2 Dim g As xy 3 If Snake(SnakeLength).Y < MapCol Then 4 If MapXy((Snake(SnakeLength).X - 1) * MapCol + Snake(SnakeLength).Y + 1).lx <> 1 Then 5 g.X = Snake(SnakeLength).X 6 g.Y = Snake(SnakeLength).Y + 1 7 SnakeMove Snake, g 8 Else 9 Alive = False 10 End If 11 12 Else 13 Alive = False 14 End If 15 16 End Sub
下面給出一個70*70的地圖下,貪吃蛇的初始定義實例:
在這里我們可以隨便改變地圖的顏色,蛇頭的顏色,蛇身體的顏色,以及食物的顏色。
實例:
第一步:
1 Alive = True 2 MapColors = &HFF8080 '地圖自己的顏色 3 SnakeHeadColors = vbBlue 4 SnakeBodyColors = vbRed 5 FoodColors = vbGreen 6 MapCol = 70 7 MapTotal = 4900 8 CreateMap MapTotal, MapCol, MapColors '創建地圖 9 MapXyInit '地圖坐標初始化 10 CreateSnake 11 CreatFood
第二步:
1 Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) 2 Key = KeyCode 3 Select Case KeyCode 4 5 Case vbKeyA: 6 Move_Left 7 8 Case vbKeyD: 9 Move_Right 10 11 Case vbKeyW: 12 Move_Up 13 14 Case vbKeyS: 15 Move_Down 16 End Select 17 18 End Sub
這里的key是在接受鍵盤點擊后的緩存,保證蛇在操作后有一個開始的方向,這位貪吃蛇游戲增加難度,如同給蛇一個初速度。
這里我們再使用時間控件,進行事件處理:
1 If SnakeLength <= 20 Then 2 Timer2.Interval = 900 3 End If 4 If SnakeLength > 100 Then 5 Timer2.Interval = 200 6 End If 7 If SnakeLength > 20 And SnakeLength <= 100 Then 8 Timer2.Interval = 500 9 End If 10 If Key <> 0 And Alive = True Then 11 Call Form_KeyDown(Key, 0) 12 End If
這里分別以蛇的長度作為速度的改變,20,100。
這基礎之上,你還可以增加分數,例如我們使用時間控件,在事件中寫入:
Label1.Caption = "Score:" & 90 + SnakeLength * 10 & " Length:" & SnakeLength
這就是在初始化得分100的前提下得分,并顯示長度。
在此基礎上一個完整的貪吃蛇就完成了。與一般不同的是,這個貪吃蛇的地圖是label數組。移動全部在數組中。另外還需要我們定義一種新數據結構類型:
1 Type xy '二維坐標數據類型 2 X As Long 'x坐標 3 Y As Long 'y坐標 4 lx As Long '坐標的類型 5 End Type
如此,貪吃蛇就創建成功了。如下圖:

浙公網安備 33010602011771號