"迷宫”游戏DIY
用电脑怎样做这个游戏呢?要想通过电脑玩迷宫游戏,当然首先得有一个迷宫,然后还要有人,另外还得通过什么东西来控制宫内的人。
1.界面设计
这个游戏的界面拐弯抹角的,看起来很复杂,其实很简单,迷宫的外表如图所示。一个Form窗体和一个PictureBox图片框,并且Form的Caption属性值为“迷宫游戏”,图片框命名为PicPlayer,Picture为一人头形的图片或者是一个小人,可以从自己的机器中找现成的,找不到现成的,可用画图程序自己画一幅。(^09020501a^)
2.建立迷宫
因为迷宫的式样成百上千,所以我们可以将迷宫的信息通过文件的形式来存放。一个信息是迷宫有多少行多少列,行列由多少像素点组成的,再者还要弄清楚什么是墙什么是通道,人是不能穿墙而过的,还有迷宫内的人的起点和终点。
迷宫的信息在data1.txt中,文件正文如下:总计12行,比图上的迷宫多一行,第一行为11,35,代表迷宫的行数和列数,第2行到第12行总计11行中放有迷宫的信息,T代表墙,F代表通道,S为起点,E为终点。
文件中的信息是我们编程的依据。分别建立子程序Loadmaze()来输入数据,输入的数据放到一个11X35的二维数组里,利用数组值,通过Drawmaze()来画出迷宫(子程序请看源程序)。
3.人的走动
人的走动事实上就是对PictureBox的控制。它的移动通过四个光标移动键来完成;移动的动画过程实际是一个假动画,是通过将一个擦除动作和一个显示动作综合起来完成的。
通过对方向键的事件控制,利用PaintPicture PicPlayer.Picture,x,y来显示人移动到不同位置。前一位置上的图像则通过如下语句:Line(x-0.5,y-0.5)-Step(PicPlayer.Width,PicPlayer.Height),vbWhite,BF来实现擦除,这样就实现了动画。
4.源程序
Private NumRow,NumCol As Integer
Dim LegalMove() As Boolean '迷宫记录数组
Private PlayR,PlayC As Integer
Private RFinish,CFinish As Integer
Private StarTime As Single
Private Sub LoadMaze() '输入迷宫数据过程
Dim fnum As Integer
Dim r,c As Integer
Dim ch As String
Dim R_info As String
Fnum=FreeFile
Open "c:\data1.txt" For Input As #fnum '从数据文件读取迷宫数据
Input #fnum,NumRow,NumCol
ReDim LegalMove(1 To NumRow,1 To NumCol)
For r=1 To NumRow
Line Input #fnum,R_info
For c=1 To NumCol
ch=Mid$(R_info,c,1)
If ch="T" Then '迷宫墙体
LegalMove(r,c)=True
Else
If ch="S" Then PlayR=r: PlayC=c '人的起点
If ch="E" Then Rfinish=r: Cfinish=c '迷宫终点
LegalMove(r,c)=False '迷宫通道
End If
Next c
Next r
Close #fnum
Width=ScaleX(15*NumCol,ScaleMode,vbTwips)+Width-ScaleX(ScaleWidth ,ScaleMode,vbTwips)
Height=ScaleY(15*NumRow,ScaleMode,vbTwips)+Height-ScaleY(ScaleHeight,ScaleMode,vbTwips)
DrawMaze '根据数据画迷宫
PositionPlayer PlayR,PlayC '显示人的位置
StarTime=Timer '保存开始时间
End Sub
Private Sub PositionPlayer(ByVal r As Integer,ByVal c As Integer) '移动人的位置子程序
Dim x,y As Single
If PlayR>0 Then '消除游戏者的位置
x=(PlayC-1)*15+(15-PicPlayer.Width)/2
y=(PlayR-1)*15+(15-PicPlayer.Height)/2
Line (x-0.5,y-0.5)-Step(PicPlayer.Width,PicPlayer.Height),vbWhite,BF
End If
'移动
PlayR=r
PlayC=c
'移动游戏者
x=(c-1)*15+(15-PicPlayer.Width)/2
y=(r-1)*15+(15-PicPlayer.Height)/2
PaintPicture PicPlayer.Picture,x,y '画出变化的游戏者
If r=RFinish And c=CFinish Then '结束游戏后的处理
If MsgBox("您赢了,用了"&Int(Timer-StarTime)&"秒"&vbCrLf&"继续吗?",vbYesNo,"祝您成功")=vbYes Then
Form_Load
Else
Unload Me
End If
End If
End Sub
Private Sub DrawMaze() '利用迷宫数组画迷宫图
Dim r,c As Integer
Dim clr As Long
Dim r,c As Integer '迷宫的行数和列数
Cls
For r=1 To NumRow
For c=1 To NumCol
If LegalMove(r,c)=False Then
If r=RFinish And c=CFinish Then
Clr=vbYellow '结束位置黄色显示
Else
Clr=vbWhite '通道显示为白色
End If
Else
Clr=RGB(128,128,128) '其他地方的颜色
End If
Line(c*15,r*15)-Step(-15,-15),clr,BF '画迷宫
Next c
Next r
End Sub
Private Sub Form_KeyDown(KeyCode As Integer,Shift As Integer)
Dim r As Integer
Dim c As Integer
r=PlayR
c=PlayC
Select Case KeyCode '处理4光标移动键
Case vbKeyLeft
c=PlayC-1
Case vbKeyRight
c=PlayC+1
Case vbKeyDown
R=PlayR+1
Case vbKeyUp
R=PlayR-1
Case Else
Exit Sub
End Select
If c<=1 Then c=1 '防止出界
If LegalMove(r,c)=False Then PositionPlayer r,c '避免穿墙
End Sub
Private Sub Form_Load()
ScaleMode=vbPixels '转换输出模式
AutoRedraw=True
PicPlayer.Visible=False
LoadMaze
End Sub