原标题:利用 Python 实现 自动扫雷 小脚本

自动扫雷一般分为两种,一种是读取内存数据,而另一种是通过分析图片获得数据,并通过模拟鼠标操作,这里我用的是第二种方式。一、准备工作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 = "Minesweeper Arbiter "

hwnd = win32gui.FindWindow(class_name, title_name)

#窗口坐标

left = 0

top = 0

right = 0

bottom = 0

if hwnd:

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 += 15

top += 101

right -= 15

bottom -= 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

#扫描雷区图像

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] = 0

elif this _image.getcolors == rgba_1:

map[ y][ x] = 1

elif this _image.getcolors == rgba_2:

map[ y][ x] = 2

elif this _image.getcolors == rgba_3:

map[ y][ x] = 3

elif this _image.getcolors == rgba_4:

map[ y][ x] = 4

elif this _image.getcolors == rgba_5:

map[ y][ x] = 5

elif this _image.getcolors == rgba_6:

map[ y][ x] = 6

elif this _image.getcolors == rgba_8:

map[ y][ x] = 8

elif this _image.getcolors == rgba_ed:

map[ y][ x] = -1

elif this _image.getcolors == rgba_hongqi:

map[ y][ x] = -4

elif this _image.getcolors == rgba_boom or this _image.getcolors == rgba_boom_red:

global gameover

gameover = 1

break

#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

fory inrange(blocks_y):

forx inrange(blocks_x):

if1<= map[y][x] andmap[y][x] <= 5:

boom_number = map[y][x]

block_white = 0

block_qi = 0

foryy inrange(y -1,y+ 2):

forxx inrange(x -1,x+ 2):

if0<= yy and0<= xx andyy < blocks_y andxx < blocks_x:

ifnot(yy == y andxx == x): ifmap[yy][xx] == 0:

block_white += 1

elifmap[yy][xx] == -4:

block_qi += 1ifboom_number == block_white + block_qi: foryy inrange(y - 1, y + 2):

forxx inrange(x - 1, x + 2):

if0<= yy and0<= xx andyy < blocks_y andxx < blocks_x:

ifnot(yy == y andxx == 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 = 0

fory inrange(blocks_y):

forx inrange(blocks_x):

if1<= map[y][x] andmap[y][x] <= 5:

boom_number = map[y][x]

block_white = 0

block_qi = 0

foryy inrange(y - 1, y + 2):

forxx inrange(x - 1, x + 2):

if0<= yy and0<= xx andyy < blocks_y andxx < blocks_x:

ifnot(yy == y andxx == x):

ifmap[yy][xx] == 0:

block_white += 1

elifmap[yy][xx] == -4:

block_qi += 1ifboom_number == block_qi andblock_white > 0: foryy inrange(y - 1, y + 2):

forxx inrange(x - 1, x + 2):

if0<= yy and0<= xx andyy < blocks_y andxx < blocks_x:

ifnot(yy == y andxx == 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 = 1

ifiscluck == 0:

luck

#随机点击

defluck:

fl = 1

while(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 = 0

defgogo:

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

globalgameover

while( 1):

if(gameover == 0):

banner

banner

dig

else:

gameover = 0

win32api.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程序员

责任编辑:

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

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

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

  2. python漏洞利用脚本_利用Python脚本实现漏洞情报监控与通知的经验分享

    原标题:利用Python脚本实现漏洞情报监控与通知的经验分享 前言 本文主要介绍了笔者利用一个简单的Python脚本实现漏洞情报的监控以及自动通报的相关经验. 一.背景 笔者所在公司某一个业务系统用到 ...

  3. python黑科技脚本_利用Python实现FGO自动战斗脚本,再也不用爆肝啦~

    欢迎点击右上角关注小编,除了分享技术文章之外还有很多福利,私信学习资料可以领取包括不限于Python实战演练.PDF电子文档.面试集锦.学习资料等. 利用Python实现FGO自动战斗脚本,再也不用爆 ...

  4. python windows系统管理_利用Python脚本管理Windows服务

    Windows服务常用的功能就是启动服务,关闭服务,重启服务和查询服务运行状态,其中查询服务运行状态是其他三种操作的基础. 本文中提到的使用Python脚本管理Windows服务实际上是调用win32 ...

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

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

  6. python提醒事件_利用python实现短信和电话提醒功能的例子

    有时候,我们需要程序帮我们自动检测某些事件的发生 这个需求是广泛存在的 因此,这里整理了利用python实现短信和电话提醒功能的方法 主要需要完成以下4个步骤: - 安装核心库:twilio - 注册 ...

  7. python selenium截图_利用 Python + Selenium 实现对页面的指定元素截图(可截长图元素)...

    对WebElement截图 WebDriver.Chrome自带的方法只能对当前窗口截屏,且不能指定特定元素.若是需要截取特定元素或是窗口超过了一屏,就只能另辟蹊径了. WebDriver.Phant ...

  8. python代码物理_利用python求解物理学中的双弹簧质能系统详解

    前言 本文主要给大家介绍了关于利用python求解物理学中双弹簧质能系统的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 物理的模型如下: 在这个系统里有两个物体,它们的质 ...

  9. python批量生成图片_利用Python批量生成任意尺寸的图片

    实现效果 通过源图片,在当前工作目录的/img目录下生成1000张,分别从1*1到1000*1000像素的图片. 效果如下: 目录结构 实现示例 # -*- coding: utf-8 -*- imp ...

最新文章

  1. DP UVALive 6506 Padovan Sequence
  2. J - One-Dimensional HYSBZ - 4688
  3. 将ImageVIew中的图片保存到本地相册中
  4. stm32l0的停止模式怎么唤醒_探索者 STM32F407 开发板资料连载第二十二章 待机唤醒实验
  5. 微软 Surface Pro、Studio、Laptop 全线更新
  6. 数据结构 排序和查找
  7. C语言中atoi()函数的用法
  8. Python编写编程作业批量自动打分程序的思路与实现
  9. python 字符串替换_python字符串替换的2种方法
  10. 在dos窗口中删除services中的服务
  11. 黑客编程学习_1.黑客编程入门
  12. Redis 命令 - 在线参考
  13. 我们是如何设计出,让玩家们有“上瘾症”的抽卡系统的
  14. Had I not seen the Sun(如果我不曾见过太阳)
  15. 【我的新颖社区社交产品架构构思设想】
  16. web 前端签名插件_signature_pad插件实现电子签名功能
  17. C# winform中打开网页的方法
  18. cmd打开计算机窗口,如何打开命令行窗口,教您电脑怎么打开cmd命令行窗口
  19. PostGIS的geometry类型及使用方法
  20. source insight 一直 checking for modified files导致卡顿【已解决】

热门文章

  1. 微信运动服务器正在维修中咋回事,我从微信运动发现他出轨了
  2. 生物信息学入门 使用 RNAseq counts数据进行差异表达分析(DEG)——edgeR 算法 数据 代码 结果解读
  3. 老吕RawViewer介绍及使用帮助
  4. ChatGPT 桌面应用(Mac, Windows and Linux)
  5. centos7 目录扩容 LVM
  6. 用java比较abc大小的程序_Java中 abc + '/'和abc + /的区别
  7. word上的花线是什么_WORD2016中,怎样用绘图工具花线
  8. 新视野大学英语第三版第三册全书的Word In Use翻译和部分单元的英译汉翻译
  9. android 文件关联的方法 实现点击文件打开指定应用软件
  10. 机器学习——算法分类以及开发流程