"迷宫”游戏DIY 赵玉勇 2001年 9期 元宵节晚上看灯谜的时候,我让“迷宫”游戏给迷住了,从一个复杂宫殿的这头,通过其中曲曲折折的路径终于走到那头,一个字:爽!爽的同时,也不禁产生出想法,能不能自己做个迷宫游戏呢?答案是肯定的。    用电脑怎样做这个游戏呢?要想通过电脑玩迷宫游戏,当然首先得有一个迷宫,然后还要有人,另外还得通过什么东西来控制宫内的人。    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