"迷宫”游戏DIY

Author: 赵玉勇 Date: 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