VB制作贪吃蛇游戏

制作的界面要求是棋盘状的就是有网格的,让蛇在上面走。还有怎么随机出现5个数字,吃掉数字使蛇增加相应的长度。急求谢了。
我只是要一个方法,说说就可以,具体的我自己去做,诚心的问,像2楼那样的别说话!

[email protected]

把代码复制到空窗体中按F5运行即可。

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.ScaleWidth = 24
Me.ScaleHeight = 24
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个回答  2008-08-12
偶以前试过,方法可能比较笨,不过总算能玩~~
VB的语法不太记得了,有些地方可能会写错~~
先用一个二维数组记录网格上每个位置的状态,如:0表示空格,1表示有可以吃的东西,2表示蛇身覆盖的位置,等等~~这个数组在蛇身移动时或者吃东西时要更新的,一定要让它在任意时刻都是准确的,后面才能用它来作判断~~
蛇的话,也要用一个数组记录蛇身上每一节在网格里的位置。
可以先定义一个结构体
with type Pos
x as integer
y as integer
end with
蛇身的动态数组就是 dim Snake() as Pos
要用动态数组,它吃了东西才能增长~~初始化时要用redim给它赋一个长度
每一次移动或吃了东西都要更新这个数组~~
可以写一个函数来增长蛇身的长度
sub GrowUp( i as integer ) ' i 就是要增长的长度
dim iLen as integer
iLen = UBound(Snake) '原数组的长度
redim preserve Snake(iLen + i) '数组增长了,声明了preserve,所以原来的数据不受影响
'然后为新增部分赋值,把蛇尾的座标赋给它,当蛇吃完东西后继续向前移动时,蛇身才逐渐伸长~~不能直接把伸长的蛇身画到网格上,这样可能会伸出网格外的~~
for k = 1 to i
Snake(iLen + k) = Snake(iLen)
'这里假设Snake数组的下标是从1开始的,上面这句如果出错,应该是语法问题,那就改成这样好了
'Snake(iLen + k).x = Snake(iLen).x
'Snake(iLen + k).y = Snake(iLen).y
next
end sub

至于产生随机数,可以写个函数
参数iMin和iMax表示随机数的范围,即要取1到5的随机数就写RandNum(1, 5)
function RandNum( iMin as integer, iMax as integer ) as integer
Randomize '这句一直不明白是啥意思,但是要加上才能取得真正的随机数
RandNum = (iMax - iMin) * Rnd + iMin
end function

大致如此吧~~以上代码未经运行,不知道有没有写错,语法也确实不太记得了~~
第2个回答  2008-08-27
我的思路是这样的:
一、初始化蛇的长度初值。
二、产生一个网格数组,表示网格数目,初始值为0,然后在窗体或picture控件上画网格;
三、通过form_keypres()函数监视用户按键,并根据方向键值画蛇,当然画之前必须先清除原来画的蛇。
四、蛇的数量问题。程序开始时,随机产生5个数字,产生后在网格数组相应位置赋值为1,当蛇经过该网格时,如果判断该网格对应的数组值为1,则表示遇到了数字,然后蛇的长度增加1(表示吃掉),清除该点数字,同时对应的网格数组位置赋值由1变为0。此时检查网格数组,如果数组中的每个元素值均为0,则表示全部吃掉,又随机产生5个数字。。。(方法同上)
五、当然在用户没有按键时,如果让蛇自动行走,则还需一个timer控件。
六、其它。比如对蛇运行路线的出格问题,音效、画面问题,请自行设计。
第3个回答  2008-08-11
界面其实就和实现了差不多了,你要自己设计一种方法!

比如可以用(好像是叫)MSFlexGrid这个控件当棋盘,就可以通过控制他的那些cel 和row 属性实现你要的功能!射就是相应的格子里打印一个 字符,,通过随机数设计一种和网格的对应关系等等!

实现方法很多,要自己思考再实现!!
第4个回答  2008-08-12
Public Key As Byte
Public Cur As Long
Public MTime As Byte

Sub CrankItUp()
Cur = ShowCursor(0)
ModDX7.Init Me.hWnd
End Sub

Sub ShutItDown()
ShowCursor Cur
ModDX7.EndIt Me.hWnd
End Sub

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Key = KeyCode

Select Case KeyCode

Case vbKeyEscape
ModSurfaces.UnloadAllPics
ModDX7.RestoreDisplayMode
Form1.ShutItDown
End

Case vbKeyUp
If Snake.Facing <> dDOWN Then TurnSnake dUP

Case vbKeyDown
If Snake.Facing <> dUP Then TurnSnake dDOWN

Case vbKeyLeft
If Snake.Facing <> dRIGHT Then TurnSnake dLEFT

Case vbKeyRight
If Snake.Facing <> dLEFT Then TurnSnake dRIGHT

End Select

End Sub

Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer)
Key = 0
End Sub

Private Sub Form_Load()
Move 0, 0, 640, 480
MMControl1.FileName = App.Path & "\Soundz\Music.mid"
End Sub

Private Sub FramesT_Timer()
Debug.Print "FPS = " & Frames

Frames = 0
End Sub

Sub ConvertEm()
LoadPic = LoadPicture(App.Path & "\Graphix\Background.jpg")
SavePic = LoadPic
SavePicture SavePic.Picture, App.Path & "\Graphix\Background.bmp"

LoadPic = LoadPicture(App.Path & "\Graphix\Intro.jpg")
SavePic = LoadPic
SavePicture SavePic.Picture, App.Path & "\Graphix\Intro.bmp"

LoadPic = LoadPicture(App.Path & "\Graphix\Goodbye.jpg")
SavePic = LoadPic
SavePicture SavePic.Picture, App.Path & "\Graphix\Goodbye.bmp"
End Sub

Sub Play()
MMControl1.Command = "Open"
MMControl1.Command = "Play"
MusicTime.Enabled = True
End Sub

Sub ShutYerNoise()
MMControl1.Command = "Stop"
MMControl1.Command = "Close"
MusicTime.Enabled = False
End Sub

Private Sub MusicTime_Timer()
MTime = MTime + 1
If MTime = 113 Then
ShutYerNoise
Play
MTime = 0
End If
End Sub
相似回答