ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 11667|回复: 27

[原创] Excel版扫雷

[复制链接]

TA的精华主题

TA的得分主题

发表于 2017-2-6 15:29 | 显示全部楼层 |阅读模式
本帖最后由 aoe1981 于 2017-2-6 19:02 编辑

  生疏多了!为了不使彻底遗忘,写了个Excel版扫雷,到坛子里留个印迹。
  附件如下: Excel版扫雷.rar (37.03 KB, 下载次数: 165)

  修复了一些已知错误: Excel版扫雷(修复已知错误1).zip (48.52 KB, 下载次数: 753)

  错误说明见8楼:http://club.excelhome.net/forum. ... 1326690&pid=8981125

评分

7

查看全部评分

TA的精华主题

TA的得分主题

发表于 2017-2-6 15:37 | 显示全部楼层
。。。。你居然冒泡了,好久不见

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2017-2-6 15:41 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-2-6 15:55 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
扫雷程序基本不难。挖雷时要么挖到雷,此时失败;要么挖到数字,用来提示,以便推理,寻找安全位置;要么挖出空格,这时才是最幸运的,会翻出一大片。所谓“一大片”,是遵循一定规则的。标准情况下,会以该空格为中心,探测周围8个格子(顶点处为3、边缘处为5)。探测情况有三种:1、探测到雷,不翻,停止向下探测;2、探测到数字,翻开,停止向下探测;3、探测到空格,翻开,继续以该空格为新的中心向下探测。

可以看出,扫雷代码的难点在于翻空格。这种连续向下的探测最切合递归的思路去解决。对于递归,是极艰深的。初次听闻,源于香川大侠。只学了些皮毛,如今又忘得差不多了。差点就将扫雷代码半途而废了。所幸利用的是单元格点选、改值事件,才发现这即是天然的递归。问题被顺利解决了,真是有点激动!

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-2-6 16:02 | 显示全部楼层
布雷是随机的,使用的是香川的办法产生“不重复随机数”,相关代码如下:
  1.     Randomize
  2.     For i = 1 To gezi - 1
  3.         r = Int(Rnd * (gezi - i + 1)) + i
  4.         t = xulie(i): xulie(i) = xulie(r): xulie(r) = t
  5.     Next i
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-2-6 16:09 | 显示全部楼层
工作簿保护密码是“123”。下一步拟加入一个实时的计时器,或加入单元格内,或以窗体内容显示,不清楚,目前无思路。目的是在排雷开始后实时显示秒数的递增,随时掌握所花时间,用来增加紧迫感。以目前的所知局限,不足以完成,得搜搜、试试,也请教思路于坛友。感谢!

TA的精华主题

TA的得分主题

发表于 2017-2-6 17:34 | 显示全部楼层
还不错,虽有些简陋,操作还不人性化
                                                ——扫雷专家

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-2-6 18:41 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
修复1:错误如下图: 错误.jpg

解决办法:防止无关事件的交叉启动,适时反复关开事件响应,相关代码如下:
  1.         Application.EnableEvents = False
  2.         For i = 1 To h
  3.             For j = 1 To l
  4.                 If shuzi(i, j) = "●" And Cells(i, j).Value <> "↓" Then Cells(i, j).Value = "↓"
  5.             Next j
  6.         Next i
  7.         tim1 = Int(Timer() - tim + 0.5)
  8.         mingzi = Application.InputBox("恭喜您获得了胜利!!!用时:" & tim1 & "秒。" & Chr(13) & Chr(13) & Chr(13) & Chr(13) & "玩家名字(有效长度12字符):", , , , , , , 2)
  9.         mingzi = Left(mingzi & "           无", 12)
  10.         With SJ
  11.             .Cells(.Cells(.Rows.Count, 2 * jibie).End(xlUp).Row + 1, 2 * jibie).Value = mingzi '记录闯关成功者名字
  12.             .Cells(.Cells(.Rows.Count, 2 * jibie + 1).End(xlUp).Row + 1, 2 * jibie + 1).Value = tim1 '记录闯关成功者成绩
  13.             If jibie = 4 Then .Cells(.Cells(.Rows.Count, 2 * jibie + 2).End(xlUp).Row + 1, 2 * jibie + 2).Value = h & "*" & l & "/" & lei '记录自定义闯关规格
  14.         End With
  15.         Cells(h + 1, l + 2).Value = ""
  16.         Application.EnableEvents = True '★★★结束出口3
  17.         End '此处不用Exit Sub是为了防止游戏结束后再逐层返回递归调用上层程序,但会释放所有变量
复制代码
完善1:增加自定义排行,否则,自定义扫雷提示输入名字而不展示排行,逻辑不通。如图:
自定义排行.jpg
也正是有了自定义模块,才在一些特例中发现了程序中存在的隐蔽问题。比如:15*15方格中仅有2颗雷时,多数情况下应该是挖一下即胜利,但本程序不见得,似乎事件的递归有次数限制(瞎猜),有点费解!

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-2-6 18:52 | 显示全部楼层
游戏结束出口有三:1、旗子全部准确插完获胜;2、挖开所有数字,无空格,或中途有空格,最后一步是挖开数字胜利;3.最后一步挖开空格,调用事件递归全部挖开获胜。
每一个出口处都用end,比较彻底,尤其对于出口3,可以防止在递归调用事件时,使用exit sub时层层返回,而执行多次输入名字对话框操作。

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-2-6 18:54 | 显示全部楼层
令人费解的错误来自下图所示: 费解.jpg
26*26的格子,只有一个雷,应该一次递归挖完,但是没有,奇怪!!!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-23 20:35 , Processed in 0.046410 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表