利用Python实现自动扫雷小脚本


Posted in Python onDecember 17, 2020

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

一、准备工作

1.扫雷游戏

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

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

利用Python实现自动扫雷小脚本

2.python 3

我的版本是 python 3.6.1

3.python的第三方库

win32api,win32gui,win32con,Pillow,numpy,opencv

可通过 pip install --upgrade SomePackage 来进行安装

注意:有的版本是下载pywin32,但是有的要把pywin32升级到最高并自动下载了pypiwin32,具体情况每个python版本可能都略有不同

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

利用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,如果没有符合条件的,则随机点击一个白块

#插旗 
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 = 0 
    block_qi = 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: 
         block_white += 1 
        elif 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 = 0 
 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 = 0 
    block_qi = 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: 
         block_white += 1 
        elif 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 = 1 
 if iscluck == 0: 
  luck() 
#随机点击 
def luck(): 
 fl = 1 
 while(fl): 
  randomrandom_x = random.randint(0, blocks_x - 1) 
  randomrandom_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 
def 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 gameover 
 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 相关文章推荐
python中使用OpenCV进行人脸检测的例子
Apr 18 Python
仅利用30行Python代码来展示X算法
Apr 01 Python
Python基于回溯法子集树模板解决数字组合问题实例
Sep 02 Python
python代码 输入数字使其反向输出的方法
Dec 22 Python
pytorch 预训练层的使用方法
Aug 20 Python
python使用socket实现的传输demo示例【基于TCP协议】
Sep 24 Python
Python argparse模块应用实例解析
Nov 15 Python
Anaconda+vscode+pytorch环境搭建过程详解
May 25 Python
keras的siamese(孪生网络)实现案例
Jun 12 Python
使用Python项目生成所有依赖包的清单方式
Jul 13 Python
总结几个非常实用的Python库
Jun 26 Python
Python中的pprint模块
Nov 27 Python
用python读取xlsx文件
Dec 17 #Python
Python实现自动整理文件的脚本
Dec 17 #Python
Python用access判断文件是否被占用的实例方法
Dec 17 #Python
Python实例教程之检索输出月份日历表
Dec 16 #Python
使用Python判断一个文件是否被占用的方法教程
Dec 16 #Python
python中类与对象之间的关系详解
Dec 16 #Python
python简单实现插入排序实例代码
Dec 16 #Python
You might like
PHP通过header实现文本文件下载的代码
2010/08/08 PHP
利用php绘制饼状图的实现代码
2013/06/07 PHP
php过滤表单提交的html等危险代码
2014/11/03 PHP
php使用session二维数组实例
2014/11/06 PHP
Zend Framework教程之连接数据库并执行增删查的方法(附demo源码下载)
2016/03/21 PHP
laravel实现于语言包的完美切换方法
2019/09/29 PHP
javascript中对对层的控制
2006/12/29 Javascript
对YUI扩展的Gird组件 Part-1
2007/03/10 Javascript
复制本贴标题和地址的js代码
2008/07/01 Javascript
两个JavaScript jsFiddle JSBin在线调试器
2010/03/14 Javascript
ext 列表页面关于多行查询的办法
2010/03/25 Javascript
jquery进行数组遍历如何跳出当前的each循环
2014/06/05 Javascript
js实现按钮控制图片360度翻转特效的方法
2015/02/17 Javascript
javascript操作表格排序实例分析
2015/05/06 Javascript
JQuery给网页更换皮肤的方法
2015/05/30 Javascript
通过js获取上传的图片信息(临时保存路径,名称,大小)然后通过ajax传递给后端的方法
2015/10/01 Javascript
jquery之别踩白块游戏的简单实现
2016/07/25 Javascript
windows下vue.js开发环境搭建教程
2017/03/20 Javascript
JS基于封装函数实现的表格分页完整示例
2018/06/26 Javascript
JavaScript枚举选择jquery插件代码实例
2020/11/17 jQuery
[36:41]完美世界DOTA2联赛循环赛FTD vs Magma第一场 10月30日
2020/10/31 DOTA
python简单实现获取当前时间
2016/08/27 Python
基于hashlib模块--加密(详解)
2017/06/21 Python
python实现外卖信息管理系统
2018/01/11 Python
python正则表达式爬取猫眼电影top100
2018/02/24 Python
Django之form组件自动校验数据实现
2020/01/14 Python
python实现处理mysql结果输出方式
2020/04/09 Python
学python最电脑配置有要求么
2020/07/05 Python
pycharm全局搜索的具体步骤
2020/07/28 Python
python 实现数据库中数据添加、查询与更新的示例代码
2020/12/07 Python
高尔夫球鞋、服装、手套和装备:FootJoy
2018/12/15 全球购物
MYSQL相比于其他数据库有哪些特点
2013/07/19 面试题
健康状况证明书
2014/11/26 职场文书
2015毕业寄语大全
2015/02/26 职场文书
2016年禁毒宣传活动总结
2016/04/05 职场文书
apache ftpserver搭建ftp服务器
2022/05/20 Servers