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

一、准备工作

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版本可能都略有不同

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

二、关键代码组成

找到游戏窗口与坐标

#扫雷游戏窗口
#Python学习交流群:973783996
class_name = "TMain"
title_name = "Minesweeper Arbiter "
hwnd = win32gui.FindWindow(class_name, title_name)#窗口坐标
left = 0
top = 0
right = 0
bottom = 0if hwnd:print("找到窗口")left, top, right, bottom = win32gui.GetWindowRect(hwnd)#win32gui.SetForegroundWindow(hwnd)print("窗口坐标:")print(str(left)+' '+str(right)+' '+str(top)+' '+str(bottom))
else:print("未找到窗口")

锁定并抓取雷区图像

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

各图像的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))]

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

#扫描雷区图像
def showmap():img = ImageGrab.grab().crop(rect)for y in range(blocks_y):for x in range(blocks_x):this_image = img.crop((x * block_width, y * block_height, (x + 1) * block_width, (y + 1) * block_height))if this_image.getcolors() == rgba_0:map[y][x] = 0elif this_image.getcolors() == rgba_1:map[y][x] = 1elif this_image.getcolors() == rgba_2:map[y][x] = 2elif this_image.getcolors() == rgba_3:map[y][x] = 3elif this_image.getcolors() == rgba_4:map[y][x] = 4elif this_image.getcolors() == rgba_5:map[y][x] = 5elif this_image.getcolors() == rgba_6:map[y][x] = 6elif this_image.getcolors() == rgba_8:map[y][x] = 8elif this_image.getcolors() == rgba_ed:map[y][x] = -1elif this_image.getcolors() == rgba_hongqi:map[y][x] = -4elif this_image.getcolors() == rgba_boom or this_image.getcolors() == rgba_boom_red:global gameovergameover = 1break#sys.exit(0)else:print("无法识别图像")print("坐标")print((y,x))print("颜色")print(this_image.getcolors())sys.exit(0)#print(map)

扫雷算法

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

1.首先点出一个点

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

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

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

#插旗
def banner():showmap()for y in range(blocks_y):for x in range(blocks_x):if 1 <= map[y][x] and map[y][x] <= 5:boom_number = map[y][x]block_white = 0block_qi = 0for yy in range(y-1,y+2):for xx in range(x-1,x+2):if 0 <= yy and 0 <= xx and yy < blocks_y and xx < blocks_x:if not (yy == y and xx == x):if map[yy][xx] == 0:block_white += 1elif map[yy][xx] == -4:block_qi += 1if boom_number == block_white + block_qi:for yy in range(y - 1, y + 2):for xx in range(x - 1, x + 2):if 0 <= yy and 0 <= xx and yy < blocks_y and xx < blocks_x:if not (yy == y and xx == x):if map[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()#点击白块
def dig():showmap()iscluck = 0for y in range(blocks_y):for x in range(blocks_x):if 1 <= map[y][x] and map[y][x] <= 5:boom_number = map[y][x]block_white = 0block_qi = 0for yy in range(y - 1, y + 2):for xx in range(x - 1, x + 2):if 0 <= yy and 0 <= xx and yy < blocks_y and xx < blocks_x:if not (yy == y and xx == x):if map[yy][xx] == 0:block_white += 1elif map[yy][xx] == -4:block_qi += 1if boom_number == block_qi and block_white > 0:for yy in range(y - 1, y + 2):for xx in range(x - 1, x + 2):if 0 <= yy and 0 <= xx and yy < blocks_y and xx < blocks_x:if not(yy == y and xx == x):if map[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 = 1if iscluck == 0:luck()#随机点击
def luck():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 = 0def gogo():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()global gameoverwhile(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, 0, 0)win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)showmap()

这个算法在初级和中级通过率都不错,但是在高级成功率惨不忍睹,主要是没有考虑逻辑组合以及白块是雷的概率问题,可以对这两个点进行改进,提高成功率

python自动卸载win程序_利用python实现自动扫雷程序相关推荐

  1. python连接linux堡垒机_利用Python Paramiko开发linux堡垒机

    1.Paramiko模块下的demo.py程序 前面利用Python中的Paramiko模块可以进行SSH的连接,以及用来传送文件(SFTP),但是无论是哪一种方式,连接都是短暂的,并非是长连的,即一 ...

  2. python怎么重复程序_利用Python程序完成ABAQUS中的一些重复性操作

    对于建立过大型的ABAQUS分析模型的同学们,肯定会面对繁琐的重复性建模过程.比如对上百个点施加集中力,比如建立几百个耦合约束.这些重复性操作,如果使用cae操作的话,不仅费时,而且极其容易出错. 利 ...

  3. python乘法符号手写_利用Python自动生成小学生加减乘除口算考试题卷,不再为手写算术题烦恼!...

    还在为给孩子抄各种各样的口算题而烦恼?孩子上小学一年级之后,加减乘除的口算就要开始练习了,老师肯定会让家长出题.所以我们当家长的,要提前准备一下,就利用Python开发了一套自动生成小学生口算题的小应 ...

  4. python计算器程序_利用Python代码编写计算器小程序

    1 importtkinter2 importtkinter.messagebox3 importmath4 classJSQ:5 6 7 def __init__(self):8 #创建主界面 9 ...

  5. 钉钉python 自动发消息软件_利用Python自动发送钉钉数据消息,一个简单的上手小项目...

    现在大部分公司都使用钉钉作为内部的主要沟通工具,钉钉消息基本都上都能快速有效的被阅读,打开率会比邮件高上不少.所以准备使用钉钉来播报平台每日的成交额,并附上一些鼓励的话和图片.起到一个激励团队的作用 ...

  6. python自动生成分析报告_利用PYTHON全自动生成分析报告

    日常工作当中,特别是金融行业当中,有不少人的工作是提取数据,分析数据,得到可视化图表,并加入自已的研究分析结论,最终生成分析报告,并且有不少报告是定期生成,存在不少重复手工劳动.本文通过一个简单实例, ...

  7. python快递分拣小程序_利用Python开发的ATM小程序

    最近在学习Python,便利用业余时间开发了一个模拟ATM抢银行的小程序,不废话,直接上程序 #!/usr/bin/env python #coding=utf-8 # Name: AtmCard.p ...

  8. python登录交换机执行命令_利用Python脚本登录交换机实现自动配置备份的方法

    主机参考:服务器测评参考推荐网,专注分享服务器优惠信息!如果您想在本站投放您的广告,点此直达!如果您不想付费,您也可以免费投稿您的产品信息,点此直达!联系我们 部分文章发布时间较久远,可能存在未知因素 ...

  9. python自动保存ping结果_利用python获取Ping结果示例代码

    前言 本文主要跟大家分享了关于利用python获取Ping结果的相关内容,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍吧. 示例代码: # -*- coding: utf-8 -*- i ...

  10. python自动生成word报告_利用Python实现报告自动生成

    前几天,在网上看到一篇介绍利用Python组件实现MS word内容生成的文章.可能是很久没接触编码,感觉在技术领域变得有点孤陋寡闻了,看见一些实用的功能都觉的屌屌的.以前经常通过代码写Excel文件 ...

最新文章

  1. 一级计算机考试题库25套答案,全国计算机等级考试一级试题及答案(25套)..doc
  2. Python数据结构与算法—队列
  3. 11.向量vector.rs
  4. java内部类的特点
  5. 项目Beta冲刺 随笔集合
  6. 《数据结构教程》(李春葆 主编)课后习题【练习题6】
  7. Tkinter Frame size
  8. maven 项目搭建
  9. 绝对干货丨最值钱的20个管理工具,会用一半的已年薪百万
  10. 基于python和高德地图租房系统的设计与实现
  11. 【STL】STL空间配置器
  12. AE学习笔记之地图符号化
  13. 特征方程法求解递推关系中的数列通项
  14. 如何提高App Store审核通过率
  15. 【原创】基于SSM框架的电子相册管理系统网站设计与实现
  16. 汽车电子标识标准呼之欲出
  17. 【纪念篇】AS最初的kotlin-android-extensions插件走远了
  18. 大数据项目 --- 电商数仓(一)
  19. 遍历对象的属性(继承自原型的属性、不可枚举的属性)
  20. 拼多多定义0.9%=0.9996427%,一刀砍到小数点后六位,十进制的胜利了属于是.........

热门文章

  1. 提高学生对计算机学科学习兴趣的研究的结题报告,《如何在体育教学中运用体育游戏》的研究结题报告...
  2. mysql 查询判断手机号
  3. java mcv_Spring和SpringMCV配置
  4. tcp重复的确认_TCP如何实现可靠性传输
  5. 贵大计算机在职,贵州大学在职研究生招生信息网
  6. linux命令dh f,linux 下 find 命令的高级用法
  7. bytearrayinputstream java_java io系列02之 ByteArrayInputStream的简介,源码分析和示例(包括InputStream)...
  8. linux支持arm架构么_全球首次!中国推出一款支持X86、ARM等各种芯片架构的操作系统...
  9. pyecharts显示所有x轴_30分钟学会pyecharts数据可视化
  10. 统计网站 同一IP访问的次数及IP地址