首页 >> 百科

怎么做外挂(游戏是怎么制作出来的)

2023-04-21 百科 139 作者:admin

玩过电脑游戏的同学对金手指肯定不陌生,但是大家在使用金手指的时候有没有想过如何制作金手指呢? (当然用外挂就没那么道德了,哈哈),那我们就来看看怎么用它做外挂吧。 . . .

我打开4399小游戏网站,点了个不知名的游戏,嗯,寿司师傅,旁边有材料,等客人过来跟他们说要什么,你就可以按菜单上菜了~为什么? 这么困难? 8种菜单记不住,点错了。 鼠标不够好,无法使我的肌肉拉伤。 我买不起&;…

首先声明一下,这里的游戏金手指的概念和大型网游里的金手指是不一样的。 他们不能自动打怪,不能喝药,不能自动躲GM……那这个外挂有什么用呢? 问得好,没用,除了能浪费你一点时间,提高你的编程水平,为做插件增加一点基础,没用。 如果你带着即时超神外挂作为目标来到这里,恐怕要让你失望了,请尽快绕道而行。 我的目的很简单,就是自动玩这个小游戏。

工具准备

这篇文章需要你有一定的基础,语法什么的我就不解释了~

需要安装和 PIL 以及软件包。

是一个自动操作库,可以模拟一些鼠标键盘事件,也可以访问屏幕。 本来我是想用它来模拟输入事件。 我发现它使用起来比较简单。 最厉害的是它是跨平台的。 请搜索并安装; 而PIL是有名的,图像处理的No.1,下面将解释如何处理它; 其实没必要,但是为了方便(鼠标是自己动的,怎么结束),建议安装,哦对了,我是在win平台下做的,插件大概只需要用户,对吧?

屏幕捕获和图像处理工具

截图是为了获取游戏图片,用于分析游戏提示。 事实上,没有专门的工具可以将它们直接打印并粘贴到图像处理工具中。 我用的,挺好用的,个人用户免费; 而图像处理就是获取各种信息,我们需要用它来获取订单图像并保存,以供插件分析判断。 我用的……别告诉Adobe,其实内置的图片编辑器就够用了,只要能查看图片坐标和裁剪图片就饿了,不过PS习惯了~

编辑

这个不用我说,你需要一个编辑器来写代码! 我使用 VIM,如果您愿意,也可以使用写字板...

原理分析

我不想谈论作弊的历史。 有兴趣的请谷歌或度娘(注:非技术问题可以百度)。

看这个游戏,一共有8种菜,每道菜都有固定的做法。 顾客一坐下,头顶就会有一张图片,看图片就知道自己要点什么菜。 点左边的原料区,然后点…… ……不知道叫什么,就好像一个竹简,菜做好了,然后把做好的菜拖到顾客面前。

图片显示在顾客头上的位置是固定的,一共只有四个位置。 我们可以一一分析,原材料的位置也是固定的。 每一道菜的做法更是一目了然。 这样一来,我们完全可以判断,这个程序可以帮我们一道一道做出美味的菜肴并端上桌,钱滚滚而来:)

介绍

上面有一篇很好的介绍性文章。 虽然是英文,但是很简单。 不过,我会挑一些解释,我可以利用这段时间来表明我很努力。

移动鼠标

import autopyautopy.mouse.move(100, 100) # 移动鼠标autopy.mouse.smooth_move(400, 400) # 平滑移动鼠标(上面那个是瞬间的)

这个命令会让鼠标快速移动到指定的屏幕坐标,你知道什么是屏幕坐标,左上角是(0,0),然后往右往下递增,所以右下角的坐标是1024×768 屏幕是……你猜对了,它是 (1023,767)。

但不幸的是,如果你真的使用这个命令,然后用.mouse.()来获取当前坐标,你会发现它不在(100,100)上,而是更小了,比如(我机器上的97,99),和决议。 这种运动是用户和中心的功能。 如果你不知道api,你应该知道这个,但是坐标不是很准确。 如果你和我一样好奇,可以阅读源码。 我发现计算绝对坐标的算法有问题:

point.x *= 0xFFFF / GetSystemMetrics(SM_CXSCREEN);

这里,先做除法再做乘法。 学过一点计算方法的应该知道,对于整数运算,应该是先乘后除,否则会有比较大的误差。 如果写成:

point.x = point.x * 0xffff / GetSystemMetrics(SM_CXSCREEN);

会更准确,虽然理论上会慢一点,但是懒得改代码重新编译了,相差几个pixel,这个对我们影响不大~要吸取教训。

点击鼠标

import autopyautopy.mouse.click() # 单击autopy.mouse.toggle(True) # 按下左键autopy.mouse.toggle(False) # 松开左键

这个比较简单,但是记住这里的操作非常非常快。 有可能是游戏还没反应过来,而你已经完成了,所以你失败了……所以必要的时候,请多睡一会儿。

键盘操作

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

怎么做? 分析一下顾客头上的图像就可以了,来吧,我们先从获取图像开始吧~

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

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

同样的,我们的原材料的位置,“竹席”的位置等等,都可以通过这个方法得到。 注意获取的相对位置是相对于游戏画面的左上角。 至于抓图的方法,PIL很好用,也可以抓图。 为什么不呢,下面我会讲到。

分析图像

我们的插件中一个非常棘手的问题就出现了,如何知道我们得到的图片是哪个菜? 对于人眼……甚至狗眼来说,这是一个相当简单的问题,“一看就知道”! 没错,这就是人类优于机器的地方。 我们做简单的事情,但计算机无法区分它们。

图片限制

如果你看过这个 api,你会发现它有一个包,其中包含在大图像中查找样本小图像的方法。 如果你聪明的话,你肯定可以认为我们可以捕获整个游戏画面,然后准备所有菜肴的小图像。 使用此方法找出调用了哪道菜。 确实,一开始我也有想这么做的冲动,但是立马放弃了。。。这个方法搜索图片,速度不说,它有一个条件“完全匹配”,一个像素的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 hamming_dist(self, hash1, hash2): return sum(itertools.imap(operator.ne, hash1, hash2))

好吧,我们可以使用准备好的标准图像,然后预读计算出特征码并存储起来,然后截屏与它们进行比较。 距离最小的就是对应的菜。 代码如下:

 def order(self, i): l, t = self.left + i * self.step, self.top r, b = l + self.width, t + self.height hash2 = self.get_hash(ImageGrab.grab((l, t, r, b))) (mi, dist) = None, 50 for i, hash1 in enumerate(self.maps): if hash1 is None: continue this_dist = self.hamming_dist(hash1, hash2) if this_dist < dist: mi = i dist = this_dist return mi

这里初始距离为50,如果截图图片与任意菜单相比大于50,说明什么? 说明那个位置的图像不是菜,也就是说顾客还没有坐到那个位置,或者我们把游戏最小化了(老板来了),所以处理很重要so它不会随机找到最接近但完全不同的图像。 处理配菜。

自动烹饪

这个问题很简单,我们只需要记录菜单的食材,然后点击对应的位置,我写成一个类来调用:

class Menu: 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.recipes[2] = (5, 1, 2) self.recipes[3] = (3, 0, 1, 2) self.recipes[4] = (4, 1, 2) self.recipes[5] = (7, 1, 2) self.recipes[6] = (6, 1, 2) self.recipes[7] = (8, 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()

这是这个插件里最没有技术含量的课了:)不写笔记和文档请见谅,因为很简单,相信你懂的。

郑重声明:本文版权归原作者所有,转载文章仅出于传播更多信息之目的。 如作者信息标注有误,请第一时间联系我们修改或删除,谢谢。

关于我们

最火推荐

小编推荐

联系我们


Copyright 8S新商盟 Rights Reserved.
联系YY号:2949821684
邮箱:chenjing919994@sohu.com
备案号:浙ICP备2023016511号-1