当前位置: 首页 > news >正文

绝地求生 压枪python版

仅做学习交流,非盈利,侵联删(狗头保命)

一、概述

1.1 效果

总的来说,这种方式是通过图像识别来完成的,不侵入游戏,不读取内存,安全不被检测。

1.2 前置知识

  1. 游戏中有各种不同的枪械,不同的枪械后坐力不一样,射速也不同。相同的枪械,装上不同的配件后,后坐力也会发生变化。
  2. 枪械的y轴上移是固定的,x轴是随机的,因此我们程序只移动鼠标y轴。x轴游戏中手动操作。

1.3 实现原理简述

  1. 通过python中的pynput模块监听键盘鼠标。

监听鼠标左键按下,这个时候开始移动鼠标。左键抬起,终止移动。
监听键盘按键,比如tab键,这时打开背包,截屏开始识别装备栏。

  1. 通过python的pyautogui模块来截屏,可以截取屏幕指定位置。

  2. 通过python的opencv模块来处理截取的图片。

  3. 通过SSIM算法来对比图片相似度,获取到装备栏的武器、配件。

  4. 通过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 #手枪 switch=3的时候不压枪elif '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)

image.png

2.4 素材准备

屏幕截图处理后如上,在装备识别之前,我们需要先准备很多素材图片用来对比。
比如:武器名、枪托、握把、枪口

image.png

武器名:

m762.bmp

枪托

m4.bmp

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函数不准确,所以我们要自己来计时,防止错过每发子弹的时间间隔。
不准确还有个好处,随机,正好不用自己来随机防止检测了。

三、最麻烦的部分

每个枪的后坐力都不一样,我们需要自己去游戏的训练场,一发发子弹的调试,获取准确的补偿数据。

四、最后

代码上传到gitee,感兴趣的一起交流。
https://gitee.com/lookoutthebush/PUBG

相关文章:

绝地求生 压枪python版

仅做学习交流&#xff0c;非盈利&#xff0c;侵联删&#xff08;狗头保命) 一、概述 1.1 效果 总的来说&#xff0c;这种方式是通过图像识别来完成的&#xff0c;不侵入游戏&#xff0c;不读取内存&#xff0c;安全不被检测。 1.2 前置知识 游戏中有各种不同的枪械&#x…...

麒麟操作V10SP1系统systemd目标单元

通过命令列出当前系统中所有可用的 systemd 目标单元。 用于被控制系统启动时运行哪些服务和进程&#xff0c;以及系统在运行过程中的行为。 rootkylin:~# systemctl list-units --typetargetUNIT LOAD ACTIVE SUB DESCRIPTION basic.target…...

python基于LBP+SVM开发构建基于fer2013数据集的人脸表情识别模型是种什么体验,让结果告诉你...

本身LBPSVM是比较经典的技术路线用来做图像识别、目标检测&#xff0c;没有什么特殊的地方 fer2013数据集在我之前的博文中也有详细的实践过&#xff0c;如下&#xff1a; 《fer2013人脸表情数据实践》 系统地基于CNN开发实现 《Python实现将人脸表情数据集fer2013转化为图像…...

antd——实现不分页的表格前端排序功能——基础积累

最近在写后台管理系统时&#xff0c;遇到一个需求&#xff0c;就是给表格中的某些字段添加排序功能。注意该表格是不分页的&#xff0c;因此排序可以只通过前端处理。 如下图所示&#xff1a; 在antd官网上是有关于表格排序的功能的。 对某一列数据进行排序&#xff0c;通过…...

案例11:Java超市管理系统设计与实现开题报告

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…...

@JsonAlias 和 @JsonProperty的使用

JsonAlias 和 JsonProperty 前言一、JsonAlias二、JsonProperty总结 前言 使用场景&#xff1a;主要运用于参数映射。 如&#xff1a;将admin_id 的值赋予adminId 常用于&#xff1a;接收第三方参数&#xff0c;并对参数进行驼峰化或别名。 一、JsonAlias 是在反序列化的时候…...

Grafana系列-统一展示-8-ElasticSearch日志快速搜索仪表板

系列文章 Grafana 系列文章 概述 我们是基于这篇文章: Grafana 系列文章&#xff08;十二&#xff09;&#xff1a;如何使用 Loki 创建一个用于搜索日志的 Grafana 仪表板, 创建一个类似的, 但是基于 ElasticSearch 的日志快速搜索仪表板. 最终完整效果如下: &#x1f4dd;…...

【K8s】openEuler23操作系统安装Docker和Kubernetes

openEuler23操作系统安装 服务器搭建环境随手记 文章目录 openEuler23操作系统安装前言&#xff1a;一、前期准备&#xff08;所有节点&#xff09;1.1所有节点&#xff0c;关闭防火墙规则&#xff0c;关闭selinux&#xff0c;关闭swap交换&#xff0c;打通所有服务器网络&am…...

异常数据检测 | Python实现ADTK时间序列异常数据检测

文章目录 文章概述模型描述程序设计参考资料文章概述 异常数据检测 | Python实现ADTK时间序列异常数据检测 智能运维AIOps的数据基本上都是时间序列形式的,而异常检测告警是AIOps中重要组成部分。 模型描述 笔者最近在处理时间序列数据时有使用到adtk这个python库,在这里和大…...

软件测试之jmeter性能测试让你打开一个全新的世界

一、Jmeter简介 1 概述 jmeter是一个软件&#xff0c;使负载测试或业绩为导向的业务&#xff08;功能&#xff09;测试不同的协议或技术。 它是 Apache 软件基金会的Stefano Mazzocchi JMeter 最初开发的。 它主要对 Apache JServ&#xff08;现在称为如 Apache Tomcat…...

Redis数据结构——动态字符串、Dict、ZipList

一、Redis数据结构-动态字符串 我们都知道Redis中保存的Key是字符串&#xff0c;value往往是字符串或者字符串的集合。可见字符串是Redis中最常用的一种数据结构。 不过Redis没有直接使用C语言中的字符串&#xff0c;因为C语言字符串存在很多问题&#xff1a; 获取字符串长度…...

ipad可以用别的品牌的手写笔吗?便宜的ipad电容笔

而对于那些把ipad当做学习工具的人而言&#xff0c;苹果Pencil就成了必备品。但因为苹果Pencil太贵了&#xff0c;学生们买不起。因此&#xff0c;最好的选择还是平替电容笔。作为一个ipad的忠实用户&#xff0c;同时也是一个数字热爱着&#xff0c;这两年来&#xff0c;我一直…...

【数据库】关于SQL SERVER的排序规则的问题分析

在安装报表系统&#xff0c;运行sql语句时候提示“无法解决 equal to 操作的排序规则冲突。”&#xff0c;费了半天时间才搞定&#xff0c;原来是因为sql语句中没有加全collate Chinese_PRC_CI_AI_WS &#xff01; 用排序规则特点计算汉字笔划和取得拼音首字母 SQL SERVER的…...

算法修炼之练气篇——练气十三层

博主&#xff1a;命运之光 专栏&#xff1a;算法修炼之练气篇 目录 题目 1023: [编程入门]选择排序 题目描述 输入格式 输出格式 样例输入 样例输出 题目 1065: 二级C语言-最小绝对值 题目描述 输入格式 输出格式 样例输入 样例输出 题目 1021: [编程入门]迭代法求…...

ChatGPT:AI不取代程序员,只取代的不掌握AI的程序员

作者&#xff1a;成都兰亭集势信息技术有限公司技术总监张雄 可能大家会有如下的问题&#xff0c;我就使用chatGPT这个AI工具的API来问一下。 问&#xff1a;chatGPT会替换掉程序员吗&#xff1f;如果能&#xff0c;预计好久&#xff1f; 答&#xff1a;作为一名 AI 语言模型&a…...

数字革命下的产品:百数十年变迁的启示与思考。

随着数字化时代的到来&#xff0c;软件开发成为各行各业不可或缺的一部分。然而&#xff0c;传统的软件开发方法需要长时间的开发周期&#xff0c;高昂的成本和大量的人力资源。因此&#xff0c;低代码开发平台应运而生。低代码开发平台通过简化开发人员的工作和加速软件开发流…...

部门新来一00后,给我卷崩溃了...

2022年已经结束结束了&#xff0c;最近内卷严重&#xff0c;各种跳槽裁员&#xff0c;相信很多小伙伴也在准备今年的金三银四的面试计划。 在此展示一套学习笔记 / 面试手册&#xff0c;年后跳槽的朋友可以好好刷一刷&#xff0c;还是挺有必要的&#xff0c;它几乎涵盖了所有的…...

使用Spring Boot和Docker构建可伸缩的微服务架构,应对增长的业务需求

使用Spring Boot和Docker构建可伸缩的微服务架构&#xff0c;应对增长的业务需求 一、简介1. 微服务架构的定义2. Spring Boot和Docker的概述 二、Spring Boot1. Spring Boot的介绍2. Spring Boot的优势3. Spring Boot的组件4. Spring Boot的应用 三、Docker1. Docker的介绍2. …...

计算机组成原理基础练习题第四章

1.下述说法中()是正确的。 A、半导体RAM信息可读可写,且断电后仍能保持记忆 B、半导体RAM是易失性RAM,而静态RAM中的存储信息是不易失的 C、半导体RAM是易失性RAM,而静态RAM只有在电源不掉电时,所存信息是不易失的 D、以上选项都不对 解析&#xf…...

浅谈Gradle构建工具

一、序言 常见的项目构建工具有Ant、Maven、Gradle&#xff0c;以往项目常见采用Maven进构建&#xff0c;但随着技术的发展&#xff0c;越来越多的项目采用Gradle进行构建&#xff0c;例如 Spring-boot。Gradle站在了Ant和Maven构建工具的肩膀上&#xff0c;使用强大的表达式语…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...