绝地求生 压q python版
仅做学习交流,非盈利,侵联删(狗头保命)
一、概述
1.1 效果
总的来说,这种方式是通过图像识别来完成的,不侵入游戏,不读取内存,安全不被检测。
1.2 前置知识
- 游戏中有各种不同的q械,不同的q械后坐力不一样,射速也不同。相同的q械,装上不同的配件后,后坐力也会发生变化。
- q械的y轴上移是固定的,x轴是随机的,因此我们程序只移动鼠标y轴。x轴游戏中手动操作。
1.3 实现原理简述
- 通过python中的pynput模块监听键盘鼠标。
监听鼠标左键按下,这个时候开始移动鼠标。左键抬起,终止移动。
监听键盘按键,比如tab键,这时打开背包,截屏开始识别装备栏。
-
通过python的pyautogui模块来截屏,可以截取屏幕指定位置。
-
通过python的opencv模块来处理截取的图片。
-
通过SSIM算法来对比图片相似度,获取到装备栏的武器、配件。
-
通过python的pydirectinput操作鼠标移动。
二、详解
2.1 pynput监听键盘
import pynput.keyboard as keyboard# 监听键盘
def listen_keybord():listener = keyboard.Listener(on_press=onPressed, on_release=onRelease)listener.start()
pynput的监听为异步事件,但是会被阻塞,所以如果事件处理事件过长,得用异步处理。
2.2 监听事件
创建了c_equipment类来封装武器信息。
重点在tab键的监听,使用异步来检测装备信息。
def onRelease(key):try:if '1' == key.char:c_equipment.switch = 1 #主武器1elif '2' == key.char:c_equipment.switch = 2 #主武器2elif '3' == key.char:c_equipment.switch = 3 #手q switch=3的时候不压qelif '4' == key.char:c_equipment.switch = 3 #刀具elif '5' == key.char:c_equipment.switch = 3 #手雷except AttributeError:if 'tab' == key.name: #tab键异步操作检测asyncHandle()elif 'num_lock' == key.name: #小键盘锁用来控制程序开关changeOpen()elif 'shift' == key.name: c_contants.hold = False
2.3 pyautogui截屏
检测装备,首先要在打开装备栏的时候,截屏。
pyautogui.screenshot(region=[x, y, w, h])
x,y分别表示坐标,w,h表示宽度和高度。
截取之后,为了方便对比图片,需要将图片二值化,然后保存到本地。
完整代码如下:
import pyautoguidef adaptive_binarization(img):#自适应二值化maxval = 255blockSize = 3C = 5img2 = cv2.adaptiveThreshold(img, maxval, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, blockSize, C)return img2# 屏幕截图
def shotCut(x, y, w, h):im = pyautogui.screenshot(region=[x, y, w, h])screen = cv2.cvtColor(numpy.asarray(im), cv2.COLOR_BGR2GRAY)temp = adaptive_binarization(screen)return tempdef saveScreen():screen1 = shotCut(1780, 125, 614, 570)cv2.imwrite("./resource/shotcut/screen.bmp", screen1)
2.4 素材准备
屏幕截图处理后如上,在装备识别之前,我们需要先准备很多素材图片用来对比。
比如:武器名、q托、握把、q口
武器名:
q托
2.5 裁剪图片
为了方便图片对比,我们需要将截取的装备栏部分的图片裁剪成和素材一样大小的图片。
比如,我们要检测武器一的名字:
#读取之前的截屏
screen = cv2.imread("./resource/shotcut/screen.bmp", 0)
#裁剪出武器1名字
screenWepon1 = screen[0:40, 45:125]
#拿裁剪的图片和武器素材的目录作为入参,进行对比
w1Name = compareAndGetName(screenWepon1, "./resource/guns/")
2.6 对比图片
#对比图片获取名字
def compareAndGetName(screenImg, dir):#获取目录下所有文件content = os.listdir(dir)name = 'none'max = 0#遍历文件for fileName in content:#使用opencv读取文件curWepone = cv2.imread(dir + fileName, 0)#使用SSIM算法拿到图片相似度res = calculate_ssim(numpy.asarray(screenImg), numpy.asarray(curWepone))#获取相似度最大的if max < res and res > 0.5:max = resname = str(fileName)[:-4]return name
SSIM算法:
def calculate_ssim(img1, img2):if not img1.shape == img2.shape:raise ValueError('Input images must have the same dimensions.')if img1.ndim == 2:return ssim(img1, img2)elif img1.ndim == 3:if img1.shape[2] == 3:ssims = []for i in range(3):ssims.append(ssim(img1, img2))return numpy.array(ssims).mean()elif img1.shape[2] == 1:return ssim(numpy.squeeze(img1), numpy.squeeze(img2))else:raise ValueError('Wrong input image dimensions.')
到这,我们就能获取到装备栏1位置的武器名字了。
2.7 操作鼠标
知道武器名字后,同理,我们可以获取到装备的配件。
然后,监听鼠标左键按下,然后开始下移鼠标。
我们以m762武器为例:
射速:86, 每一发子弹间隔86毫秒
后坐力:
[42, 36, 36, 36, 42, 43, 42, 43, 54, 55, 54, 55, 54, 55, 54, 55, 62, 62, 62, 62, 62, 62, 62, 62,62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 77, 78, 77, 78]
表示每发子弹打出后,需要在y轴下移的距离,用来与后坐力对冲。
def moveMouse(): #从识别的数据中,再更具当前选择的武器,获取此刻的武器(比如按下1键,武器装备栏1为m762,那么此时武器就是m762)curWepone = getCurrentWepone()if (curWepone.name == 'none'):return#基础y轴补偿(没任何配件)basic = curWepone.basic#射速speed = curWepone.speedstartTime = round(time.perf_counter(), 3) * 1000for i in range(curWepone.maxBullets):#是否可以开火,比如左键抬起,就中断。if not canFire():break#系数,比如按住shift屏息,就需要再原来基础上乘1.33holdK = 1.0if c_contants.hold:holdK = curWepone.hold#乘以系数后实际的移动距离moveSum = int(round(basic[i] * curWepone.k * holdK, 2))while True:if (moveSum > 10):#移动鼠标pydirectinput.move(xOffset=0, yOffset=10, relative=True)moveSum -= 10elif (moveSum > 0):pydirectinput.move(xOffset=0, yOffset=moveSum, relative=True)moveSum = 0elapsed = (round(time.perf_counter(), 3) * 1000 - startTime)if not canFire() or elapsed > (i + 1) * speed + 10:breaktime.sleep(0.01)
代码中的while循环:
其实再第一发子弹射出后,我们只需要下移42的距离,然后计算出需要等待的时间(0.086-移动鼠标的时间),然后第二发子弹射出,以此类推。
while循环的作用是防止屏幕抖动太厉害。因为直接移动42的距离,游戏中抖的厉害,所以我们再86毫秒的间隔里分了多次来移动鼠标。
python中的sleep函数不准确,所以我们要自己来计时,防止错过每发子弹的时间间隔。
不准确还有个好处,随机,正好不用自己来随机防止检测了。
三、最麻烦的部分
每个q的后坐力都不一样,我们需要自己去游戏的训练场,一发发子弹的调试,获取准确的补偿数据。
四、最后
代码上传到gitee,感兴趣的一起交流。
https://gitee.com/lookoutthebush/PUBG
相关文章:

绝地求生 压q python版
仅做学习交流,非盈利,侵联删(狗头保命) 一、概述 1.1 效果 总的来说,这种方式是通过图像识别来完成的,不侵入游戏,不读取内存,安全不被检测。 1.2 前置知识 游戏中有各种不同的q械…...

云原生技术中的容器技术有哪些?
文章目录 云原生技术中的容器技术有哪些1、云原生的含义2、容器的含义3、云原生的技术的基石:容器技术4、容器技术有哪些? 结语 云原生技术中的容器技术有哪些 在现今的安全行业中云原生安全技术中的容器安全技术有哪些呢,很多用户都不知道具体的含义以…...

Gin中间件的详解 ,用Jwt-go 和 Gin 的安全的登陆的中间件
学习目标: Gin 在不同的group 设置不同的中间件或者过滤器 Gin 的group下的路由上中间件或过滤器 用Jwt-go 和 Gin 的安全的登陆的中间件 JWT 类,它基本有所有基本功能,包括:GenerateToken,GenerateRefreshToken, ValidateToken, ParseToken 学习内容: 1. Gin 在不同的g…...

Nginx网站部署
Nginx网站部署 一、访问状态统计配置二、基于授权的访问控制三、基于客户端的访问控制四、基于域名的 Nginx 虚拟主机五、基于IP 的 Nginx 虚拟主机六、基于端口的 Nginx 虚拟主机 一、访问状态统计配置 1.先使用命令/usr/local/nginx/sbin/nginx -V 查看已安装的 Nginx 是否包…...

Hadoop优化
1.小文件 影响: 元数据的瓶颈在于文件的数量,无论单个文件的大小 资源大材小用 优化 计算:使用combininputformat提前合并小文件 JVM重用 存储:归档 2.map端 环形缓冲区-区域大小、溢写比列 提前combinerÿ…...

FPGA设计的指导性原则 (中)
1.6基本设计思想与技巧之二:串并转换 串并转换是FPGA设计的一个重要技巧,从小的着眼点讲,它是数据流处理的常用手 段,从大的着眼点将它是面积与速度互换思想的直接体现。串并转换的实现方法多种多样, 根据数据的排序和数量的要求,可以选用寄存器、RAM等实现。前面在乒乓…...

开源创新 协同融合|2023 开放原子全球开源峰会开源协作平台分论坛即将启幕
由开放原子开源基金会主办,阿里云、CSDN 等单位共同承办的开源协作平台分论坛即将于 6 月 12 日上午在北京经开区北人亦创国际会展中心隆重召开。作为 2023 开放原子全球开源峰会的重要组成部分,开源协作平台分论坛将聚焦于开源代码平台的创新功能、用户…...

第四章 相似矩阵与矩阵对角化
引言 题型总结中推荐例题有蓝皮书的题型较为重要,只有吉米多维奇的题型次之。码字不易,如果这篇文章对您有帮助的话,希望您能点赞、评论、收藏,投币、转发、关注。您的鼓励就是我前进的动力! 知识点思维导图 补充&…...

课程11:仓储层Repository实现、AutoMapper自动映射
课程简介目录 🚀前言一、Repository项目1.1创建Repository项目1.2 添加类1.2.1、添加类 RolePermissionRepositiory1.2.2、添加项目引用1.2.3、注入数据库上下文1.3 RolePermissionRepositiory接口的实现二、Repository注入2.1 提取接口2.2 添加项目依赖2.3 项目入口添加依赖…...

关于作用域的那些事(进阶)
一、作用域 原理: 作用域 > 房子 > 除了对象的{}都构成一个作用域 作用域 > 为了区别变量.不同作用域内声明的变量是各不相同的.(就算名字相同). 作用域语法: let x 10; (全局变量). if () {块级作用域 let y 20; (局部变量)} for () {块级作用…...

小技巧notebook
小技巧notebook 1、MybatisPlus 批量保存 从BaseMapper接口方法可知,mybatis plus mapper只有根据id批量删除和查询,没有批量保存(insert 、update),要实现也很简单,需要定义一个Service Service Slf4j …...

【2451. 差值数组不同的字符串】
来源:力扣(LeetCode) 描述: 给你一个字符串数组 words ,每一个字符串长度都相同,令所有字符串的长度都为 n 。 每个字符串 words[i] 可以被转化为一个长度为 n - 1 的 差值整数数组 difference[i] &…...

Java面试-每日十题
目录 1.try-catch-finally中的finally的执行机制 2.什么是Exception和Error 3.Throw和Throws的区别 4.Error与Exception区别 5.Java中的I/O流是什么,分为几类 6.I/O与NI/O 7.常用的I/O的类有哪些 8.字符流与字节流的区别 9.Java反射创建对象 10.什么是类的…...

java.awt.datatransfer.Clipboard剪切板获取String字符串文本
java.awt.datatransfer.Clipboard剪切板获取String字符串文本 有两种方法获取 直接从Clipboard获得 (String) systemClipboard.getData(DataFlavor.stringFlavor);从Clipboard获得Transable再获得String (String) systemClipboard.getContents(null).getTransferData(DataFlav…...

HCIA——VLAN
目录 1,什么是VLAN: 2,如何实现VLAN: 3,VLAN的划分方式: 4,交换机接口类型: 1,Access接口: 2,Trunk接口:允许将一个接口划分给多…...

测试分析流程及输出项
测试分析 一、确认测试范围 根据测试项目的不同需求,有大致几类测试项目类型:商户平台功能测试、支付方式接入测试、架构调整类测试、后台优化测试、性能测试、基本功能自动化测试。 测试项目需要按照文档要求进行测试需求分析,并给出对应…...

OO设计原则
OO设计原则:SOLID SOLID SRP(The Single Responsibility Principle,单一责任原则) 不应有多于1个的原因使得一个类发生变化一个类,一个责任 OCP(The Open-Closes Principle,开放-封闭原则&…...

《深入理解计算机系统(CSAPP)》第5章 优化程序性能 - 学习笔记
写在前面的话:此系列文章为笔者学习CSAPP时的个人笔记,分享出来与大家学习交流,目录大体与《深入理解计算机系统》书本一致。因是初次预习时写的笔记,在复习回看时发现部分内容存在一些小问题,因时间紧张来不及再次整理…...

【Spring Boot】033-使用 `@ResponseBody` 注解代替`ServletResponse`?
【Spring Boot】033-使用 ResponseBody 注解代替ServletResponse? 文章目录 【Spring Boot】033-使用 ResponseBody 注解代替ServletResponse?0、全局总结一、ResponseBody 注解与 ServletResponse 比较1、ResponseBody 注解2、ServletResponse3、总结 二…...

【openGauss实战13】闪回技术
📢📢📢📣📣📣 哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】!😜&am…...

Top大学教授:青年学者,请避免这些写作问题→
在科研初期,很多作者由于缺乏经验和指导,糊里糊涂地发了一些质量较低的论文。 为了帮助青年科学家提高写作能力,比利时鲁汶大学的Blocken教授(同时也是Building & Environment、Journal of Wind Engineering & Industrial…...

使用midjourney搞出一套三国人物画像!
当下已进入如火如荼的全民AI时代,最近体验了下midjourney,使用它的以图生图功能生成出来一套三国人物画像,和大家分享下使用心得。 使用midjourney的准备工作 下载工具 使用midjourney生产图片依赖的工具和流程,大致如下&#x…...

ELK日志分析系统
ELK日志分析系统 日志主要包括系统日志/var/log 应用日志 安全日志secure, rsyslog远程传输日志进行汇总集中化管理,日志统计和检索又成为一件比较麻烦的事情,、 1、完整日志系统基本特征 收集:能够采集多种来源的日志数据 …...

整型在内存中的存储
目录 一、为什么内存中存储补码? 二、大小端概念 百度笔试试题: 几道小题: 一、为什么内存中存储补码? 上一节我们了解了原码,反码,补码的概念(http://t.csdn.cn/N0grg)ÿ…...

子集-回溯算法
1题目 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1: 输入:nums [1,2,3] 输出:[[],[1],[2],[1…...

公司study three
ctrlwind:新建桌面 ctrlwin 箭头 切换桌面 WIN CTRL F4 删除桌面 stream foreach遍历 instFormModifytracesList.stream().forEach(s->{ s.setModifyUser(sysUserTemplate.getNameById(s.getModifyUser()));});拼接 String collect2 peopleList.stream()…...

【运维】speedtest测试
目录 docker 布署 布署云端 docker布署 云端放置于已有容器里 librespeed/speedtest: Self-hosted Speedtest for HTML5 and more. Easy setup, examples, configurable, mobile friendly. Supports PHP, Node, Multiple servers, and more (github.com) docker 布署 获取…...

CycloneDDS开源代码在Linux系统上编译生成可执行文件的详细步骤
cyclonedds开源代码在Linux系统上编译生成可执行文件的详细步骤 1 远程仓库CycloneDDS源码下载2 创建build目录3 进入build目录4 指定安装路径前缀5 编译 cmake --build6 编译完成后进行安装7 版本构建并编译7.1 虚拟机网络桥接7.2 镜像源添加7.3 CUnit单元测试工具安装7.4 编译…...

PLL锁相环的一部分--鉴频鉴相器
鉴频鉴相器作为锁相环的一部分也是有相对应的独立芯片. 鉴频鉴相器芯片主要有以下几种: LM565/LM565C 鉴频鉴相器芯片XR2211CP 鉴频鉴相器芯片NE567 比较器、鉴频、鉴相 ICMC1496/LM1496 综合运算放大器与调制/解调器 ICLM567 比较器、鉴频、鉴相 ICMC100EP2100 高…...

CSS实现磨砂玻璃(毛玻璃)效果样式
要实现磨砂玻璃背景,可以使用 CSS3 中的 ::before 伪元素和 backdrop-filter 属性,结合 opacity 属性和 blur() 函数来实现。 具体实现步骤如下: 创建一个具有背景的元素,例如一个 div 元素。 div {background-image: url(&quo…...