自动扫雷一般分为两种,一种是读取内存数据,而另一种是通过分析图片获得数据,并通过模拟鼠标操作,这里我用的是第二种方式。

代码已上传至GitHub:

https://github.com/chestnut-egg/GoMine

作者:chestnut_egg

源自:

https://www.cnblogs.com/chestnut-egg/p/9302238.html

一、准备工作

1.扫雷游戏

我是win10,没有默认的扫雷,所以去扫雷网下载

http://www.saolei.net/BBS/

2.python 3

我的版本是 python 3.6.1

3.python的第三方库

win32api,win32gui,win32con,Pillow,numpy,opencv
可通过 pip install --upgrade SomePackage 来进行安装
注意:有的版本是下载pywin32,但是有的要把pywin32升级到最高并自动下载了pypiwin32,具体情况每个python版本可能都略有不同

我给出我的第三方库和版本仅供参考

二、关键代码组成

1.找到游戏窗口与坐标

#扫雷游戏窗口class_name="TMain"title_name="MinesweeperArbiter"hwnd=win32gui.FindWindow(class_name,title_name)#窗口坐标left=0top=0right=0bottom=0ifhwnd:print("找到窗口")left,top,right,bottom=win32gui.GetWindowRect(hwnd)#win32gui.SetForegroundWindow(hwnd)print("窗口坐标:")print(str(left)+''+str(right)+''+str(top)+''+str(bottom))else:print("未找到窗口")

2.锁定并抓取雷区图像

#锁定雷区坐标#去除周围功能按钮以及多余的界面#具体的像素值是通过QQ的截图来判断的left+=15top+=101right-=15bottom-=42#抓取雷区图像rect=(left,top,right,bottom)img=ImageGrab.grab().crop(rect)

3.各图像的RGBA值

#数字1-8周围雷数#0未被打开#ed被打开空白#hongqi红旗#boom普通雷#boom_red踩中的雷rgba_ed=[(225,(192,192,192)),(31,(128,128,128))]rgba_hongqi=[(54,(255,255,255)),(17,(255,0,0)),(109,(192,192,192)),(54,(128,128,128)),(22,(0,0,0))]rgba_0=[(54,(255,255,255)),(148,(192,192,192)),(54,(128,128,128))]rgba_1=[(185,(192,192,192)),(31,(128,128,128)),(40,(0,0,255))]rgba_2=[(160,(192,192,192)),(31,(128,128,128)),(65,(0,128,0))]rgba_3=[(62,(255,0,0)),(163,(192,192,192)),(31,(128,128,128))]rgba_4=[(169,(192,192,192)),(31,(128,128,128)),(56,(0,0,128))]rgba_5=[(70,(128,0,0)),(155,(192,192,192)),(31,(128,128,128))]rgba_6=[(153,(192,192,192)),(31,(128,128,128)),(72,(0,128,128))]rgba_8=[(149,(192,192,192)),(107,(128,128,128))]rgba_boom=[(4,(255,255,255)),(144,(192,192,192)),(31,(128,128,128)),(77,(0,0,0))]rgba_boom_red=[(4,(255,255,255)),(144,(255,0,0)),(31,(128,128,128)),(77,(0,0,0))]

(左右滑动可查看完整代码)

4.扫描雷区图像保存至一个二维数组map

#扫描雷区图像defshowmap():img=ImageGrab.grab().crop(rect)foryinrange(blocks_y):forxinrange(blocks_x):this_image=img.crop((x*block_width,y*block_height,(x+1)*block_width,(y+1)*block_height))ifthis_image.getcolors()==rgba_0:map[y][x]=0elifthis_image.getcolors()==rgba_1:map[y][x]=1elifthis_image.getcolors()==rgba_2:map[y][x]=2elifthis_image.getcolors()==rgba_3:map[y][x]=3elifthis_image.getcolors()==rgba_4:map[y][x]=4elifthis_image.getcolors()==rgba_5:map[y][x]=5elifthis_image.getcolors()==rgba_6:map[y][x]=6elifthis_image.getcolors()==rgba_8:map[y][x]=8elifthis_image.getcolors()==rgba_ed:map[y][x]=-1elifthis_image.getcolors()==rgba_hongqi:map[y][x]=-4elifthis_image.getcolors()==rgba_boomorthis_image.getcolors()==rgba_boom_red:globalgameovergameover=1break#sys.exit(0)else:print("无法识别图像")print("坐标")print((y,x))print("颜色")print(this_image.getcolors())sys.exit(0)#print(map)

(左右滑动可查看完整代码)

5.扫雷算法

这里我采用的最基础的算法

1.首先点出一个点

2.扫描所有数字,如果周围空白+插旗==数字,则空白均有雷,右键点击空白插旗

3.扫描所有数字,如果周围插旗==数字,则空白均没有雷,左键点击空白

4.循环2、3,如果没有符合条件的,则随机点击一个白块

#插旗defbanner():showmap()foryinrange(blocks_y):forxinrange(blocks_x):if1<=map[y][x]andmap[y][x]<=5:boom_number=map[y][x]block_white=0block_qi=0foryyinrange(y-1,y+2):forxxinrange(x-1,x+2):if0<=yyand0<=xxandyy<blocks_yandxx<blocks_x:ifnot(yy==yandxx==x):ifmap[yy][xx]==0:block_white+=1elifmap[yy][xx]==-4:block_qi+=1ifboom_number==block_white+block_qi:foryyinrange(y-1,y+2):forxxinrange(x-1,x+2):if0<=yyand0<=xxandyy<blocks_yandxx<blocks_x:ifnot(yy==yandxx==x):ifmap[yy][xx]==0:win32api.SetCursorPos([left+xx*block_width,top+yy*block_height])win32api.mouse_event(win32con.MOUSEEVENTF_RIGHTDOWN,0,0,0,0)win32api.mouse_event(win32con.MOUSEEVENTF_RIGHTUP,0,0,0,0)showmap()#点击白块defdig():showmap()iscluck=0foryinrange(blocks_y):forxinrange(blocks_x):if1<=map[y][x]andmap[y][x]<=5:boom_number=map[y][x]block_white=0block_qi=0foryyinrange(y-1,y+2):forxxinrange(x-1,x+2):if0<=yyand0<=xxandyy<blocks_yandxx<blocks_x:ifnot(yy==yandxx==x):ifmap[yy][xx]==0:block_white+=1elifmap[yy][xx]==-4:block_qi+=1ifboom_number==block_qiandblock_white>0:foryyinrange(y-1,y+2):forxxinrange(x-1,x+2):if0<=yyand0<=xxandyy<blocks_yandxx<blocks_x:ifnot(yy==yandxx==x):ifmap[yy][xx]==0:win32api.SetCursorPos([left+xx*block_width,top+yy*block_height])win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0,0,0,0)win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,0,0,0,0)iscluck=1ifiscluck==0:luck()#随机点击defluck():fl=1while(fl):random_x=random.randint(0,blocks_x-1)random_y=random.randint(0,blocks_y-1)if(map[random_y][random_x]==0):win32api.SetCursorPos([left+random_x*block_width,top+random_y*block_height])win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0,0,0,0)win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,0,0,0,0)fl=0defgogo():win32api.SetCursorPos([left,top])win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0,0,0,0)win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,0,0,0,0)showmap()globalgameoverwhile(1):if(gameover==0):banner()banner()dig()else:gameover=0win32api.keybd_event(113,0,0,0)win32api.SetCursorPos([left,top])win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0,0,

利用Python实现自动扫雷小脚本相关推荐

  1. python扫雷脚本_利用 Python 实现 自动扫雷 小脚本

    原标题:利用 Python 实现 自动扫雷 小脚本 自动扫雷一般分为两种,一种是读取内存数据,而另一种是通过分析图片获得数据,并通过模拟鼠标操作,这里我用的是第二种方式.一.准备工作1.扫雷游戏 我是 ...

  2. python扫雷脚本_利用Python实现自动扫雷小脚本

    自动扫雷一般分为两种,一种是读取内存数据,而另一种是通过分析图片获得数据,并通过模拟鼠标操作,这里我用的是第二种方式. 代码已上传至GitHub: https://github.com/chestnu ...

  3. python自动扫雷_利用Python实现自动扫雷

    自动扫雷一般分为两种,一种是读取内存数据,而另一种是通过分析图片获得数据,并通过模拟鼠标操作,这里我用的是第二种方式. 一.准备工作 我的版本是 python 3.6.1 python的第三方库: w ...

  4. python自动卸载win程序_利用python实现自动扫雷程序

    自动扫雷一般分为两种,一种是读取内存数据,而另一种是通过分析图片获得数据,并通过模拟鼠标操作,这里我用的是第二种方式. 一.准备工作 1.扫雷游戏 我是win10,没有默认的扫雷,所以去扫雷网下载 h ...

  5. python扫雷 高级算法_利用Python实现自动扫雷

    自动扫雷一般分为两种,一种是读取内存数据,而另一种是通过分析图片获得数据,并通过模拟鼠标操作,这里我用的是第二种方式. 一.准备工作 我的版本是 python 3.6.1 python的第三方库: w ...

  6. python制作阴阳师脚本_利用python制作一个阴阳师小游戏

    利用python制作一个阴阳师小游戏 发布时间:2020-11-27 13:59:49 来源:亿速云 阅读:84 这期内容当中小编将会给大家带来有关利用python制作一个阴阳师小游戏,文章内容丰富且 ...

  7. 利用Python实现自动批量图片格式转换

    文章目录 利用Python实现自动批量图片格式转换 0.背景 1.简单思路 2.进一步改进 3.最终版本 4.总结 利用Python实现自动批量图片格式转换 0.背景 在一个漫画网站下载了一些图片,但 ...

  8. python英语词汇读音_利用Python制作查单词小程序(一):抓取来自百度翻译的单词释义和音标...

    小编在学习英语的时候,遇到不认识的英语单词,会用百度翻译来查询单词的释义和音标,并播放单词的读音.为了便于复习和记忆,需要将单词的释义和音标以复制粘贴的方式保存到本地. 这个过程非常繁琐,于是小编就想 ...

  9. python扫雷算法_如何基于Python实现自动扫雷

    这篇文章主要介绍了如何基于Python实现自动扫雷,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 自动扫雷一般分为两种,一种是读取内存数据,而另一种 ...

最新文章

  1. python创建mysql数据库_python 怎么创建create mysql的数据库
  2. Android中实现双击屏幕跳转
  3. [原创]Net实现Excel导入导出到数据库(附源码)
  4. 570D Codeforces Round #316 (Div. 2) D(dfs序,时间戳,二分
  5. 引用程序集没有强名称解决办法
  6. MySQL高级 - SQL优化 - 索引提示
  7. 安卓开发首次创建项目一直转圈_Android视频开发进阶(part3Android的Media API)
  8. 三菱socket通信实例_三菱自动化产品相关知识整理汇总
  9. 获取某个周在本年的开始日期和结束日期
  10. 科技部部长:不唯论文,不是讲不要论文
  11. Ubuntu 14.04 或者16.04开启root账户登录和图形界面登录root时候的报错解决方法
  12. 图解 Go 切片的深拷贝和浅拷贝
  13. UVA1585 UVALive3354 Score【水题】
  14. js 使用image.height和image.width获取图片宽高值为0,获取失败
  15. 相机成像原理RAW,RGB,YUV
  16. html怎样调节字间距,css怎么调整字间距?
  17. npm报错 443(error : getaddrinfo enotfound registry.npmjs.org registry.npmjs.org:443)
  18. MAC 安装windows
  19. (心得三)java俄罗斯方块小游戏编写心得
  20. AH6953锂电池9V升12V输出大电流3A-5A

热门文章

  1. 编程题003--合并二叉树--niuke
  2. 流量和带宽的真实关系
  3. 原生分页查询原理步骤解析
  4. 自己用VB.net开发的小型ERP系统,作为开发ERP系统的 一个参考
  5. 经颅电刺激对生理和病理衰老过程中情景记忆的影响
  6. 计算机密码学试题,现代密码学试卷(含答案)
  7. HDD/SSD基础知识及工作原理
  8. 解决订单收据编号的累加问题。格式 D0000001;java+ mysql
  9. 笔记本拆c面_拆解C面准备步骤 注意拧下所有螺丝_Alienware 15_笔记本评测-中关村在线...
  10. Zigbee、Wifi、蓝牙三种无线信技术对比