基于MATLAB图像处理的自动QQ小游戏(一)自动扫雷篇(挖金子)

  学了那么一些数字图像处理之后,就用MATLAB实现了一直心心念念的自动扫雷,同时也做了QQ游戏上另外两款热门游戏的自动化——连连看和找不同。对的,你没有看错,是连连看和找不同。虽然已经2021年了,在舍友的推荐下我打开了QQ游戏这个世界,里面最热门的游戏连连看必须占一份。
  本篇主要是自动扫雷篇,另外两个游戏会后续更新。此外,虽然这个自动化看起来很像是外挂,但是我们本着的是极客精神(~~),写这个程序的最大享受就是写他的过程和成功的喜悦,用它来和玩家竞争是绝对不支持的。

文章目录

  • 基于MATLAB图像处理的自动QQ小游戏(一)自动扫雷篇(挖金子)
  • 一、关于QQ小游戏
  • 二、实现思路
    • 1.MATLAB实现桌面截屏和控制鼠标
    • 2.识别——将截图内容识别为矩阵
    • 3.排雷
  • 三、效果测试

一、关于QQ小游戏

  虽然电脑版的QQ小游戏已经淡出了人们的视野,但是上面每天依旧有不少玩家在线,而且基本都是高手。相继在连连看和找不同区被高手秒杀,特别是在我一直觉得自己还比较擅长的扫雷的被打压之后,我含泪企图用所学知识帮我找回一些自信。

二、实现思路

  简单来讲就是:截屏-识别-排雷-点击。那么这四个方面具体的实现如下:

1.MATLAB实现桌面截屏和控制鼠标

  在MATLAB中调用java的方法来实现截屏和控制鼠标。具体的调用的是java.awt.Robot这一用于测试自动化的类。具体的代码如下:

robot = java.awt.Robot;%创建robot对象
rec= java.awt.Rectangle(); %创建矩形对象
rec.x=1;rec.y=1;%设置矩形的左上角坐标(屏幕像素)
rec.width=1360;rec.height=768;%设置矩形的长宽
image = robo.createScreenCapture(rec);%按矩形截取屏
filehandle = java.io.File('xxx.png');
javax.imageio.ImageIO.write(image,'png',filehandle);%保存截图%%下面是制鼠标的三个函数
robot .mouseMove(x,y);%移动鼠标到x,y
robo.mousePress  (java.awt.event.InputEvent.BUTTON1_MASK);%按下左键
%按下和放开中间需要加入一些延时才可以实现一次点击。
robo.mouseRelease(java.awt.event.InputEvent.BUTTON1_MASK);%松开左键

2.识别——将截图内容识别为矩阵

  因为游戏窗口的位置一般都是固定的,所以人为的设置具体的参数以获取挖掘界面。
  采用一些常见的图像处理方式识别图片内容,首先取恰当的阈值将图片二值化,去除背景,保留数字和方块。得到如下结果:

  每个方块和数字的的位置都非常具有规律,很容易分割出每一个数字和方块。至于识别具体的数字、方块、空白,我采用的是非常直白的两个矩阵相减的方法。先获取模板,将分割出来的部分轮流和模板相减,差值最小的一个模板就是该部分代表的内容。因为数字都十分的规范,每个像素点的位置都不会改变,一般相减为0则可以判断该方块的内容。虽然这样做有很多缺陷,但是MATLAB适合矩阵操作,在这里足够实用,没有出现过识别错误的情况。当然也可以尝试一些其他识别方法如贝叶斯公式等。

  因为QQ小游戏的雷比较少,所以不会出现5以上的数字,没有挖开的方块和任何一个模板相减都不会为0,所以不需要为其单独准备一个模板。这样就可以将上面的二值图识别为一个矩阵,方便后续的排雷算法。

3.排雷

  我使用的排雷方法是总结我多年的扫雷经验得到的(狗头)。总的来说,我在扫雷的时候确定一个方块有雷还是没有雷一共有四种方式:
(1)最直白,也是扫雷的规则:数字周围的方块数等于数字的值,这样就可以确定这些方块就是雷。比如最常见到的1周围有一个方块。

(2)进一步,属于(1)的拓展:数字周围的方块含有雷的个数等于数字,这样就可以确定其余的方块都不是雷;雷的个数加剩余方块数等于数字,那么剩余方块都是雷。当然确定的雷是依靠上一条得出的。依靠这两个规则可以排除绝大多数的方块,如下图:

(3)绕一点,属于(2)的延伸:数字周围的一部分方块一定包含确定数量的雷,若这个数量加确定的雷数等于数字那么剩下的方块都不是雷,如果这个数量加剩余方块数加已确定的雷数等于数字,那么剩余方块都是雷。这和(2)非常相似,只不过变成了一组方块包含的雷。对于一组的理解如下图:因为第二行的数字2,可以确定第三行的两个方块内必定含有一个雷,这就是一组方块。则对于第三行的数字2而言,这个数量加确定的雷数等于数字 1+1=2所以第四行的方块(剩余的方块)都不是雷,可以挖开。这样就可以不用确定这一组方块中雷的具体位置就可以排雷。

(4)再绕一点,属于(3)的延伸:数字周围的一部分方块只能包含一定数量的雷(不确定是否包含),如果这个数量+已确定的雷数+剩余的方块数等于数字,那么剩余的方块都是雷。单独使用这个方法只可以用来确定雷,不能用来排除雷,因为不确定是否含有雷。如下图,因为数字2,可以确定其下面的三个方块包含一个雷。对于数字3而言,其下面的前两个方块就是属于只能包含一个雷的一组方块,那么就可以确定剩余的方块是雷(椭圆)。

  组合使用上述4种方法基本上可以排除所有能排除的方块,只留下需要猜测的部分,基本上可以拿下高级扫雷(doge)。当然,这只是我自己的总结,如果还有更全面的方法欢迎大神在评论区指出。
  花费一些心思把这四种方法实现为代码,(1)(2)的实现比较容易,(3)我采用数组和子集的方式多次遍历矩阵实现。对于QQ扫雷使用前3种方式基本上就可以扫出所有雷,所以方法(4)就没有实现(并不是偷懒)。

三、效果测试

  参照上面的原理,用MATLAB使用大量的if和else写了大概200行就达成了自动扫雷的成就。
  首先手动点击,点开一块区域后再运行程序。因为是截屏,处理完之后再操纵鼠标点击,所以当出现大片空白的之后鼠标还是会去点击,看起来就很奇怪。但是速度绝对杠杠的,控制时长在30s左右基本可以无敌手,当然可以更快,但是那样就不像人操作的了。

  最后,写这个是为了体会用知识解决问题的喜悦,可不是用来作弊开挂的,所以我并没有继续写GUI和完善使用。想进一步研究和改进的同仁可以点击这里下载所有文件。

基于MATLAB图像处理的自动QQ小游戏(一)自动扫雷篇相关推荐

  1. 基于MATLAB图像处理的恶劣天气自动车牌识别

    基于MATLAB图像处理的恶劣天气自动车牌识别系统设计 摘要 针对恶劣天气环境下传统的自动车牌识别系统存在运行时间长.输出车牌信息不准等问题,本文提出了借助MATLAB的图像处理功能从图像去雾.车牌定 ...

  2. 基于MATLAB图像处理的硬币个数识别系统

    基于MATLAB图像处理的硬币个数识别系统 1.课题介绍 本设计为基于MATLAB的硬币图像识别统计装置,通过数码相机获取平铺无重叠堆积的硬币的图像,并通过Matlab工具处理后统计硬币的数目.通过控 ...

  3. matlab中提取裂缝图像,基于Matlab图像处理的水泥路面裂缝检测研究

    路面裂缝检测是计算公路状况指数的重要依据[1],传统的检测方法主要是靠人工检测,测量精度差.检测效率低.同时检测人员会有安全隐患[2-3].现在多采自动检测的方法对路面裂缝的损害进行检测,其中使用数字 ...

  4. Laya商业级教程-对接QQ小游戏sdk(5分钟掌握)

    qq小游戏开发 视频演讲稿: Laya商业教程 LAYA版本2.5,开发语言ts 我们以官方的2d案例为模板,对接QQSDK QQ平台案例功能点: banner,激励视频,插屏,游戏盒子,积木广告,分 ...

  5. python弹球小游戏程序_Python基于Tkinter模块实现的弹球小游戏

    本文实例讲述了Python基于Tkinter模块实现的弹球小游戏.分享给大家供大家参考,具体如下: #!usr/bin/python #-*- coding:utf-8 -*- from Tkinte ...

  6. 腾讯加速推进防沉迷新规:新增21款产品 微信/QQ小游戏接入

    4月21日,据腾讯游戏公众号消息,腾讯正在加速推进防沉迷新规在旗下游戏中的落实工作,继<和平精英>等12款产品已启用新的防沉迷规则后,从3月下旬至今再新增21款产品完成新规落实. 这21款 ...

  7. 基于C语言的信息管理系统和小游戏

    基于C语言的信息管理系统和小游戏 一.课设题 本次课程设计有以两类题可以选择: 信息管理系统: 即实现个基于控制台的信息管理系统,例如选课系统.图书馆系统.公司财务系统等等 ,除满增删查改等基本功能, ...

  8. QQ小游戏接入问题:Uncaught TypeError: wx.saveFile is not a function

    最近公司cocosCreator开发的小游戏接QQ小游戏,遇到一些问题,记录一下,方便其他朋友遇到同样问题及时应对. 我的小游戏包>8M 无法上传,删除res后,报如下错误wx.saveFile ...

  9. 解决QQ小游戏、微信小游戏 getLaunchOptionsSync()获取的数据为旧数据

    解决QQ小游戏.微信小游戏 getLaunchOptionsSync()获取旧数据的问题 维尼与你同在 @13805064305 原因 一般这个问题不是首次登录出现的,而是第二次从别的游戏跳过来,后台 ...

  10. QQ小游戏 BannerAd 创建banner广告组件 API

    BannerAd 创建banner广告组件 qq.createBannerAd(Object object) BannerAd qq.createBannerAd(Object object) 创建 ...

最新文章

  1. vdi voi idv区别_VDI桌面虚拟化和IDV桌面虚拟化到底有哪些不同
  2. nchoosek--二项式系数或所有的组合数
  3. putty连接虚拟fedaro失败的解决方法
  4. php cgi路径解析,php.ini中的cgi.fix_pathinfo选项
  5. linux nginx svn 更新前端代码
  6. Python - 利用pip管理包
  7. 体育测试数据绘图软件,原创健身运动体育测试数据统计app界面
  8. Python实现AES加密进行PKCS5Padding的填充
  9. load data infile into table 的使用例子
  10. [模拟][字符串]计算器的改良
  11. Kotlin解析JSON数据
  12. ppt讲解中的过渡_ppt过渡页的设计技巧
  13. arcmap中有火星坐标码_GIS转换之火星坐标系转换
  14. 文件管理系统:5款优秀的文档管理系统
  15. matlab单级齿轮减速器设计
  16. 安装paddledetection
  17. 在线负数分数计算机,负分数
  18. 韩泰机器人_韩泰轮胎怎么样?进击的韩泰,拥有着对未来无限的可能!
  19. IDEA 没识别 resources(找不到 resources)
  20. html5怎么查看路由器状态,怎么看路由器是否正常_怎么看路由器是否联网?-192路由网...

热门文章

  1. Solving environment: failed
  2. 关于符号Symbol第一篇
  3. python爬取英雄联盟所有皮肤_python爬取lol英雄皮肤
  4. GeoGebra官方版下载
  5. LCD液晶显示器的相关知识
  6. 【C语言】求1*2*3*4*5
  7. 定时备份网站数据文件到阿里网盘
  8. 2007五一[西北行] - 第二天:延安(窑洞,杨家岭,宝塔山...)
  9. window出现msvcp100.dll缺失问题
  10. EduSoho教育周报(0805-0811)