微信公众号 
图码生活

每天发布有五花八门的文章,各种有趣的知识等,期待您的订阅与参与
电脑报 1992-2001 十年文章全集
电脑报 1992-2001 十年文章全集
包含从 1992 年 - 2001 年间,两万余篇期刊文章,查询最少输入两个字符
随便看看
读取中
读取中
标题“扫雷”游戏自己编
栏目软件世界
作者赵玉勇
发布2001年8期
  我挺爱扫雷,那是集运气和推理于一身的好游戏。趁过年刚休完假,亲戚朋友大团圆的好心情,自己也做了个扫雷的游戏,和大伙交流交流,有些不尽如人意的地方,希望大家不吝赐教!
  第一步:熟悉的界面
  首先,用VB的Command Button来代表界面中的方格子。当然,一堆命令按钮零乱地堆积起来是没用的,以8×8为例,我们可用它们的数组形式,Command1(0)...Command1(63),用C表示,大体排列采取自上而下自左而右的方式。数组可通过复制的形式完成,为了便于集中管理,我们可将上面64个按钮放于一Frame框上(

)。
  接着,因为我们每挖开没有雷的地方,会有一个它周围雷的数目,以利于开展下面的工作,我们可在命令按钮的下面放置Label(标签),排列方式和制作方式同按钮相似,用L表示。值得注意的是标签的大小和命令按钮大小最好一样,可通过Propertis(属性)中的Height和Width值来设定。
  第二步:代码编写
  1.编程思路(请结合源程序看)
  通过随机数来布雷阵,设一数组Flag(63)为地雷标志数组,有雷则其值是1,无雷则其值为0,和Command1(1)-Command1(63)一一对应。
  不踩雷时需显示当前周围8个区域总计有几个雷,可通过FlagNum()数组来存放,但计算方法不一,“四个角”、“四条边不包含角”和“非四角四边”组成9个区域,可通过函数“Function JudgeNum(ByVal X As Integer) As Integer”来完成,其取值范围为0到8。踩雷后则应立即停止游戏,并可通过CmdRestart按钮重新开始。
  右键的Button属性值为2,利用此值,奇数次击右键出现“?”,偶数次则什么也不出现,通过设置标志变量FlagRMouse实现。应特别注意几个数组的联系。
  2.源程序
  因为挖雷是比较容易“不成功便成仁”的工作,我们可以再设置一命令按钮CmdRestart,它的功能是重新开始游戏,再设置一标签写上一些鼓励的话。
  Dim I,Hnum As Integer
  Dim Flag(63) As Integer '设置地雷标志数组
  Dim FlagNum(63) As Integer '某地区周围雷数目记录数组(0~8个)
  Dim FlagRMouse As Boolean '记录右键使用状态标志
  
  Private Function JudgeNum(ByVal X As Integer) As Integer '求地雷数函数
  Select Case X '9种情况
  Case 0
  JudgeNum=Flag(X+8)+Flag(X+9)+Flag(X+1)
  Case 1 To 6
  JudgeNum=Flag(X-1)+Flag(X+7)+Flag(X+8)+Flag(X+9)+Flag(X+1)
  Case 7
  JudgeNum=Flag(X+8)+Flag(X+7)+Flag(X-1)
  Case 56
  JudgeNum=Flag(X-8)+Flag(X-7)+Flag(X+1)
  Case 63
  JudgeNum=Flag(X-1)+Flag(X-9)+Flag(X-8)
  Case 8,16,24,32,40,48
  JudgeNum=Flag(X-8)+Flag(X-7)+Flag(X+1)+Flag(X+8)+Flag(X+9)
  Case 15,23,31,39,47,55
  JudgeNum=Flag(X-9)+Flag(X-8)+Flag(X-1)+Flag(X+7)+Flag(X+8)
  Case Is<55
   JudgeNum=Flag(X-9)+Flag(X-8)+Flag(X-7)+Flag(X-1)+Flag(X+1)+Flag(X+7)+
  Flag(X+8)+Flag(X+9)
  Case Else 'x<63
  JudgeNum=Flag(X-9)+Flag(X-8)+Flag(X-7)+Flag(X-1)+Flag(X+1)
  End Select
  End Function
  Private Sub CmdRestart_Click()
  '重新进入游戏
  Lblview.Caption="努力哟!"
  Frmboom.Enabled=True '激活雷区
  For i=0 To 63
  LabNum(i).Caption=""
  Command1(i).Visible=True
  Hnum=Rnd*4
  If Int(Hnum)=1 Then'随机布雷
  Flag(i)=1
  Else
  Flag(i)=0
  End If
  Next i
  For i=0 To 63 '求周围雷的数目
  FlagNum(i)=JudgeNum(i)
  Next i
  End Sub
  Private Sub Command1_Click(Index As Integer) '雷区,通过Command实现
  If Flag(Index)=1 Then '不幸中弹
  Command1(Index).Visible=False
  LabNum(Index).Caption="B"
  Lblview.Caption="再来一回合!"
  Frmboom.Enabled=False
  Else '开始挖雷,没有踩雷
  Command1(Index).Visible=False
  If FlagNum(Index)<>0 Then '显示周围雷的数目,为0则什么也不显示
  LabNum(Index).Caption=FlagNum(Index)
  End If
  End If
  End Sub
  
  Private Sub Command1_MouseDown(Index As Integer,Button As Integer,Shift As Integer,X As Single,Y As Single)
  '定义右键功能,右键的Button值为2
  i=Button
  If i=2 And FlagRMouse = False Then
  Command1(Index).Caption="?"
  FlagRMouse=True
  Else
  Command1(Index).Caption=""
  FlagRMouse=False
  End If
  End Sub
  Private Sub Form_Load() '主程序
  FlagRMouse=False '初始化右键提示标志
  Lblview.Caption="努力哟!"
  For i=0 To 63 '利用随机函数布雷,保证每次雷区不同
  LabNum(i).Caption=""
  Hnum=Rnd*4
  If Int(Hnum)=0 Then
  Flag(i)=1
  Else
  Flag(i)=0
  End If
  Next i
  For i=0 To 63 '利用JudgeNum()计算某点周围雷的数目,并放入数组
  FlagNum(i)=JudgeNum(i)
  Next i
  End Sub
  这样,一个酷似Windows自带游戏的扫雷程序就编好了。程序在VB5.0下调试通过。