想不想了解用python做“外挂”,嘿嘿

前言
相信大家都玩过电脑游戏,是不是对外挂很是痛恨,在痛恨的同时,想不想也做一个外挂,以
暴制暴,我猜大家肯定是很想的。
打开4399小游戏网,随便点开一个小游戏,唔, 是居家游戏... 就是小时候我们过家家那种。
导言
首先声明,这里做外挂的概念,并不是那很大型的外挂(因为肯本写不出 o(╥﹏╥)o),没有
像以前DNF那个万箭齐发,什么召唤拉等等的那种牛逼效果,也做不到像吃鸡那种自动瞄准,
锁头外挂,哈哈......那做这种外挂有什么用呢?问到点子上了,啥用都没,( 别吐槽呀-!),
除了浪费一点点时间,提高一下编程技术,编程思想(可能会有启发哟),增加一点点点点点的外挂基础,如果你想做制作一个上面那种什么牛逼外挂,不开是小白,一开稳大神的那种,恐怕要让您失望了,请您不用浪费时间(做不到)。我的目的很简单,就是自动玩这款小游戏而已(废话不多说,开始装逼了)。
工具的准备
你需要安装autopy和PIL以及pywin32包
autopy是一个自动化的Python库,它可以模拟一些鼠标和键盘事件,也可以访问屏幕。我想使用Win32 API来模拟输入事件。我发现这个用起来比较简单,最强大的是它是跨平台的,请大家搜索和安装。PIL是有名的,Python图像处理1号,下面会解释怎么用它。Pywin32不是很必要,但是为了方便(鼠标是自己移动的,怎么结束它),建议安装它,哦,是的,我是在win平台上做的,这个插件可能只需要windows用户,对吧?

截屏和图像处理工具
屏幕截图是为了捕捉游戏画面进行游戏提示分析。其实没有专门的工具可以将打印画面直接粘贴到图像处理工具中。我使用PicPick,它非常容易使用,而且对个人用户是免费的。而图像处理就是要获取各种信息,我们需要利用它来获取有序的图像,并将其保存起来供外部分析和判断。我使用PhotoShop……(不要告诉我Adobe好用),其实PicPick自己的图片编辑器就足够了,只要你能查看图片坐标和剪辑图片,就可以了,只是我习惯PS(就只会PS - -!) ~
游戏分析
(随便举个例子)看这个游戏,有八种菜肴,每一种都有固定的练习。一旦顾客坐下,他的头顶上就会有一幅画。看这张照片,知道他想要什么。点击左侧的原材料区域,然后点击……我不知道该叫什么,像竹简一样,菜就做好了,然后把做好的菜拖给顾客。

客户头上显示的图片位置是固定的,总共只有4个位置。我们可以逐个分析,原材料的位置也是固定的。每道菜的做法都更清晰,所以我们可以完全判断,这个程序可以帮助我们做出好菜,并提供它,所以钱滚滚而来:)(嘿嘿,上代码)
小编推荐一个学python的学习qun 740322234
无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!
移动鼠标
此命令允许鼠标快速移动到指定的屏幕坐标。你知道屏幕坐标是什么。左上角是(0,0),然后向右递增,所以1024 *768屏幕的右下角坐标为…你猜对了(1024,767)(哈哈,其实(1023,767))。
不幸的是,如果您实际使用此命令并使用autopy。鼠标。get_pos()要获得当前坐标,您将发现它不在(100,100)上,而是更小,例如,在我的机器(97,99)上,它与分辨率有关(看自己的分辨率哟)。这个移动是Windows中的user和mouse_event函数。如果你不知道api(百度),最好知道它。只是坐标不是很精确。尽管我很好奇,但我可以阅读autopy的源代码,发现他在计算绝对坐标时存在问题。
point.x *= 0xFFFF / GetSystemMetrics(SM_CXSCREEN);
这里,先除后乘。如果你学过一些计算方法,你应该知道对于整数运算,你应该先乘后除。
否则,会有相对较大的误差。如果他这样写:
point.x = point.x * 0xffff / GetSystemMetrics(SM_CXSCREEN);
它会更准确,虽然理论上它会慢一点,但我不会费心改变代码重新编译,几个像素,在这里我们影响不大~我们要吸取教训。

点击鼠标
这是相对简单的,但请记住这里的操作是非常非常快的,有可能游戏还没有回应它,你完成了,然后失败了……所以如果你有必要的话,睡一会儿(睡你麻痹,起来嗨,(¦3[▓▓] 晚安)。
键盘操作
这次我们没有用键盘,所以我就不讲了。
你是怎么做到的? 分析客户头上的图像是可以的。让我们从图像采集开始
打开您最喜欢的图像编辑器,并开始测量它。我们需要知道图像在屏幕上的准确位置,可以用尺子测量(0.0)。也可以直接测量,但是我使用图片左上角的位置(point (1)点1)作为这里的参考位置,这样一旦图片发生变化,我们只需要修改一个点坐标,否则每一个点都可以。重写它不是一件愉快的事。
看最左边客户头顶上方的图像,我们需要两个点来确定范围,图像的左上角和右下角,即点2和点3。后面有三个客户,只需添加一个增量,而for循环就是用于此目的的!
同样的,我们原材料的位置,“竹席”的位置等都可以通过这种方式得到。注意,获得了游戏屏幕左上角的相对位置。对于抓取图片的方法,PIL的图片抓取是非常有用的,autopy也可以抓取图片。为什么不呢? 我待会再谈(井然有序(o)/~)。

分析图像
我们的插件中出现了一个相当困难的问题。我们怎么知道我们得到的图像是哪道菜?在人类看来……即使对于狗的眼睛来说,这也是一个相当简单的问题,“你一眼就能看到”!是的,那就是人比机器聪明的地方。我们可以做简单的事情,但电脑是愚蠢和困惑(除了阿尔法狗 -_-||)。
autopy图像局限
如果您查看autopy的api,您会发现它有一个带有find_bitmap方法的位图包,该方法在大图像中查找小样本图像。你可以想象的很聪明,我们可以剪下游戏的全貌,准备所有菜肴的小图片。这样,我们就可以知道这道菜叫什么了。
的确,起初我有这样做的冲动,但我立即放弃了……这个方法搜索图像,更不用说速度了。
它具有“精确匹配”的条件,如果图像上一个像素的RGB值为1,则不会检测到。
我们知道flash是矢量图。它在屏幕上显示一个点阵图片,并已放大和缩小。这里的变量很大。
理论上,相同的输入算法会得到相同的结果。但是由于绘图背景与其他因素的关系,总会有一个小的缺口,使得这个奇妙的函数无法使用……(无语- - !)
不使用它很好,否则我怎么能推导出优秀的图像分析算法呢?

相似图像查找原理
我相信你一定用过谷歌的“图搜索”功能,如果没有,那就过时了,去试试吧!当你输入一张图片,它会显示给你相似的图像,所以当你找到一个理想的图像,觉得太小做墙纸,你基本上可以用这个方法找到正确的~
我们需要使用类似的原则来判断用户的顺序点餐。当然,我们的算法不能像谷歌那样复杂。我知道有一篇很好的文章描述了这个问题(这里)。感兴趣的可以看看,我直接给实现:

因为这是类的一个方法,所以有一个self参数会忽略它。这里的img应该传递一个图像对象,它可以读取图像文件的结果,也可以读取屏幕截图的结果。比例大小(18,13)是根据实际情况而定的,因为顾客头上的菜品形象基本上就是这个比例。这个比例仍然很重要,因为我们的菜
有点相似。如果比例压缩不当,就会被扭曲,很容易被误判。
当我们得到一张图片的指纹后,我们可以将它与一张图片的标准指纹进行比较。我们怎么比较呢?我们应该使用汉明距离,即两个字符串的位置对应的不同字符的数量。很容易实现…(相对于)

我们可以使用准备好的标准图像,然后预先读取计算签名来存储它们,然后将屏幕截图与它们进行比较。最小的距离是对应的菜,代码如下:

这是初始距离50。如果截获的图像与任何菜单相比都大于50,这意味着什么?
那个位置的图像不是一个菜,也就是说,客户还没有坐在那里,或者我们最小化了游戏(老板来了,嘿嘿),所以处理它是很重要的,这样它就不会随机找到最近的菜,但它根本不匹配。
自动做菜
这个问题很简单,我们只需要把菜单的原料记录在案,然后点击相应位置便可,我把它写成了一个类来调用:

这是本外挂中最没技术含量的一个类了:)请原谅我没有写注释和doc,因为都很简单,相信你懂得(因为我懒,)。
警遵小编言,请勿商业用途(因为是不可能滴,娱乐的把玩编程才能快速学好,心情愉快)
哈哈哈,祝大家BUG多多,生活愉快哈