利用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通过colorama模块在控制台输出彩色文字的方法
Mar 19 Python
Python的设计模式编程入门指南
Apr 02 Python
python获取当前时间对应unix时间戳的方法
May 15 Python
Python if语句知识点用法总结
Jun 10 Python
python字符串常用方法
Jun 14 Python
关于python2 csv写入空白行的问题
Jun 22 Python
Python math库 ln(x)运算的实现及原理
Jul 17 Python
python将字符串list写入excel和txt的实例
Jul 20 Python
pandas数据拼接的实现示例
Apr 16 Python
Python如何对XML 解析
Jun 28 Python
关于python tushare Tkinter构建的简单股票可视化查询系统(Beta v0.13)
Oct 19 Python
Python 图片添加美颜效果
Apr 28 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 adodb分页实现代码
2009/03/19 PHP
9段PHP实用功能的代码推荐
2014/10/14 PHP
Laravel 实现密码重置功能
2018/02/23 PHP
javascript中日期转换成时间戳的小例子
2013/03/21 Javascript
用jquery中插件dialog实现弹框效果实例代码
2013/11/15 Javascript
toggle()隐藏问题的解决方法
2014/02/17 Javascript
用js提交表单解决一个页面有多个提交按钮的问题
2014/09/01 Javascript
Jquery 实现table样式的设定
2015/01/28 Javascript
JS密码生成与强度检测完整实例(附demo源码下载)
2016/04/06 Javascript
js字符串截取函数slice、substring和substr的比较
2016/05/17 Javascript
jquery validate表单验证插件
2016/09/06 Javascript
探讨跨域请求资源的几种方式(总结)
2016/12/02 Javascript
jQuery使用动画队列自定义动画操作示例
2018/06/16 jQuery
小程序根据手机机型设置自定义底部导航距离
2019/06/04 Javascript
Vue实现Header渐隐渐现效果的实例代码
2020/11/05 Javascript
Python 随机生成中文验证码的实例代码
2013/03/20 Python
python重试装饰器示例
2014/02/11 Python
python MySQLdb使用教程详解
2018/03/20 Python
HTML的form表单和django的form表单
2019/07/25 Python
PyQt Qt Designer工具的布局管理详解
2019/08/07 Python
如何把外网python虚拟环境迁移到内网
2020/05/18 Python
Python爬虫实现自动登录、签到功能的代码
2020/08/20 Python
CSS3 按钮边框动画的实现
2020/11/12 HTML / CSS
HTML5 Canvas标签使用收录
2009/07/07 HTML / CSS
nohup的用法
2012/11/26 面试题
大学生职业生涯规划书范文
2014/01/04 职场文书
青年教师培训方案
2014/02/06 职场文书
金融管理应届生求职信
2014/02/20 职场文书
模具专业自荐信
2014/05/29 职场文书
机械电子工程专业自荐书
2014/06/10 职场文书
人力资源职位说明书
2014/07/29 职场文书
幼儿园个人总结
2015/02/28 职场文书
医学生自荐信范文
2015/03/05 职场文书
地道战观后感300字
2015/06/04 职场文书
创业计划书之旅游网站
2019/09/06 职场文书
Python闭包的定义和使用方法
2022/04/11 Python