如何制作外挂(游戏辅助制作教程)

玩过电脑游戏的同学对外挂都不陌生,但是你有没有想过在使用的时候如何制作一个外挂呢?(当然用插件也没那么道德,呵呵),那我们就来看看怎么用python做一个插件吧

如何制作外挂(游戏辅助制作教程)插图

如何制作外挂(游戏辅助制作教程)插图(1)

玩过电脑游戏的同学对外挂都不陌生,但是你有没有想过在使用的时候如何制作一个外挂呢?(当然用插件也没那么道德,呵呵),那我们就来看看怎么用python做一个插件吧。。。。

我打开4399小游戏网,点开了一个不知名的游戏。嗯,寿司师傅会在边上放一些材料。当客人过来时,告诉他们想要什么。照着菜单给他端上来。为什么这么难?8种菜单我都记不住,但是点的时候都记不对,鼠标也不能让我肌肉拉伤什么的...

首先需要说明的是,这里的游戏外挂和大型网游中的游戏外挂概念是不一样的。不能自动打怪物,不能吸毒也不能躲避GM……做这个外挂有什么用?这是一个很好的问题,但是没什么用,除了可以浪费你的时间,提高你的编程技巧,为插件增加一点点基础。如果你是抱着做一个惊天动地的外挂的目标来的,一打开就超级神奇,恐怕你要失望了。请尽快绕道。我的目的很简单,就是自动玩这个小游戏。

工具的准备

本文要求你有Python基础。我就不解释Python语法什么的了~

计算机编程语言

需要安装Autopy和PIL和pywin32软件包。

Autopy是一个自动运行的python库,可以模拟一些鼠标键盘事件,也可以访问屏幕。本来想用win32api模拟输入事件,但是发现这个用起来比较简单。最棒的是它是跨平台的。请搜索并安装它;而著名的PIL,是Python图像处理的头号人物。下面是如何处理它:Pywin32其实没必要,但是为了方便(鼠标自行移动,如何结束),建议安装。哦,对了,我是在win平台上做的,插件大概只有windows用户需要吧?

屏幕捕获和图像处理工具

截屏是获取游戏图像,用于分析游戏提示。事实上,没有专门的工具可以直接将打印屏幕粘贴到图像处理工具中。我用的是PicPick,相当好用,个人用户免费;而图像处理就是获取各种信息。我们需要用它来获取排序图像,并保存下来供外部分析判断。我用的是PhotoShop…不要告诉Adobe。其实PicPick自带的图片编辑器就足够了。只要能查图像坐标,能剪贴图片就饿了,不过习惯PS了~

编辑

这个不用我说,你需要编辑器写代码!我使用VIM,如果你喜欢,你可以使用平板电脑...

原理分析

我不想说外挂的历史。有兴趣的话可以问Google或者度娘(注:非技术问题可以用百度)。

看看这个游戏。菜有8种,每种菜都有固定的方法。一旦顾客坐下,他的头上会有一幅画。看着照片,他就知道自己想要什么了。点选左边的原料区域,然后点选...不知道叫什么。竹简之类的东西会把菜做完,然后把做好的菜拖放到顾客面前。

客户头上显示的图片位置是固定的,总共只有四个位置。我们可以逐个分析,原材料的位置也是固定的。每一道菜的做法都更加清晰,让我们完全可以判断,程序可以帮我们做出一顿美味的饭菜,端上来,于是钱滚滚而来:)

自动尸检简介

github上有一篇非常好的入门文章。虽然是英文,但是很简单。然而,我想举几个例子来说明我是勤奋的。

移动鼠标

导入autopy autocopy . mouse . move(100,100) #移动鼠标autopy.mouse.smooth _ move (400,400) #平滑移动鼠标(上图为瞬时)。该命令将使鼠标快速移动到指定的屏幕坐标。你知道屏幕坐标是多少,对吧?左上角是(0,0),然后向右下方递增。

不过很遗憾,如果你实际使用这个命令,然后用autopy.mouse.get_pos()获取当前坐标,你会发现它不是在(100,100)上,而是更小,比如我机器上的(97,99),这和分辨率有关。这个举动就是windows中的用户和mouse_event函数。如果你不知道api,知道这个就好了,就是这个坐标不是很准确。虽然我很好奇,但我能读懂autopy的源代码。我发现他计算绝对坐标的算法有问题:

point . x * = 0x ffff/GetSystemMetrics(SM _ CX screen);这里,先做除法再做乘法。学过一点计算方法的人应该知道,对于整数运算,要先乘后除,否则会有很大误差。如果他写道:

point . x = point . x * 0x ffff/GetSystemMetrics(SM _ CX screen);会准确很多。虽然理论上会慢一点,但是我也懒得改代码重新编译。差了几个像素,在这里对我们没有太大影响~要吸取教训。

点击鼠标

import autopy autocopy . mouse . Click()# Click autopy . mouse . toggle(True)#按下左键autopy.mouse.toggle(False) #松开左键。比较简单,但是要记住这里的操作非常非常快。可能游戏还没反应过来就结束了,所以你失败了...所以必要的时候请睡觉。

键盘操作

这次我们没有用键盘,我就不说了。

怎么做?分析一下客户头上的形象就好了。来,先从获取图像开始~

如何制作外挂(游戏辅助制作教程)插图(2)

打开你喜欢的图片编辑器,开始测量~我们需要知道图片在屏幕上的具体位置,可以用尺子测量。直接测量也是可以的,但是我这里用的是屏幕左上角的位置(也就是点1)作为参考位置,这样一旦屏幕发生变化,我们只需要修改一个点的坐标,否则每个点都需要重写,并不是一件愉快的事情。

看最左边客户头像上的图像,我们需要两个点来确定这个范围,分别是图像的左上角和右下角,也就是点2和点3。后面有三个客户位,只需加一个增量,for循环就是为此而生的!

同样,我们的原材料的位置,“竹席”的位置等等都可以通过这种方式获得。注意相对于游戏画面左上角的相对位置。至于抓图的方法,PIL的ImageGrab非常好用,autopy也能抓图。为什么不呢?下面我就来说说。

分析图像

我们的插件出现了一个相当棘手的问题。我们怎么知道我们得到的图像是哪道菜呢?对于人眼来说…即使是狗眼,这也是一个相当容易的问题,“一眼就能看出来”!是的,这就是人比机器聪明的地方。我们可以做简单的事情,但计算机无法区分。

自动解剖图像限制

如果你看过autopy的api,你会发现它有一个带有find_bitmap方法的位图包,就是在大图中寻找小样本图。如果你聪明的话,可以想到我们可以把整个游戏画面切掉,然后准备所有菜品的小图像。用这种方法可以查出哪个菜叫。的确,起初,我也有这样做的冲动,但我立即放弃了...这种方法搜索图像,不考虑速度。它有一个“完全匹配”的条件。如果图像中某个像素的RGB值为1,就找不到了。我们知道flash是矢量图。它缩放后在屏幕上显示一个点阵图片,所以这里有很多变量。理论上,同样的算法,同样的输入,得到的结果一定是一致的,但是因为绘图背景的原因,总会有一点差距。正是这种差距使得这个奇妙的功能无法使用...

嗯,不能用是好事。不然我怎么引出我们高明的图像分析算法?

相似图像搜索原理

相信你一定用过谷歌的“按图片搜索”功能。如果不是,那你就落伍了。去试试吧!当你输入一张图片的时候,它会给你显示所有和这张相似的图片,所以当你找到一张喜欢的图片想做壁纸但是又觉得太小的时候,基本上可以用这个方法找到合适的~

我们要用类似于此的原理来判断用户的订购。当然,我们的算法不可能像谷歌的那么复杂。知乎上有一篇很好的文章描述了这个问题。有兴趣的话,请看一下。我直接给出实现:

def get_hash(self, img): image = img.resize((18, 13), Image.ANTIALIAS).convert("L") pixels = list(image.getdata()) avg = sum(pixels) / len(pixels) return "".join(map(lambda p : "1" if p > avg else "0", pixels))

因为这是类的一个方法,所以有个self参数,无视它。这里的img应该传入一个Image对象,可以使读入图像文件后的结果,也可以是截屏后的结果。而缩放的尺寸(18,13)是我根据实际情况定的,因为顾客头像上的菜的图像基本就是这个比例。事实证明这个比例还是挺重要的,因为我们的菜有点儿相似,如果比例不合适压缩后就失真了,容易误判(我之前就吃亏了)。def get_hash(self,img): image = img.resize((18,13),image。抗锯齿)。转换(& # 34;L & # 34)pixels = list(image . get data())avg = sum(pixels)/len(pixels)return & # 34;"。join(map(lambda p:& # 34;1"如果p & gtavg else & # 340",pixels))因为这是类的一个方法,所以有一个self参数。忽略它。这里要把img传入一个Image对象,可以做成读入图像文件后的结果,也可以做成截屏后的结果。而且缩放后的大小(18,13)是我根据实际情况决定的,因为菜在顾客头像上的形象基本就是这个比例。原来这个比例挺重要的,因为我们的菜有些相似。比例不合适,压缩后会失真,容易误判(我之前吃过亏)。

得到一张图片的“指纹”后,我们就可以和标准的图片指纹进行对比了。怎么比较呢?我们要用“汉明距离”,也就是两个字符串对应位置上不同字符的个数。实现也非常简单...

Def Hamming _ Dist (self,hash1,hash2):Return Sum(ITER tools . IMAP(operator . ne,hash1,has H2))好了,我们可以用准备好的标准图,然后提前读取计算特征码存储起来,然后截图和他们对比。距离最小的就是对应的菜,代码如下:

def order(self,i): l,t = self.left + i * self.step,self.top r,b = l + self.width,t+self . height has H2 = self . get _ hash(image grab . grab((l,t,r,b))) (mi,dist) = None,50 for i,hash1 in enumerate(self.maps):如果hash1为None:continue this _ dist = self . hamming _ dist(has H2)如果this _ dist & ltdist:mi = I dist = this _ dist return mi这里是初始距离50。如果抓取的图像与任何菜单相比都大于50,说明什么?说明那个位置的形象不是菜,也就是说客户还没坐到那个位置,或者我们把游戏最小化了(老板来了)。处理这个很重要,防止它随机找到最近的和边完全不搭的菜。

自动烹饪

这个问题很简单。我们只需要记录下菜单的原材料,点击相应的位置。我把它写成一个类来调用:

类菜单:def _ _ init _ _(self):self . stuff _ pos =[]self . recipes =[None]* 8 self . init _ stuff()self . init _ recipe()def init _ stuff(self):for I in range(9):self . stuff _ pos . append((L+102+(I % 3)* 42,T+303+(I/3)* 42))def init _ recipe(self):self . recipes[0]=(1,2) self.recipes[1] = (0,1,2) self . 1,2) def click(self,I):autopy . mouse . move(self . stuff _ pos[I][0]+20,self . stuff _ pos[I][1]+20)autopy . mouse . click()def make(self,I):for x in self . recipes[I]:self . click(x)autopy . mouse . move(L+315,T+363) autopy.mouse.click()这是这个插件中技术含量最低的类:)请原谅我不写注释和doc,因为它们

最后,我呈上边肖准备的python学习资料,关注一下,转发一下,给边肖写封私信& # 34;01"你可以免费得到它!。

如何制作外挂(游戏辅助制作教程)插图(3)

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。

作者:美站资讯,如若转载,请注明出处:https://www.meizw.com/n/60465.html

发表回复

登录后才能评论