程序辅助扫雷的几种方法
2003.9.6
我的手很笨,不怕大家笑话,挖地雷从来没有低过 140(从Windows3.1开始),所以有时候就想做个程序“辅助一下”。以下是自己想到的几种方法。
方法 1: 让程序替我们挖
先人工挖开一片“空地”,然后启动我们的程序,读扫雷程序的 Window 的界面 DC,然后进行简单的图像提取,提取出已经挖开的空地内的所有数字,设计一个算法计算哪些方块下面有地雷,以此向扫雷的 Window 发鼠标消息(左、右单击),看着扫雷的界面一块一块的展开,直到必须人工“蒙”的时候,人工干预一下。如果算法写不好可能比较慢(但比我自己挖快多了)。
前几天在清华的BBS上看到了一个人用 Java 写的这样一个程序,具体位置记不清了。
方法 2: 打开地雷图我们自己挖
启动扫雷程序后,启动我们的程序,然后做两个事情:一,把扫雷程序的 Windows 设置成透明的(Alpha值稍大于0,只能在win2k、xp上),把我们的程序做成界面与扫雷的一模一样,但不透明,然后放到扫雷程序的 Window 的后面。二,从扫雷程序的进程地址中读取内部数据,得到每个地雷的位置,然后显示在我们的程序的界面上,哈哈,是不是感觉地雷图已经打开了,我们只要狂点扫雷程序的没有地雷的地方就可以了。
CSDN 上有文章讲如何从扫雷进程中取得地图数据:http://www.csdn.net/develop/Article/19/19921.shtm
http://expert.csdn.net/Expert/topic/2188/2188775.xml?temp=.1479456
方法 3: 程序自己打开地图自己挖
我们的程序从扫雷进程中取得地图数据,然后向扫雷程序的 Window 发一堆鼠标消息(左、右单击),直接将所有地雷挖出来。估计会很快,但是不是没什么乐趣了?
方法 4: 恶作剧
我们的程序从扫雷进程中取得地图数据,然后生成地雷已经全挖开的结果界面(位图),然后直接将位图写到扫雷程序的 Window 的 DC 中,结果会怎么样?是不是如果鼠标点的话,地雷已经全挖开了,而计时器仍然在跳?
方法 5: 停止计时器
这是我实际做过的一个方法。我们的程序运行时,向系统中塞进去一个消息钩子,把扫雷程序的 Window 的 WM_TIMER 改掉,想开始计时再改回来。这样,我可以心安理得的挨个判断地雷,不用担心计时器,可是到头来却发现扫雷变成了10以内的数学判断。
方法 6: 让扫雷程序自己挖开
我们的程序运行的时候,替换掉扫雷进程的某断代码或塞进去一个钩子,结果是点击那个小黄脸的时候,地图就全挖开了。关于这个方法我只是猜想,没有实际的经验,只能估计可行。