微信公众号 
图码生活

每天发布有五花八门的文章,各种有趣的知识等,期待您的订阅与参与
电脑报 1992-2001 十年文章全集
电脑报 1992-2001 十年文章全集
包含从 1992 年 - 2001 年间,两万余篇期刊文章,查询最少输入两个字符
随便看看
读取中
读取中
标题"迷宫”游戏DIY
栏目软件世界
作者赵玉勇
发布2001年9期
  元宵节晚上看灯谜的时候,我让“迷宫”游戏给迷住了,从一个复杂宫殿的这头,通过其中曲曲折折的路径终于走到那头,一个字:爽!爽的同时,也不禁产生出想法,能不能自己做个迷宫游戏呢?答案是肯定的。
  用电脑怎样做这个游戏呢?要想通过电脑玩迷宫游戏,当然首先得有一个迷宫,然后还要有人,另外还得通过什么东西来控制宫内的人。
  1.界面设计
  这个游戏的界面拐弯抹角的,看起来很复杂,其实很简单,迷宫的外表如图所示。一个Form窗体和一个PictureBox图片框,并且Form的Caption属性值为“迷宫游戏”,图片框命名为PicPlayer,Picture为一人头形的图片或者是一个小人,可以从自己的机器中找现成的,找不到现成的,可用画图程序自己画一幅。(

)
  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