Python还能这么玩之用Python做个小游戏的外挂


Posted in Python onJune 04, 2021

一、前言

我打开4399小游戏网,点开了一个不知名的游戏,唔,做寿司的,有材料在一边,客人过来后说出他们的要求,你按照菜单做好端给他便好~要怎么实现他自动做菜呢?

Python还能这么玩之用Python做个小游戏的外挂

二、工具的准备

需要安装autopy和PIL以及pywin32包。

1.截屏和图像处理工具

截屏是获取游戏图像以供分析游戏提示,其实没有专门的工具直接Print Screen粘贴到图像处理工具里也可以。我用的是PicPick,相当好用,而且个人用户是免费的,而图像处理则是为了获取各种信息的,我们要用它得到点菜图像后保存起来,供外挂分析判断。

2.编辑器

用VIM,或写字板都可以

3.游戏原理分析

看这个游戏,有8种菜,每种菜都有固定的做法,顾客一旦坐下来,头顶上就会有一个图片,看图片就知道他想要点什么菜,点击左边原料区域,然后点击一下……不知道叫什么,像个竹简一样的东西,菜就做完了,然后把做好的食物拖拽到客户面前就好了。

顾客头上显示图片的位置是固定的,总共也只有四个位置,我们可以逐一分析,而原料的位置也是固定的,每种菜的做法更是清清楚楚,这样一来我们完全可以判断,程序可以很好的帮我们做出一份一份的佳肴并奉上,于是钱滚滚的来

三、开挂步骤

 1.移动鼠标

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

这个命令会让鼠标迅速移动到指定屏幕坐标,如左上角是(0,0),然后向右向下递增,所以1024×768屏幕的右下角坐标是(1023,767)。

2.点击鼠标

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

这个比较简单,不过记得这里的操作都是非常非常快的,有可能游戏还没反应过来呢,你就完成了,于是失败, 所以必要的时候,小睡一小会儿。

3.相似图像查找原理

用Google的“按图搜图”功能,输入一张图片时,它会把与这张图相似的图像都给你呈现出来,所以当你找到一张中意的图想做壁纸又觉得太小的时候,基本可以用这个方法找到合适的~我们就要利用和这个相似的原理来判断用户的点餐

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

因为这是类的一个方法,所以有个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,说明什么?说明现在那个位置的图像不是菜,也就是说顾客还没坐那位置上呢,或者我们把游戏最小化了(老板来了),这样处理很重要,免得它随意找一个最相近但又完全不搭边的菜进行处理。

四、实现开挂,自动做菜

这个问题很简单,我们只需要把菜单的原料记录在案,然后点击相应位置便可,我把它写成了一个类来调用:

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

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

到此这篇关于Python还能这么玩之用Python做个小游戏的外挂的文章就介绍到这了,更多相关Python游戏外挂内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python下的Softmax回归函数的实现方法(推荐)
Jan 26 Python
Python正则抓取新闻标题和链接的方法示例
Apr 24 Python
Python实现判断一个字符串是否包含子串的方法总结
Nov 21 Python
Python使用Scrapy爬虫框架全站爬取图片并保存本地的实现代码
Mar 04 Python
Tensorflow实现卷积神经网络用于人脸关键点识别
Mar 05 Python
基于python3 OpenCV3实现静态图片人脸识别
May 25 Python
Python实现合并两个列表的方法分析
May 28 Python
Python实现Event回调机制的方法
Feb 13 Python
pandas实现to_sql将DataFrame保存到数据库中
Jul 03 Python
基于tensorflow指定GPU运行及GPU资源分配的几种方式小结
Feb 03 Python
python实现扫雷游戏的示例
Oct 20 Python
python wsgiref源码解析
Feb 06 Python
python opencv旋转图片的使用方法
Python还能这么玩之用Python修改了班花的开机密码
Anaconda安装pytorch及配置PyCharm 2021环境
python如何利用cv2模块读取显示保存图片
Jun 04 #Python
Python实现socket库网络通信套接字
Jun 04 #Python
python cv2图像质量压缩的算法示例
Jun 04 #Python
高考要来啦!用Python爬取历年高考数据并分析
You might like
哪吒敖丙传:新人物二哥敖乙出场 小敖丙奶气十足
2020/03/08 国漫
php使用百度翻译api示例分享
2014/01/31 PHP
支持中文的PHP按字符串长度分割成数组代码
2015/05/17 PHP
win7系统配置php+Apache+mysql环境的方法
2015/08/21 PHP
详解Window7 下开发php扩展
2015/12/31 PHP
PHP实现微信提现功能
2018/09/30 PHP
Yii框架where查询用法实例分析
2019/10/22 PHP
laravel框架创建授权策略实例分析
2019/11/22 PHP
idTabs基于JQuery的根据URL参数选择Tab插件
2012/04/11 Javascript
js判断登陆用户名及密码是否为空的简单实例
2016/05/16 Javascript
JS实现多张图片预览同步上传功能
2017/06/23 Javascript
Swiper实现轮播图效果
2017/07/03 Javascript
详解Vue + Vuex 如何使用 vm.$nextTick
2017/11/20 Javascript
node打造微信个人号机器人的方法示例
2018/04/26 Javascript
JS获取子节点、父节点和兄弟节点的方法实例总结
2018/07/06 Javascript
JS+HTML5实现获取手机验证码倒计时按钮
2018/08/08 Javascript
详解React中合并单元格的正确写法
2019/01/08 Javascript
javascript数组去重方法总结(推荐)
2019/03/20 Javascript
Python的装饰器模式与面向切面编程详解
2015/06/21 Python
简单解析Django框架中的表单验证
2015/07/17 Python
Python算法之图的遍历
2017/11/16 Python
Python可变参数*args和**kwargs用法实例小结
2018/04/27 Python
python 动态生成变量名以及动态获取变量的变量名方法
2019/01/20 Python
python3.8动态人脸识别的实现示例
2020/09/21 Python
使用CSS Grid布局实现网格的流动
2014/12/30 HTML / CSS
Html5调用手机摄像头并实现人脸识别的实现
2018/12/21 HTML / CSS
美国值得信赖的婚恋交友网站:eHarmony
2018/10/04 全球购物
英国家喻户晓的家居商店:The Range
2019/03/25 全球购物
垃圾回收的优点和原理
2014/05/16 面试题
艺术应用与设计个人的自我评价
2013/11/23 职场文书
党员违纪检讨书
2014/02/18 职场文书
入党综合考察材料
2014/06/02 职场文书
党的群众路线教育实践活动领导班子整改措施
2014/09/30 职场文书
教师拔河比赛广播稿
2014/10/14 职场文书
2014年纳税评估工作总结
2014/12/23 职场文书
2016年企业先进员工事迹材料
2016/02/25 职场文书