前段时间老同学叫我做个连连看外挂,但是那时候要考试没时间做,就耽搁下来了,直到最近几天才又萌生了写连连看外挂的念头,刚好是周末,正好有时间来写这个外挂。

写外挂之前,先理顺写外挂的思路,第一步当然是先玩几盘连连看,熟悉一下游戏规则,这叫“实战出真知”“实践是检验真理的唯一标准”。几盘下来,眼睛都花了,愣是没赢过一盘,看来我不是玩连连看的料……虽然游戏没赢,但是我从游戏的过程中知道了游戏的规则,后来再看看游戏的规则介绍,和我理解的差不多:两个图案直接可以用线段链接,且线段数小于三。至此,游戏了解完毕。

接下来,在实现游戏算法前必须做的就是要把游戏区域编码,把复杂的图像信息转化为容易处理的矩阵,这样才可以和后面的算法进行对接。

先看看游戏图像和相应的编码矩阵:

(15)

(13)

要把游戏区域进行编码,那必须先把游戏区域定位,然后再定位游戏区域的各个图像的位置,接着再对各个图像进行标识,把相同的图像归类和统计。在这一部分,我用了上次做的“大家来找茬外挂”的基础,先截屏,确定好游戏区域,然后把游戏区域截取下来。这部分内容可以参照我上两篇找茬外挂的教程,这里就不赘述了。

在游戏区域图像获得后,就可以开始游戏图像的编码了,通过观察可以看出来每个图像块是以31*35的大小重复的,整个游戏区域共有19*11个图像块,于是先声明一个board[11][19]的二维数组进行存储各个图像的ID,至于图像的比较,我是用每个图像的15个像素进行比较的,如果rgb分别相同,这这两个图像必为同一图像。网上有童鞋说用5个像素甚至4个像素就可以确定两幅图像是否相同,但是我试过会有出现误判,所以我建议还是多取几个点好,反正这对于计算机来说真的不算什么,影响不了速度的,至少肉眼还看不出来。

从头开始比较各个图像块,把相同的图像只放一个进链表,并且写入改图像块的ID。当比较完毕,我们就可以得到30多个都不一样的图像块链表,这个链表就是这个游戏区域的所有图像块的索引。下面是我定义的这个索引图像块的结构体,大家制作的时候可以作为参考,其中我还增加了一项count来统计每个图像块的数量,后来才发现出来道具图像块是两个,其他的图像块都是4个,等等,我还发现了背景图像块也统计出来了,是80几个,当然不同的游戏场景的背景图像块的数量不一样,但是通过游戏可以知道,背景图像块必定是大于4个的,所以,我用图像块的数来来进行判断该图像是否是背景图像块。判断背景图像块有什么用?呵呵,这作用就大了,只有知道了图像块的ID,在后面的才好实现算法进行通路的检测(在前面的图像编码图片就可以看出来,背景图像块的ID为13)。

typedef  struct{
 IplImage*  img;
 int  id;
 int  count;
}diffImg;

//Begin将所有不同的图案推入链表
for(int j=0;j<11;j++)
for(int i=0;i<19;i++){
 rect.x=31*i;
 rect.y=35*j;
 rect.width=31;
 rect.height=35;
 cvSetImageROI( pImg,rect );
 cvCopy(pImg,temp1);
 bool haveSame=false;
 std::list<diffImg>::iterator it = NULL; 
 if (listImg.empty())
 {
  diffImg dif;
  dif.img=temp1;
  dif.id=id;
 listImg.push_back(dif);
 temp1 =cvCreateImage(cvSize(31, 35), pImg->depth,pImg->nChannels);
 cvCopy(pImg,temp1);
 }
  for(it= listImg.begin(); it!=listImg.end(); ++it)  
 {  
  IplImage *temp3=it->img;
  if(isSame(temp1,temp3))
  {
   haveSame=true;
   board[j][i]=it->id;
  }
  
 }
  if(!haveSame)
  {
  temp2 =cvCreateImage(cvSize(31, 35), pImg->depth,pImg->nChannels);
   cvCopy(temp1,temp2);
   diffImg dif2;
   dif2.img=temp2;
   id+=1;
   dif2.id=id;
   board[j][i]=id;
   listImg.push_back(dif2);
  }
  
}//End将所有不同的图案推入链表

以上面的方法得到背景图像块的ID后就可根据该ID把所以背景图像圈出来,下面看看效果图:
(11)

圈出相同ID的图像块:

(10)

编写核心算法,主要就是对两个图像块进行通路的判断。这部分算法可以上网找找参考资料,研究连连看算法的人还挺多的,这里我也就不赘述了。

把第一不获取到的图像编码和算法进行对接,然后再输出结果,最后把输出的结果转化会模拟鼠标点击,这个外挂就算是做好了。这部分内容在以前的外挂详细说明过。

到这里,外挂做好了,进入测试发现无敌了,玩了到今天已经7000多分了……

后来发给同学测试,同学测试后反馈说速度太快太假了,他建议加个功能可以调节点击快慢。这个建议不错,于是我加入一个编辑框,随时可以改变点击的间隔时间,哈哈,设置一个合理的间隔时间别人就不会怀疑我是用外挂了。

看看最终界面:

(11)

然后再看看设置间隔时间为10毫秒的测试效果(个人感觉挺壮观的):

(11)

其他的两篇外挂文章:

http://blog.long1986.com/blog/20100311173/based-on-opencv-and-mfc-of-everyone-to-finding-fault-plug-in-upgrade.html (32)

http://blog.long1986.com/blog/20100311168/using-vc-opencv-to-write-everyone-to-finding-fault-plug-in.html (32)

题目为:用VC++, OpenCV写大家来找茬外挂

如无特殊说明,本站内容均为原创,转载请注明: 转载自longlongago (29)

本文链接地址: http://blog.long1986.com/blog/20100328206/lianliankan-plug-in-production-based-on-opencv-vc.html (21)

连连看外挂制作–基于OpenCVVC++相关推荐

  1. 连连看外挂制作 —— 修改分数(1)

    标 题: 连连看外挂制作 -- 修改分数(1) 作 者: Koma 时 间: 2009-12-10 21:10 链 接: http://blog.csdn.net/wangningyu/archive ...

  2. 连连看外挂制作 —— 无限时间(2)

    标 题: 连连看外挂制作 -- 无限时间(2) 作 者: Koma 时 间: 2009-12-11 08:10 链 接: http://blog.csdn.net/wangningyu/archive ...

  3. 连连看外挂的制作.1 ----- 建立模型

    <script type="text/javascript"> </script> 前一段看Linux内核,看的头晕眼花,不得不承认,自己还没到那个层次,到 ...

  4. 连连看外挂消去算法分析

    很久之前发布了一个小外挂,是我自己捣鼓出来的QQ游戏连连看外挂. 见:http://www.cnblogs.com/G_Weber/archive/2009/06/02/1494871.html 在做 ...

  5. 没事也研究一下外挂--C#简单游戏外挂制作(以Warcraft Ⅲ为例)

    网上有很多外挂制作的教程,大多是讲针对大型网络游戏的,主要包含一些抓包.反汇编.C++的知识综合.事实也如此,常见的外挂都是使用VC++写的,从来没有过C#或者其他.NET语言编写的外挂. 作为微软. ...

  6. 游戏外挂制作指南 (一)

    要想在修改游戏中做到百战百胜,是需要相当丰富的计算机知识的.有很多计算机高手就是从玩游戏,修改游戏中,逐步对计算机产生浓厚的兴趣,逐步成长起来的.不要在羡慕别人能够做到的,因为别人能够做的你也能够!我 ...

  7. c#调用windows api C#简单游戏外挂制作(以Warcraft Ⅲ为例)

    C#简单游戏外挂制作(以Warcraft Ⅲ为例) 网上有很多外挂制作的教程,大多是讲针对大型网络游戏的,主要包含一些抓包.反汇编.C++的知识综合.事实也如此,常见的外挂都是使用VC++写的,从来没 ...

  8. 200行Python实现效果逆天的连连看外挂

    本文内容转自我本人的知乎回答:你看过/写过哪些有意思的代码? - 三级狗的回答 - 知乎 https://www.zhihu.com/question/275611095/answer/4079841 ...

  9. Java敌人跟地图的碰撞_(译)加入敌人和战斗:如果使用cocos2d制作基于tiled地图的游戏:第三部分...

    免责申明(必读!):本博客提供的所有教程的翻译原稿均来自于互联网,仅供学习交流之用,切勿进行商业传播.同时,转载时不要移除本申明.如产生任何纠纷,均与本博客所有人.发表该翻译稿之人无任何关系.谢谢合作 ...

最新文章

  1. python 自定义异常
  2. java flexpaper_java web word文件 pdf文件在线预览源码(flexpaper)
  3. web.xml初始化spring容器
  4. python实现弹幕_python实现b站直播自动发送弹幕功能
  5. iOS API离线文档下载和查阅
  6. js语句连接mysql数据库_js中require()的用法----JS如何连接数据库执行sql语句或者建立数据库连接池...
  7. c语言圆周率计算_C语言入门这一篇就够了
  8. 每日小记2017.2.20
  9. 萌新的Python练习实例100例(三)一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数
  10. FPGA 无解漏洞 “StarBleed”轰动一时,今天来扒一下技术细节!
  11. 运维架构师-并不遥远的彼岸
  12. liunx 环境-配置docker阿里云镜像加速
  13. 应用PIC16F1938中IIC读取LM75A温度
  14. 阶段3 2.Spring_01.Spring框架简介_03.spring概述
  15. /etc/init.crs enable\disable 状态
  16. 最强的右键菜单工具:超级右键专业版 mac中文版
  17. 怎么成为抖音本地生活服务商家?需要哪些资质条件?
  18. csv to dbf java_将csv文件转换为dbf
  19. 计算机硬盘容量越大运行速度越快,你是不是也感觉电脑内存越大运行速度越快?...
  20. 认识计算机重点知识,认识计算机教案

热门文章

  1. 作好软件测试的人格特质:要有耐性
  2. 如何将flac格式转换成mp3?
  3. C语言如何实现返回子函数的多个参数
  4. 電話號碼和手機號碼常識!
  5. 骁龙 835 人工智能技术:机器学习带来个性化体验
  6. 爬虫-requests,微信公众号推送
  7. java实现数字转换人民币中文大写工具
  8. 2023年盐城工学院五年一贯制专转本招生简章
  9. 代码托管你只知道 GitHub?
  10. 创立于使用指南的谷歌云GPU服务器