利用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的几条建议分享
Feb 10 Python
Python编写百度贴吧的简单爬虫
Apr 02 Python
python高手之路python处理excel文件(方法汇总)
Jan 07 Python
举例讲解Python的lambda语句声明匿名函数的用法
Jul 01 Python
python微元法计算函数曲线长度的方法
Nov 08 Python
python实现坦克大战游戏 附详细注释
Mar 27 Python
Python之修改图片像素值的方法
Jul 03 Python
详解Django admin高级用法
Nov 06 Python
python标准库os库的函数介绍
Feb 12 Python
python matplotlib包图像配色方案分享
Mar 14 Python
Django Session和Cookie分别实现记住用户登录状态操作
Jul 02 Python
基于python实现删除指定文件类型
Jul 21 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
destoon调用自定义模板及样式的公告栏
2014/06/21 PHP
PHP使用星号隐藏用户名,手机和邮箱的实现方法
2016/09/22 PHP
PHP插件PHPMailer发送邮件功能
2017/02/28 PHP
tp5(thinkPHP5框架)使用DB实现批量删除功能示例
2019/05/28 PHP
thinkphp5实现微信扫码支付
2019/12/23 PHP
laravel使用数据库测试注意事项
2020/04/10 PHP
KindEditor在php环境下上传图片功能集成的方法示例
2020/07/20 PHP
13个绚丽的Jquery 界面设计网站推荐
2010/09/28 Javascript
js不完美解决click和dblclick事件冲突问题
2012/07/16 Javascript
JavaScript中的稀疏数组与密集数组[译]
2012/09/17 Javascript
jquery提示效果实例分析
2014/11/25 Javascript
浅谈JavaScript中的this指针和引用知识
2016/08/05 Javascript
JS实现闭包中的沙箱模式示例
2017/09/07 Javascript
为什么我们要做三份 Webpack 配置文件
2017/09/18 Javascript
js 原生判断内容区域是否滚动到底部的实例代码
2017/11/15 Javascript
JavaScript累加、迭代、穷举、递归等常用算法实例小结
2018/05/08 Javascript
深入分析jQuery.one() 函数
2020/06/03 jQuery
[09:13]2014DOTA2国际邀请赛 中国区预选赛coser表演
2014/05/23 DOTA
[05:46]DOTA2英雄梦之声_第18期_陈
2014/06/20 DOTA
python 字符串格式化代码
2013/03/17 Python
c++生成dll使用python调用dll的方法
2014/01/20 Python
python 内置函数filter
2017/06/01 Python
简单了解python模块概念
2018/01/11 Python
pycharm重命名文件的方法步骤
2019/07/29 Python
Win10 安装PyCharm2019.1.1(图文教程)
2019/09/29 Python
Python 项目转化为so文件实例
2019/12/23 Python
欧洲最大的婴幼儿服装及内衣公司:Petit Bateau(小帆船)
2016/08/16 全球购物
中国酒类在线零售网站:酒仙网
2016/08/20 全球购物
GafasWorld西班牙:购买太阳镜、眼镜和隐形眼镜
2019/09/08 全球购物
介绍下java.util.Arrays类
2012/10/16 面试题
物流管理专业毕业生求职信
2014/03/23 职场文书
党的群众路线教育实践活动总结报告
2014/07/03 职场文书
教你如何用python开发一款数字推盘小游戏
2021/04/14 Python
django如何自定义manage.py管理命令
2021/04/27 Python
不同品牌、不同型号对讲机如何互相通联
2022/02/18 无线电
vue3种table表格选项个数的控制方法
2022/04/14 Vue.js