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的SimPy库简化复杂的编程模型的介绍
Apr 13 Python
在Python中操作字典之clear()方法的使用
May 21 Python
Python实现爬取逐浪小说的方法
Jul 07 Python
Python验证企业工商注册码
Oct 25 Python
Pycharm学习教程(4) Python解释器的相关配置
May 03 Python
Python实现选择排序
Jun 04 Python
Python多层装饰器用法实例分析
Feb 09 Python
python 集合 并集、交集 Series list set 转换的实例
May 29 Python
Python实现隐马尔可夫模型的前向后向算法的示例代码
Dec 31 Python
Python实现i人事自动打卡的示例代码
Jan 09 Python
sklearn线性逻辑回归和非线性逻辑回归的实现
Jun 09 Python
Idea安装python显示无SDK问题解决方案
Aug 12 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
《魔兽争霸3》重制版究竟重制了什么?玩家:这么糊弄真的好吗?
2020/05/04 魔兽争霸
PHP PDO fetch 模式各种参数的输出结果一览
2015/01/07 PHP
PHP获取某个月最大天数(最后一天)的方法
2015/07/29 PHP
php验证码的制作思路和实现方法
2015/11/12 PHP
Laravel 对某一列进行筛选然后求和sum()的例子
2019/10/10 PHP
extJs 下拉框联动实现代码
2010/04/09 Javascript
dreamweaver 安装Jquery智能提示
2011/04/02 Javascript
jQuery EasyUI API 中文文档 - Draggable 可拖拽
2011/09/29 Javascript
JS实现超简单的仿QQ折叠菜单效果
2015/09/21 Javascript
EasyUi combotree 实现动态加载树节点
2016/04/01 Javascript
原生JavaScript编写canvas版的连连看游戏
2016/05/29 Javascript
js注册时输入合法性验证方法
2017/10/21 Javascript
Vue项目中配置pug解析支持
2019/05/10 Javascript
详解Vue中CSS样式穿透问题
2019/09/12 Javascript
对layui初始化列表的CheckBox属性详解
2019/09/13 Javascript
使用Vant完成DatetimePicker 日期的选择器操作
2020/11/12 Javascript
element-plus一个vue3.xUI框架(element-ui的3.x 版初体验)
2020/12/02 Vue.js
Python2.x版本中maketrans()方法的使用介绍
2015/05/19 Python
python中字典(Dictionary)用法实例详解
2015/05/30 Python
Python实现查找最小的k个数示例【两种解法】
2019/01/08 Python
python使用Paramiko模块实现远程文件拷贝
2019/04/30 Python
解决pytorch DataLoader num_workers出现的问题
2020/01/14 Python
python orm 框架中sqlalchemy用法实例详解
2020/02/02 Python
在 Python 中接管键盘中断信号的实现方法
2020/02/04 Python
java字符串格式化输出实例讲解
2021/01/06 Python
介绍CSS3使用技巧5个
2009/04/02 HTML / CSS
使用Html5实现异步上传文件,支持跨域,带有上传进度条
2016/09/17 HTML / CSS
通过HTML5规范搞定i、em、b、strong元素的区别
2017/03/04 HTML / CSS
玖熙女鞋美国官网:Nine West
2016/10/06 全球购物
德国高端单身人士交友网站:ElitePartner
2018/12/02 全球购物
职工趣味运动会方案
2014/02/10 职场文书
班干部演讲稿
2014/04/24 职场文书
新郎结婚保证书
2015/02/26 职场文书
工会工作个人总结
2015/03/03 职场文书
详解Redis在SpringBoot工程中的综合应用
2021/10/16 Redis
TV动画「神渣☆爱豆」公开第一弹主视觉图
2022/03/21 日漫