大家好,如果您还对扫雷下载电脑版安装不太了解,没有关系,今天就由本站为大家分享扫雷下载电脑版安装的知识,包括利用Python实现自动扫雷小脚本的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!
自动扫雷一般分为两种,一种是读取内存数据,而另一种是通过分析图片获得数据,并通过模拟鼠标操作,这里我用的是第二种方式。
代码已上传至GitHub:
https://github.com/chestnut-egg/GoMine
作者:chestnut_egg
源自:
https://www.cnblogs.com/chestnut-egg/p/9302238.html
入门Python其实很容易,但是我们要去坚持学习,每一天坚持很困难,我相信很多人学了一个星期就放弃了,为什么呢?其实没有好的学习资料给你去学习,你们是很难坚持的,这是小编收集的Python入门学习资料关注,转发,私信小编“01”,即可免费领取!希望对你们有帮助
一、准备工作
1.扫雷游戏
我是win10,没有默认的扫雷,所以去扫雷网下载
http://www.saolei.net/BBS/
2.python3
我的版本是python3.6.1
3.python的第三方库
win32api,win32gui,win32con,Pillow,numpy,opencv可通过pipinstall–upgradeSomePackage来进行安装注意:有的版本是下载pywin32,但是有的要把pywin32升级到最高并自动下载了pypiwin32,具体情况每个python版本可能都略有不同
我给出我的第三方库和版本仅供参考
二、关键代码组成
1.找到游戏窗口与坐标
34;TMain&34;Minesweeper?Arbiter?&窗口坐标\nleft?=?0\ntop?=?0\nright?=?0\nbottom?=?0\n\nif?hwnd:\n????print(&34;)\n????left,?top,?right,?bottom?=?win32gui.GetWindowRect(hwnd)\n????34;窗口坐标:&39;?&39;?&39;?&34;未找到窗口&锁定雷区坐标\n具体的像素值是通过QQ的截图来判断的\nleft?+=?15\ntop?+=?101\nright?-=?15\nbottom?-=?42\n\n数字1-8?周围雷数\ned?被打开?空白\nboom?普通雷\n扫描雷区图像\ndef?showmap():\n????img?=?ImageGrab.grab().crop(rect)\n????for?y?in?range(blocks_y):\n????????for?x?in?range(blocks_x):\n????????????this_image?=?img.crop((x?*?block_width,?y?*?block_height,?(x?+?1)?*?block_width,?(y?+?1)?*?block_height))\n????????????if?this_image.getcolors()?==?rgba_0:\n????????????????map[y][x]?=?0\n????????????elif?this_image.getcolors()?==?rgba_1:\n????????????????map[y][x]?=?1\n????????????elif?this_image.getcolors()?==?rgba_2:\n????????????????map[y][x]?=?2\n????????????elif?this_image.getcolors()?==?rgba_3:\n????????????????map[y][x]?=?3\n????????????elif?this_image.getcolors()?==?rgba_4:\n????????????????map[y][x]?=?4\n????????????elif?this_image.getcolors()?==?rgba_5:\n????????????????map[y][x]?=?5\n????????????elif?this_image.getcolors()?==?rgba_6:\n????????????????map[y][x]?=?6\n????????????elif?this_image.getcolors()?==?rgba_8:\n????????????????map[y][x]?=?8\n????????????elif?this_image.getcolors()?==?rgba_ed:\n????????????????map[y][x]?=?-1\n????????????elif?this_image.getcolors()?==?rgba_hongqi:\n????????????????map[y][x]?=?-4\n????????????elif?this_image.getcolors()?==?rgba_boom?or?this_image.getcolors()?==?rgba_boom_red:\n????????????????global?gameover\n????????????????gameover?=?1\n????????????????break\n????????????????34;无法识别图像&34;坐标&34;颜色&print(map)\n
(左右滑动可查看完整代码)
5.扫雷算法
这里我采用的最基础的算法
1.首先点出一个点
2.扫描所有数字,如果周围空白+插旗==数字,则空白均有雷,右键点击空白插旗
3.扫描所有数字,如果周围插旗==数字,则空白均没有雷,左键点击空白
4.循环2、3,如果没有符合条件的,则随机点击一个白块
点击白块\ndef?dig():\n????showmap()\n????iscluck?=?0\n????for?y?in?range(blocks_y):\n????????for?x?in?range(blocks_x):\n????????????if?1?<=?map[y][x]?and?map[y][x]?<=?5:\n????????????????boom_number?=?map[y][x]\n????????????????block_white?=?0\n????????????????block_qi?=?0\n????????????????for?yy?in?range(y?-?1,?y?+?2):\n????????????????????for?xx?in?range(x?-?1,?x?+?2):\n????????????????????????if?0?<=?yy?and?0?<=?xx?and?yy?<?blocks_y?and?xx?<?blocks_x:\n????????????????????????????if?not?(yy?==?y?and?xx?==?x):\n????????????????????????????????if?map[yy][xx]?==?0:\n????????????????????????????????????block_white?+=?1\n????????????????????????????????elif?map[yy][xx]?==?-4:\n????????????????????????????????????block_qi?+=?1if?boom_number?==?block_qi?and?block_white?>?0:for?yy?in?range(y?-?1,?y?+?2):\n????????????????????????for?xx?in?range(x?-?1,?x?+?2):\n????????????????????????????if?0?<=?yy?and?0?<=?xx?and?yy?<?blocks_y?and?xx?<?blocks_x:\n????????????????????????????????if?not(yy?==?y?and?xx?==?x):\n????????????????????????????????????if?map[yy][xx]?==?0:\n????????????????????????????????????????win32api.SetCursorPos([left?+?xx?*?block_width,?top?+?yy?*?block_height])\n????????????????????????????????????????win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,?0,?0,?0,?0)\n????????????????????????????????????????win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,?0,?0,?0,?0)\n????????????????????????????????????????iscluck?=?1\n????if?iscluck?==?0:\n????????luck()\n\n#随机点击\ndef?luck():\n????fl?=?1\n????while(fl):\n????????random_x?=?random.randint(0,?blocks_x?-?1)\n????????random_y?=?random.randint(0,?blocks_y?-?1)\n????????if(map[random_y][random_x]?==?0):\n????????????win32api.SetCursorPos([left?+?random_x?*?block_width,?top?+?random_y?*?block_height])\n????????????win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,?0,?0,?0,?0)\n????????????win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,?0,?0,?0,?0)\n????????????fl?=?0\n\n\ndef?gogo():\n????win32api.SetCursorPos([left,?top])\n????win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,?0,?0,?0,?0)\n????win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,?0,?0,?0,?0)\n????showmap()\n????global?gameover\n????while(1):\n????????if(gameover?==?0):\n????????????banner()\n????????????banner()\n????????????dig()\n????????else:\n????????????gameover?=?0\n????????????win32api.keybd_event(113,?0,?0,?0)\n????????????win32api.SetCursorPos([left,?top])\n????????????win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,?0,?0,?0,?0)\n????????????win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,?0,?0,?0,?0)\n????????????showmap()
好了,文章到此结束,希望可以帮助到大家。
