利用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中asyncore的用法实例
Sep 29 Python
Python过滤列表用法实例分析
Apr 29 Python
Python读写txt文本文件的操作方法全解析
Jun 26 Python
恢复百度云盘本地误删的文件脚本(简单方法)
Oct 21 Python
使用Pyinstaller的最新踩坑实战记录
Nov 08 Python
解决phantomjs截图失败,phantom.exit位置的问题
May 17 Python
python3 kmp 字符串匹配的方法
Jul 07 Python
Python使用pickle模块储存对象操作示例
Aug 15 Python
python tkinter界面居中显示的方法
Oct 11 Python
Python生成rsa密钥对操作示例
Apr 26 Python
python 类之间的参数传递方式
Dec 20 Python
10个示例带你掌握python中的元组
Nov 23 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中通过数组进行高效随机抽取指定条记录的算法
2013/09/09 PHP
mongodb和php的用法详解
2019/03/25 PHP
基于PHP实现发微博动态代码实例
2020/12/11 PHP
javascript 导出数据到Excel(处理table中的元素)
2009/12/18 Javascript
『jQuery』取指定url格式及分割函数应用
2013/04/22 Javascript
js导航栏单击事件背景变换示例代码
2014/01/13 Javascript
jquery自动将form表单封装成json的具体实现
2014/03/17 Javascript
angular $watch 一个变量的变化(实例讲解)
2017/08/02 Javascript
从setTimeout看js函数执行过程
2017/12/19 Javascript
JS运动特效之链式运动分析
2018/01/24 Javascript
JavaScript错误处理操作实例详解
2019/01/04 Javascript
在layui tab控件中载入外部html页面的方法
2019/09/04 Javascript
Vue实现点击按钮复制文本内容的例子
2019/11/09 Javascript
Python实现的检测网站挂马程序
2014/11/30 Python
Python记录详细调用堆栈日志的方法
2015/05/05 Python
解决python使用open打开文件中文乱码的问题
2017/12/29 Python
想学python 这5本书籍你必看!
2018/12/11 Python
python 遍历列表提取下标和值的实例
2018/12/25 Python
对python numpy.array插入一行或一列的方法详解
2019/01/29 Python
python实现输入任意一个大写字母生成金字塔的示例
2019/10/27 Python
python实现矩阵和array数组之间的转换
2019/11/29 Python
浅谈python3 构造函数和析构函数
2020/03/12 Python
python开发实例之Python的Twisted框架中Deferred对象的详细用法与实例
2020/03/19 Python
如何更换python默认编辑器的背景色
2020/08/10 Python
英国网上香水店:Fragrance Direct
2016/07/20 全球购物
英国泰坦旅游网站:全球陪同游览,邮轮和铁路旅行
2016/11/29 全球购物
日本最大级玩偶手办购物:あみあみ Amiami
2018/04/23 全球购物
经贸日语专业个人求职信范文
2013/12/28 职场文书
创先争优承诺书范文
2014/03/31 职场文书
项目投资意向书
2014/04/01 职场文书
班风学风建设方案
2014/05/06 职场文书
机关作风建设心得体会
2014/10/22 职场文书
违反工作规定检讨书范文
2014/12/14 职场文书
勤俭节约倡议书范文
2015/04/29 职场文书
驾驶员管理制度范本
2015/08/06 职场文书
MySQL查看表和清空表的常用命令总结
2021/05/26 MySQL