云霞散人吧 关注:25贴子:275
  • 4回复贴,共1

简易贪吃蛇代码

取消只看楼主收藏回复

Option Explicit

Private WithEvents Timer1 As Timer
Private WithEvents Label1 As Label
Dim GFangXiang As Boolean
Dim HWB As Single
Dim She() As ShenTi
Dim X As Long, Y As Long
Dim ZhuangTai(23, 23) As Long
Private Type ShenTi
   F As Long
   X As Long
   Y As Long
End Type

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Dim C As Long
If KeyCode = 27 Then End
If KeyCode = 32 Then
   If Timer1.Enabled = True Then
      Timer1.Enabled = False
      Label1.Visible = True
   Else
      Timer1.Enabled = True
      Label1.Visible = False
   End If
End If
C = UBound(She)
If GFangXiang = True Then Exit Sub
Select Case KeyCode
Case 37
   If She(C).F = 2 Then Exit Sub
   She(C).F = 0
   GFangXiang = True
Case 38
   If She(C).F = 3 Then Exit Sub
   She(C).F = 1
   GFangXiang = True
Case 39
   If She(C).F = 0 Then Exit Sub
   She(C).F = 2
   GFangXiang = True
Case 40
   If She(C).F = 1 Then Exit Sub
   She(C).F = 3
   GFangXiang = True
End Select
End Sub

Private Sub Form_Load()
Me.AutoRedraw = True
Me.BackColor = &HC000&
Me.FillColor = 255
Me.FillStyle = 0
Me.WindowState = 2
Set Timer1 = Controls.Add("VB.Timer", "Timer1")
Set Label1 = Controls.Add("VB.Label", "Label1")
Label1.AutoSize = True
Label1.BackStyle = 0
Label1 = "暂停"
Label1.ForeColor = RGB(255, 255, 0)
Label1.FontSize = 50
ChuShiHua
End Sub

Private Sub Form_Resize()
On Error GoTo 1:
With Me
   If .WindowState <> 1 Then
      .Cls
      .ScaleMode = 3
      HWB = .ScaleHeight / .ScaleWidth
      .ScaleWidth = 24
      .ScaleHeight = 24
      Label1.Move (Me.ScaleWidth - Label1.Width) / 2, (Me.ScaleHeight - Label1.Height) / 2
      HuaTu
      Me.Line (X, Y)-(X + 1, Y + 1), RGB(255, 255, 0), BF
   End If
End With
1:
End Sub

Private Sub Timer1_Timer()
Dim C As Long, I As Long
On Error GoTo 2:
QingChu
C = UBound(She)
Select Case She(C).F
Case 0
   If ZhuangTai(She(C).X - 1, She(C).Y) = 2 Then
      C = C + 1
      ReDim Preserve She(C)
      She(C).F = She(C - 1).F
      She(C).X = She(C - 1).X - 1
      She(C).Y = She(C - 1).Y
      ChanShengShiWu
      GoTo 1:
   ElseIf ZhuangTai(She(C).X - 1, She(C).Y) = 1 Then
      GoTo 2:
   End If
Case 1
   If ZhuangTai(She(C).X, She(C).Y - 1) = 2 Then
      C = C + 1
      ReDim Preserve She(C)
      She(C).F = She(C - 1).F
      She(C).X = She(C - 1).X
      She(C).Y = She(C - 1).Y - 1
      ChanShengShiWu
      GoTo 1:
   ElseIf ZhuangTai(She(C).X, She(C).Y - 1) = 1 Then
      GoTo 2:
   End If
Case 2
   If ZhuangTai(She(C).X + 1, She(C).Y) = 2 Then
      C = C + 1
      ReDim Preserve She(C)
      She(C).F = She(C - 1).F
      She(C).X = She(C - 1).X + 1
      She(C).Y = She(C - 1).Y
      ChanShengShiWu
      GoTo 1:
   ElseIf ZhuangTai(She(C).X + 1, She(C).Y) = 1 Then
      GoTo 2:
   End If
Case 3
   If ZhuangTai(She(C).X, She(C).Y + 1) = 2 Then
      C = C + 1
      ReDim Preserve She(C)
      She(C).F = She(C - 1).F
      She(C).X = She(C - 1).X
      She(C).Y = She(C - 1).Y + 1
      ChanShengShiWu
      GoTo 1:
   ElseIf ZhuangTai(She(C).X, She(C).Y + 1) = 1 Then
      GoTo 2:
   End If
End Select
ZhuangTai(She(0).X, She(0).Y) = 0
For I = 0 To C
   Select Case She(I).F
   Case 0
      She(I).X = She(I).X - 1
   Case 1
      She(I).Y = She(I).Y - 1
   Case 2
      She(I).X = She(I).X + 1
   Case 3
      She(I).Y = She(I).Y + 1
   End Select
Next
TiaoZheng
1:
GFangXiang = False
ZhuangTai(She(C).X, She(C).Y) = 1
HuaTu
Exit Sub
2:
If MsgBox("游戏结束,点“是”重新开始游戏,点“否”", vbYesNo, "贪吃蛇") = vbYes Then
   ChuShiHua
Else
   End
End If
End Sub

Private Sub ChuShiHua()
Me.Cls
Timer1.Enabled = True
Timer1.Interval = 200
Erase ZhuangTai
ReDim She(2)
She(0).F = 2
She(0).X = 9
She(0).Y = 11
ZhuangTai(9, 11) = 1
She(1).F = 2
She(1).X = 10
She(1).Y = 11
ZhuangTai(10, 11) = 1
She(2).F = 2
She(2).X = 11
She(2).Y = 11
ZhuangTai(11, 11) = 1
HuaTu
ChanShengShiWu
End Sub

Private Sub QingChu()
Dim I As Long
For I = 0 To UBound(She)
   Me.Line (She(I).X, She(I).Y)-(She(I).X + 1, She(I).Y + 1), Me.BackColor, BF
Next
End Sub

Private Sub HuaTu()
Dim I As Long
For I = 0 To UBound(She)
   Me.Circle (She(I).X + 0.5, She(I).Y + 0.5), 0.49, RGB(255, 255, 0), , , HWB
Next
End Sub

Private Sub TiaoZheng()
Dim I As Long
For I = 0 To UBound(She) - 1
   She(I).F = She(I + 1).F
Next
End Sub

Private Sub ChanShengShiWu()
Randomize Timer
1:
X = Int(Rnd * 24)
Y = Int(Rnd * 24)
If ZhuangTai(X, Y) > 0 Then GoTo 1:
ZhuangTai(X, Y) = 2
Me.Line (X, Y)-(X + 1, Y + 1), RGB(255, 255, 0), BF
End Sub



1楼2006-12-22 15:41回复


    5楼2007-01-09 09:56
    回复
      2025-08-01 23:11:57
      广告
      不感兴趣
      开通SVIP免广告
      我这个什么也不用加,直接把代码放到窗体的代码窗口里,运行就行了,呵呵


      7楼2007-03-17 14:11
      回复
        这个ZhuangTai是一个二维数组,用来保存每个点的状态,0为空,1为蛇身,2为食物,呵呵!


        9楼2009-08-20 16:20
        回复
          Private Sub ChanShengShiWu() 
          Randomize Timer 
          1: 
          X = Int(Rnd * 24) 
          Y = Int(Rnd * 24) 
          If ZhuangTai(X, Y) > 0 Then GoTo 1: 
          ZhuangTai(X, Y) = 2 
          Me.Line (X, Y)-(X + 1, Y + 1), RGB(255, 255, 0), BF 
          End Sub
          这段代码是产生食物的,如果ZhuangTai(X,Y)>0的话说明在蛇身上,因为蛇身上不能产生食物,所以要Goto 1,重新随机找位置,呵呵!


          13楼2009-08-21 17:11
          回复