菜单

用python制作游戏外挂

2019年4月15日 - Php
1 #引入autopy模块
2 # ***
3 import autopy
4 autopy.mouse.click() # 单击
5 autopy.mouse.toggle(True) # 按下左键
6 autopy.mouse.toggle(False) # 松开左键

github上有一篇很不利的入门作品,尽管是英文然而很简单,可是自个儿或然摘多少个这一次用赢得的辨证一下,以展现我很努力。

 1 class Menu:
 2    def __init__(self):
 3        self.stuff_pos = []
 4        self.recipes = [None] * 8
 5        self.init_stuff()
 6        self.init_recipe()
 7    def init_stuff(self):
 8        for i in range(9):
 9            self.stuff_pos.append( (L + 102 + (i % 3) * 42, T + 303 + (i / 3) * 42) )
10    def init_recipe(self):
11        self.recipes[0] = (1, 2)
12        self.recipes[1] = (0, 1, 2)
13        self.recipes[2] = (5, 1, 2)
14        self.recipes[3] = (3, 0, 1, 2)
15        self.recipes[4] = (4, 1, 2)
16        self.recipes[5] = (7, 1, 2)
17        self.recipes[6] = (6, 1, 2)
18        self.recipes[7] = (8, 1, 2)
19    def click(self, i):
20        autopy.mouse.move(self.stuff_pos[i][0] + 20, self.stuff_pos[i][1] + 20)
21        autopy.mouse.click()
22    def make(self, i):
23        for x in self.recipes[i]:
24            self.click(x)
25        autopy.mouse.move(L + 315, T + 363)
26        autopy.mouse.click()

移步鼠标

我们这么些外挂里一定有难度的三个难点应运而生了,如何了然大家获得的图像到底是哪1个菜?对人眼……甚至狗眼来讲,那都是二个一定easy的主题素材,“1看就精通”!对的,那便是人比机器高明的地点,大家做起来很简短的职业,计算机却傻傻分不清楚。
autopy图像局限

可以吗,无法用也是好事,不然自个儿怎么引出我们高明的图像分析算法呢?

唯独有点不幸的,假设您其实用一下以此命令,然后用autopy.mouse.get_pos()得到一下当下坐标,发现它并不在(100,100)上,而是更加小部分,比如自个儿的机器上是(九柒,9玖),和分辨率有关。那么些活动是用户了和windows中mouse_event函数,若不清楚api的,知道那回事就好了,正是以此坐标不是很可信赖的。像自身一样很奇怪的,能够去读一下autopy的源码,小编发现他盘算相对坐标算法有标题:

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

point.x = point.x * 0xffff / GetSystemMetrics(SM_CXSCREEN);
就会准多了,纵然理论上会慢一小点,可是自身也懒得改代码重新编译了,差多少个像素,那里对大家影响十分小~咱要吸取教训呀。

截屏和图像处理工具

1 def get_hash(self, img):
2     #使用PIL模块缩放图片,***
3     image = img.resize((18, 13), Image.ANTIALIAS).convert("L")
4     pixels = list(image.getdata())
5     avg = sum(pixels) / len(pixels)
6     return "".join(map(lambda p : "1" if p > avg else "0", pixels))
7

autopy介绍

这里有一个50的开始距离,假设截取图像与其它菜单相比都高于50,表明什么?表达现行反革命丰硕地方的图像不是菜,约等于说顾客还没坐那地方上吧,恐怕我们把嬉戏最小化了(高管来了),这样处理很紧要,免得它恣意找四个最周围但又完全不搭边的菜实行处理。

那是本外挂中最没技能含量的3个类了:)请见谅笔者从未写注释和doc,因为都极粗略,相信你明白。

诚如图像查找原理

此地有三个50的发端距离,尽管截取图像与其它菜单比较都超越50,表达什么?说明现行反革命极度地点的图像不是菜,相当于说顾客还没坐那地点上吗,恐怕我们把嬉戏最小化了(老板来了),那样处理很重点,免得它恣意找2个最相近但又完全不搭边的菜实行处理。

键盘操作

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
1 import autopy
2 autopy.mouse.move(100, 100) # 移动鼠标
3 autopy.mouse.smooth_move(400, 400) # 平滑移动鼠标(上面那个是瞬间的)

看最左侧的顾客头像上面包车型大巴图像,大家需求多个点才可明确那一个范围,分别是图像的左上角和右下角,也便是点二和点三,。前边还有多个顾客的职位,只要求简单的丰裕1个增量就好了,for循环便是为此而生!

活动做菜

键盘操作

万一您须要一个上佳的上学沟通条件,那么您能够思索Python学习交换群:548377875;
倘使你必要一份系统的求学质感,那么您能够思念Python学习沟通群:54837787伍。

点击鼠标

移动鼠标

def hamming_dist(self, hash1, hash2):
return sum(itertools.imap(operator.ne, hash1, hash2))

分析图像

亟待安装autopy和PIL以及pywin3二包。autopy是二个自动化操作的python库,可以效仿壹些鼠标、键盘事件,仍可以够对荧屏进行走访,本来作者想用win32api来效仿输入事件的,发现这一个用起来相比较简单,最厉害的是它是跨平台的,请找寻安装;而PIL那是有名了,Python图像处理的No.1,下边会表明用它来做哪些;pywin32实际不是必须的,可是为了有利于(鼠标它在温馨动着吗,怎么样收场它呢),依旧提议设置一下,哦对了,小编是在win平台上做的,外挂差不多只有windows用户须求呢?

壹经您看过autopy的api,会发现它有3个bitmap包,里面有find_bitmap方法,正是在三个大图像里寻找样品小图像的。聪明的您鲜明能够想到,大家得以截下整个娱乐画面,然后准备有所的菜的小图像用这一个艺术1找就知晓哪些菜被叫到了。确实,一开头自小编也有诸如此类做的欢愉,然而当下就放任了……那一个主意找出图像,速度先不说,它有个规格是“精确相配”,图像上有二个像素的ENVISIONGB值差了一,它就查不出去了。大家明白flash是矢量绘图,它把3个点阵图片体今后显示屏上是因此了缩放的,那里变数就相当大,理论上平等的输入一样的算法得出的结果自然是同样的,然而因为绘图背景等的关系,总会有一丝丝的差异,就是那点距离使得这么些卓绝的函数不可使用了……

活动做菜

自笔者张开了439九小游戏网,点开了多个不闻名的游艺,唔,做寿司的,有资料在单方面,客人过来后表露他们的渴求,你遵照菜单做好端给她便好~
为何这么有难度?八种菜单记不清,点点就点错,鼠标还不佳使肌肉劳损啥的伤不起啊……

看这几个游戏,有捌种菜,每个菜都有一定的做法,顾客假使坐下来,头顶上就会有1个图纸,看图片就精通她想要点什么菜,点击右边原料区域,然后点击一下……不清楚叫什么,像个竹简同样的事物,菜就做完了,然后把做好的食物拖拽到客户日前就好了。

好吧,不能够用也是好事,不然笔者怎么引出我们高明的图像分析算法呢?

开拓你热爱的图像编辑器,早先丈量啊~
大家得明白图像在显示器的具体地方,能够用标尺量出来,本来直接量也是能够的,不过笔者这里运用了镜头左上角的义务(约等于点一)来作为参考地方,那样一旦画面有改造,我们只需求修改三个点坐标就好了,不然每二个点都急需再度写一遍可不是一件欢乐的事情。

急需安装autopy和PIL以及pywin32包。autopy是3个自动化操作的python库,能够如法泡制1些鼠标、键盘事件,还能够对显示屏实行访问,本来作者想用win3二api来模拟输入事件的,发现那一个用起来相比较轻松,最厉害的是它是跨平台的,请寻觅安装;而PIL那是闻明了,Python图像处理的No.一,下边会表明用它来做什么样;pywin3贰事实上不是必须的,但是为了便利(鼠标它在和谐动着吧,怎么着收场它呢),依旧建议安装一下,哦对了,笔者是在win平台上做的,外挂差不多唯有windows用户必要吗?
截屏和图像处理工科具
截屏是赢得游戏图像以供分析游戏提示,其实并未特别的工具直接Print
Screen粘贴到图像处理工科具里也足以。作者用的是PicPick,12分好用,而且个人用户是免费的;而图像处理则是为了博取各类音信的,大家要用它拿走点菜图像后保存起来,供外挂分析判断。笔者用的是PhotoShop…
不要告诉Adobe,其实PicPick中自带的图像编辑器也丰盛了,只要能查看图像坐标和剪贴图片就极饿了,只可是作者习惯PS了~
编辑器
其一笔者就不要说了吧,写代码得要个编辑器啊!小编用VIM,您若愿意用写字板也得以……
原理分析

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()

其一相比较轻易,不过记得那里的操作都是不行丰硕快的,有极大也许游戏还没影响过来啊,你就大功告成了,于是失利了……
所以供给的时候,请sleep一小会儿。

 #引入autopy模块
 # ***
 import autopy
 autopy.mouse.click() # 单击
 autopy.mouse.toggle(True) # 按下左键
 autopy.mouse.toggle(False) # 松开左键

看最左边的消费者头像上边的图像,我们必要多个点才可规定这么些限制,分别是图像的左上角和右下角,约等于点贰和点三,。前面还有八个顾客的职责,只须求轻便的充分四个增量就好了,for循环就是为此而生!

自家张开了439玖小游戏网,点开了3个不有名的游艺,唔,做寿司的,有材质在一方面,客人过来后表露他们的供给,你依据菜单做好端给他便好~
为何这么有难度?8种菜单记不清,点点就点错,鼠标还不佳使肌肉劳损啥的伤不起啊……

消费者头上呈现图片的职位是一直的,总共也只有多少个地点,大家得以逐1分析,而原料的岗位也是确定地点的,每个菜的做法更是清晰,那样1来大家全然可以肯定,程序能够很好的帮我们做出一份一份的美味并奉上,于是钱滚滚的来:)

autopy图像局限

def hamming_dist(self, hash1, hash2):
return sum(itertools.imap(operator.ne, hash1, hash2))
好了,我们可以用准备好的正经图像,然后预先读取总计特征码存款和储蓄起来,然后再截图与它们相比就好了,距离最小的11分正是对应的菜,代码如下:

那个命令会让鼠标急迅移动到钦定显示器坐标,你精通如何是显示器坐标的吧,左上角是(0,0),然后向右向下递增,所以拾二四×76八显示器的右下角坐标是……你猜对了,是(十二三,7⑥7)。

先是要评释,那里的游艺外挂的定义,和那个大型网络电子游艺里的外挂可差异,不能够自动打怪,无法喝药不能躲避金霉素……
那做那个外挂有甚用?问的好,没用,除了能够浪费你或多或少年华,升高级中学一年级下编制程序技艺,增添一小点点点点点的做外挂的底子以外,毫无用处,假使你是以构建二个惊天地泣鬼神不开则已1开立刻超神的外挂为对象恢复生机的话,大概要让你失望了,请尽快绕道。小编的目标很轻巧,正是自行玩这款小游戏而已。

然则有点不幸的,借使你其实用一下以此命令,然后用autopy.mouse.get_pos()得到一下脚下坐标,发现它并不在(100,拾0)上,而是越来越小片段,比如小编的机械上是(九柒,9玖),和分辨率有关。那几个活动是用户了和windows中mouse_event函数,若不清楚api的,知道那回事就好了,就是这些坐标不是很纯粹的。像本人同1很愕然的,能够去读一下autopy的源码,作者意识她总括相对坐标算法有标题:

以此难题很轻巧,我们只须要把菜单的原料记录在案,然后点击相应岗位便可,作者把它写成了2个类来调用:

买主头上显示图片的地点是永久的,总共也唯有几个岗位,咱们得以逐壹分析,而原料的职位也是一贯的,每一种菜的做法更是清楚,那样1来大家全然可以判明,程序能够很好的帮我们做出1份一份的美味并奉上,于是钱滚滚的来:)

玩过Computer游戏的同查对于外挂料定不面生,可是你在用外挂的时候有未有想过怎么做3个外挂呢?(当然用外挂不是那么道义哈,呵呵),那大家就来看一下怎么着用python来制作三个外挂。。。。

就会准多了,即便理论上会慢一丝丝,不过本人也懒得改代码重新编写翻译了,差多少个像素,那里对我们影响非常的小~咱要吸取教训呀。

github上有壹篇很科学的入门文章,纵然是英文可是非常的粗略,然则自身要么摘多少个这一次用获得的辨证一下,以显示本人很努力。

def get_hash(self, img):
   #使用PIL模块缩放图片,***
  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))

这是本外挂中最没技能含量的3个类了:)请见谅作者未有写注释和doc,因为都很轻巧,相信您知道。

编辑器

点击鼠标

截屏是收获游戏图像以供分析游戏提醒,其实并未有尤其的工具直接Print
Screen粘贴到图像处理工科具里也可以。小编用的是PicPick,11分好用,而且个人用户是免费的;而图像处理则是为着拿走各样新闻的,大家要用它拿走点菜图像后保存起来,供外挂分析决断。小编用的是PhotoShop…
不要告诉Adobe,其实PicPick中自带的图像编辑器也充裕了,只要能查看图像坐标和剪贴图片就非常的饿了,只然则笔者习惯PS了~

赢得二个图形的“指纹”后,我们就能够与标准的图形指纹相比,怎么比较呢,应该利用“汉明距离”,也便是几个字符串对应地点的分化字符的个数。实现也很简短……

本条难题很粗大略,大家只须求把菜单的原料记录在案,然后点击相应岗位便可,笔者把它写成了一个类来调用:

我们这次没用到键盘,所以小编就不说了。
怎么办?分析顾客头上的图像就可以,来,从得到图像开端吧~

借使您看过autopy的api,会发觉它有三个bitmap包,里面有find_bitmap方法,正是在2个大图像里寻觅样品小图像的。聪明的你早晚可以想到,大家得以截下整个娱乐画面,然后准备具备的菜的小图像用这些法子一找就精晓哪些菜被叫到了。确实,一先导笔者也有如此做的扼腕,可是当下就甩掉了……这几个主意找寻图像,速度先不说,它有个规格是“精确相配”,图像上有1个像素的CRUISERGB值差了一,它就查不出来了。大家精通flash是矢量绘图,它把3个点阵图片显示在荧屏上是通过了缩放的,那里变数就十分的大,理论上平等的输入一样的算法得出的结果必然是一样的,可是因为绘图背景等的关联,总会有一丢丢的不一致,正是这一点距离使得那些绝妙的函数不可动用了……

外挂的野史啥的自家不想说啊,有意思味请谷歌(Google)或度娘(注:非本领难点尽能够百度)。

我们将在动用和那几个壹般的原理来剖断用户的点餐,当然我们的算法不容许和Google那般复杂,知乎上有一篇很不利的篇章讲述了这一个难题,有意思味的能够看看,作者一向提交完结:

因为那是类的1个方法,所以有个self参数,无视它。那里的img应该传入三个Image对象,能够使读入图像文件后的结果,也足以是截屏后的结果。而缩放的尺码(1捌,一三)是自个儿依据实际情形定的,因为消费者头像上的菜的图像基本就是这一个比重。事实申明那几个比重依旧挺主要的,因为大家的菜有个别相似,倘诺比例不妥当压缩后就失真了,轻易误判(作者前面就吃亏了)。

大家本次没用到键盘,所以笔者就隐瞒了。

工具的准备

信任你鲜明用过谷歌(Google)的“按图搜图”功能,就算未有,你就落后啦,快去查究!当您输入一张图纸时,它会把与那张图相似的图像都给您表现出来,所以当你找到一张满足的图想做壁纸又感觉太小的时候,基本得以用那一个方法找到适当的~

point.x *= 0xFFFF / GetSystemMetrics(SM_CXSCREEN);
此地先做除法再做乘法,学过1些划算办法的就应有明白对于整数运算,应该先乘再除的,否则就会产生相比较大的绝对误差,假如他写成:

相似图像查找原理

看这几个游戏,有八种菜,每个菜都有固定的做法,顾客只要坐下来,头顶上就会有二个图纸,看图片就清楚他想要点什么菜,点击左边原料区域,然后点击一下……不领悟叫什么,像个竹简一样的事物,菜就做完了,然后把办好的食物拖拽到客户前边就好了。

其一比较轻便,不过记得那里的操作都是卓殊可怜快的,有希望游戏还没影响过来呢,你就形成了,于是战败了……
所以须求的时候,请sleep一小会儿。

咱俩即将动用和那么些貌似的原理来推断用户的点餐,当然大家的算法相当小概和谷歌那般复杂,新浪上有一篇很正确的稿子讲述了那个主题素材,有意思味的能够看看,笔者一贯付出完结:

我们以其它挂里一定有难度的三个难题应运而生了,如何晓得我们取得的图像到底是哪1个菜?对人眼……甚至狗眼来说,那都以二个一定easy的主题材料,“壹看就了然”!对的,那正是人比机器高明的地方,大家做起来很简短的事体,计算机却傻傻分不清楚。

 1    def order(self, i):
 2        l, t = self.left + i * self.step, self.top
 3        r, b = l + self.width, t + self.height
 4        hash2 = self.get_hash(ImageGrab.grab((l, t, r, b)))
 5        (mi, dist) = None, 50
 6        for i, hash1 in enumerate(self.maps):
 7            if hash1 is None:
 8                continue
 9            this_dist = self.hamming_dist(hash1, hash2)
10            if this_dist < dist:
11                mi = i
12                dist = this_dist
13        return mi

好了,大家能够用准备好的正儿八经图像,然后预先读取总结特征码存款和储蓄起来,然后再截图与它们相比就好了,距离最小的卓殊正是相应的菜,代码如下:

无差距于的,大家原质感的任务,“竹席”的职位等等,都足以用那种措施获得。注意得到的都以相对游戏画面左上角的周旋地点。至于抓图的法门,PIL的ImageGrab就很好用,autopy也得以抓图,为啥不用,作者下边就会提及。

因为那是类的1个艺术,所以有个self参数,无视它。那里的img应该传入贰个Image对象,能够使读入图像文件后的结果,也得以是截屏后的结果。而缩放的尺码(1八,一叁)是自己依据真实意况定的,因为消费者头像上的菜的图像基本就是其1比重。事实评释这几个比例依旧挺主要的,因为大家的菜某个相似,假诺比例不稳妥压缩后就失真了,轻巧误判(笔者以前就吃亏了)。

本条命令会让鼠标赶快移动到钦定显示屏坐标,你精晓怎么样是显示器坐标的呢,左上角是(0,0),然后向右向下递增,所以10贰4×76八显示器的右下角坐标是……你猜对了,是(10贰三,7六柒)。

如何是好?分析顾客头上的图像即可,来,从得到图像起始吧~

autopy介绍

此处先做除法再做乘法,学过好几计量办法的就应当明了对于整数运算,应该先乘再除的,不然就会发出相比较大的零值误差,假如她写成:

开垦你热爱的图像编辑器,起头丈量啊~
我们得知道图像在显示屏的具体地点,能够用标尺量出来,本来直接量也是能够的,然则本人这里运用了镜头左上角的职分(也正是点一)来作为参考地点,那样假如画面有改造,大家只供给修改贰个点坐标就好了,不然每种点都急需再行写一次可不是壹件喜悦的政工。

本条自家就绝不说了吗,写代码得要个编辑器啊!笔者用VIM,您若愿意用写字板也得以……

深信不疑您早晚用过谷歌的“按图搜图”作用,要是未有,你就落后啦,快去试试!当您输入一张图纸时,它会把与那张图相似的图像都给您表现出来,所以当您找到一张知足的图想做壁纸又感到太小的时候,基本得以用这么些法子找到适合的~

一致的,大家原材质的职位,“竹席”的地方等等,都足以用那种方式获得。注意获得的都以相对游戏画面左上角的对峙地方。至于抓图的艺术,PIL的ImageGrab就很好用,autopy也足以抓图,为啥不用,作者下边就会说起。

获得二个图纸的“指纹”后,大家就足以与正规的图纸指纹相比,怎么比较呢,应该使用“汉明距离”,也正是三个字符串对应地点的两样字符的个数。实现也很轻松……

工具的准备

 import autopy
 autopy.mouse.move(100, 100) # 移动鼠标
 autopy.mouse.smooth_move(400, 400) # 平滑移动鼠标(上面那个是瞬间的)
point.x *= 0xFFFF / GetSystemMetrics(SM_CXSCREEN);

玩过Computer游戏的同班对于外挂确定不生分,但是你在用外挂的时候有未有想过什么做三个外挂呢?(当然用外挂不是那么道义哈,呵呵),那我们就来看一下什么样用python来塑造三个外挂。。。。

外挂的野史啥的自作者不想说啊,有意思味请谷歌(谷歌)或度娘(注:非本领难题尽能够百度)。

原理分析

先是要注解,这里的玩乐外挂的定义,和那1个大型网络电子游艺里的外挂可不等,无法自动打怪,无法喝药无法躲避克林霉素……
那做这些外挂有吗用?问的好,没用,除了能够浪费你或多或少时日,升高级中学一年级下编制程序技能,扩张一小点点点点点的做外挂的基本功以外,毫无用处,假设您是以制作3个惊天地泣鬼神不开则已1开立即超神的外挂为对象苏醒的话,可能要让您失望了,请及早绕道。笔者的目标很简短,正是机动玩那款小游戏而已。

浅析图像

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图