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

#插旗
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实现自动扫雷小脚本内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python自动扫雷实现方法

    本文实例讲述了Python自动扫雷实现方法.分享给大家供大家参考.具体如下: #pyWinmineCrack.py # coding: utf-8 import win32gui import win32process import win32con import win32api from ctypes import * #雷区最大行列数 MAX_ROWS = 24 MAX_COLUMNS = 30 #雷区格子在窗体上的起始坐标及每个格子的宽度 MINE_BEGIN_X = 0xC MINE_

  • 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 Some

  • 如何基于Python实现自动扫雷

    这篇文章主要介绍了如何基于Python实现自动扫雷,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 自动扫雷一般分为两种,一种是读取内存数据,而另一种是通过分析图片获得数据,并通过模拟鼠标操作,这里我用的是第二种方式. 一.准备工作 我的版本是 python 3.6.1 python的第三方库: win32api win32gui win32con Pillow numpy opencv 可通过 pip install --upgrade Som

  • 利用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 SomePac

  • 如何利用Python实现自动打卡签到的实践

    目录 需求描述 业务梳理 程序实现 总结 需求描述 我们需要登录考勤系统(网页端,非手机端)进行签到,如果不想每天都早早起来打卡签到,就可以通过写程序实现这一功能. 业务梳理 通过长时间的早起打卡签到发现规律,我每天只是不停的点击,签到,都是规律性的操作,何尝不写一个程序加到Windows实现自动签到呢,这样我就不用每天都花时间上在打卡这件小事上.说干就干,我发现我每天的打卡行为可以归纳为"登录系统-->输入用户名.密码-->点击点击-->退出系统". 一天上网浏览社

  • 利用Python实现自动生成图文并茂的数据分析

    目录 前言 1.一行命令,安装这个库 2.核心代码模块导入 ①提前导入相关内容,并且注册字体 ②注册字体 ③生成报告 前言 reportlab是Python的一个标准库,可以画图.画表格.编辑文字,最后可以输出PDF格式.它的逻辑和编辑一个word文档或者PPT很像.有两种方法: 建立一个空白文档,然后在上面写文字.画图等: 建立一个空白list,以填充表格的形式插入各种文本框.图片等,最后生成PDF文档. 因为需要产生一份给用户看的报告,里面需要插入图片.表格等,所以采用的是第二种方法. 1.

  • 利用Python模拟谷歌的小恐龙游戏

    目录 前言 开发工具 环境搭建 先睹为快 代码介绍 前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 谷歌流量器中有个很有名的彩蛋:当你网络出现问题时,就会出现一个"小恐龙游戏". (如果想要直接进行游戏,可以在地址栏输入:chrome://dino) 今天我们就来给大家演示下,用Python来自己做一个仿制的"小恐龙游戏"! 废话不多说,

  • 基于Python实现自动扫雷详解

    目录 准备 实现思路 窗体截取 雷块分割 雷块识别 扫雷算法实现 用Python+OpenCV实现了自动扫雷,突破世界记录,我们先来看一下效果吧. 中级 - 0.74秒 3BV/S=60.81 相信许多人很早就知道有扫雷这么一款经典的游(显卡测试)戏(软件),更是有不少人曾听说过中国雷圣,也是中国扫雷第一.世界综合排名第二的郭蔚嘉的顶顶大名.扫雷作为一款在Windows9x时代就已经诞生的经典游戏,从过去到现在依然都有着它独特的魅力:快节奏高精准的鼠标操作要求.快速的反应能力.刷新纪录的快感,这

  • 基于Python实现自动抠图小程序

    目录 导语 正文 1.前期准备 1.1 首先 1.2 网站小介绍 2.正式抠图 2.1 环境安装 2.2 素材(可自选) 2.3 主程序代码 3.效果图 3.1 界面展示 ​3.2 图片展示 总结 导语 大家好!我是木木子,今天天气不是很好,下雨了,让我没点儿写文章的动力啊~ 写程序:一天到晚没事做,一行代码改一天,从白天学完天黑! 在日常的工作和生活中,我们经常会遇到需要抠图的场景,即便是只有一张图片需要抠,也会抠得我们不耐烦,倘若遇到许多张图片需要抠,那就…… 今天教你用Python制作一款

  • 利用Matlab复刻扫雷小游戏

    效果图 点击帮助切换插旗功能: 游戏失败: 完整代码 function SLsXpbombs global Row; Row=10;%雷区行数 global Col; Col=10;%雷区列数 global MineMap; MineMap=[]; %地雷图 global aroundMap;aroundMap=[];%周围地雷数 global MarkMap; MarkMap=ones([Row,Col]); %标记图 global MineNum; MineNum=8;%地雷总数 globa

  • 详解如何利用Python制作24点小游戏

    目录 先睹为快 游戏规则(改编自维基百科) 逐步实现 Step1:制作24点生成器 Step2:定义游戏精灵类 Step3:实现游戏主循环 先睹为快 24点 游戏规则(改编自维基百科) 从1~10这十个数字中随机抽取4个数字(可重复),对这四个数运用加.减.乘.除和括号进行运算得出24.每个数字都必须使用一次,但不能重复使用. 逐步实现 Step1:制作24点生成器 既然是24点小游戏,当然要先定义一个24点游戏生成器啦.主要思路就是随机生成4个有解的数字,且范围在1~10之间,代码实现如下:

  • 利用Python实现自动生成数据日报

    目录 前言 需求详解 数据处理 前言 人生苦短,快学Python! 日报,是大部分打工人绕不过的难题. 对于管理者来说,日报是事前管理的最好抓手,可以了解团队的氛围和状态.可对于员工来说,那就有的聊了.对于重复性的工作,我非常推荐大家使用Python将其变成模块化.自动化,帮助我们实现高效办公. 下面我们通过一个补写销售日报的案例,展示一下Python自动化办公的优势.本文简化了案例的流程. 需求详解 朋友的需求是这样的,他们平时的销售数据是记录在Excel上,汇总后会按照部门进行统计.但是今年

随机推荐