关于绝地求生一键压枪编程很多人还不了解,今天小编就为大家整理了相关内容,希望对各位有所帮助:
接下来具体说说绝地求生鼠标宏连发压枪很过瘾是吧
本文目录一览
1、绝地求生压枪(Python 版) 2、《绝地求生》鼠标宏连发压枪很过瘾是吧?官方说这是外挂行为!
一、绝地求生压枪(Python 版)
大家好,我是柠檬哥,和大家分享一个有意思绝地求生代码项目
仅做学习交流,非盈利
欢迎关注@程序员柠檬橙 ,编程路上不迷路
私信发送 1024 打包下载10个G编程资源学习资料
私信发送 001 获取阿里大神LeetCode 刷题笔记
私信发送 002 获取获取谷歌公司编程代码规范
私信发送 003 获取10个精美简历模板PDF和Word版
私信发送 004 获取100道精选 C++ 面试题和答案word版
私信发送 005 获取获取谷歌LeetCode算法笔记
私信发送 006 获取侯捷C++全套视频和下载方式
一、概述
1.1 效果
总的来说,这种方式是通过图像识别来完成的,不侵入游戏,不读取内存,安全不被检测。
1.2 前置知识
- 游戏中有各种不同的枪械,不同的枪械后坐力不一样,射速也不同。相同的枪械,装上不同的配件后,后坐力也会发生变化。
- 枪械的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 #主武器1 elif '2' == key.char: c_equipment.switch = 2 #主武器2 elif '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 pyautogui def adaptive_binarization(img): #自适应二值化 maxval = 255 blockSize = 3 C = 5 img2 = 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 temp def saveScreen(): screen1 = shotCut(1780, 125, 614, 570) cv2.imwrite("./resource/shotcut/screen.bmp", screen1)
2.4 素材准备
屏幕截图处理后如上,在装备识别之前,我们需要先准备很多素材图片用来对比。比如:武器名、枪托、握把、枪口
武器名:
枪托
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 = res name = 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.speed startTime = round(time.perf_counter(), 3) * 1000 for i in range(curWepone.maxBullets): #是否可以开火,比如左键抬起,就中断。 if not canFire(): break #系数,比如按住shift屏息,就需要再原来基础上乘1.33 holdK = 1.0 if 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 -= 10 elif (moveSum > 0): pydirectinput.move(xOffset = 0, yOffset=moveSum, relative=True) moveSum = 0 elapsed = (round(time.perf_counter(), 3) * 1000 - startTime) if not canFire() or elapsed > (i + 1) * speed + 10: break time.sleep(0.01)
代码中的while循环:
其实再靠前发子弹射出后,我们只需要下移42的距离,然后计算出需要等待的时间(0.086-移动鼠标的时间),然后第二发子弹射出,以此类推。
while循环的作用是防止屏幕抖动太厉害。因为直接移动42的距离,游戏中抖的厉害,所以我们再86毫秒的间隔里分了多次来移动鼠标。
python中的sleep函数不准确,所以我们要自己来计时,防止错过每发子弹的时间间隔。不准确还有个好处,随机,正好不用自己来随机防止检测了。
三、最麻烦的部分
每个枪的后坐力都不一样,我们需要自己去游戏的训练场,一发发子弹的调试,获取准确的补偿数据。
二、《绝地求生》鼠标宏连发压枪很过瘾是吧?官方说这是外挂行为!
前天,在某网站举行的《绝地求生:大逃杀》比赛直播中,出现了使用鼠标宏进行连发压枪的玩家,被观看的网游们指责影响游戏平衡性。
这件事在微博上引起了不小的骚动,不少鼠标宏的用户认为鼠标宏并没有修改游戏数据,只是利用鼠标硬件进行操作上的自动化而已;而对于不使用鼠标宏的玩家来说,这种修改严重影响了游戏的平衡性。
《绝地求生:大逃杀》
那么什么是鼠标宏?在游戏中它又发挥了什么作用?
「宏」其实很早就出现了,简单来说就是用一个指令引发计算机的一系列操作。在 Office 系列软件里就有很多宏命令来简化文本和表格的编辑过程;各种编程语言也都有宏指令。
鼠标宏最开始也是为了简化操作而诞生,在 Excel 中用鼠标点一下就能快速实现平时要在菜单中找半个多小时的操作,想想都觉得很厉害。
宏功能后来被引入到了游戏中。现在不少鼠标和键盘都支持自定义宏按键,让你可以在一瞬间完成游戏操作。比如当你被青铜 5 小学生盲僧光速摸眼回旋踢震惊的时候,其实他只要鼠标上点一下就好了。
鼠标宏按键
对于《绝地求生:大逃杀》来说宏按键也是用途广泛,比如要同时按“跳+蹲”的大跳就可以通过鼠标宏一键搞定,键盘都不用碰。
当然最可怕的还是利用鼠标宏实现超高速连发和自动压枪。开启鼠标宏然后开枪,宏功能就可以让你“展现”惊人的连发手速,P1911 子弹瞬间打空,甚至可以让 M4 连发的停顿都消了。
鼠标宏还支持自动压枪功能,哪怕是 AKM 都可以在连发的时候把弹孔保持在一个点上。
正常连发与鼠标宏连发对比
《绝地求生》的鼠标宏功能如此火爆,以至于在淘宝一搜结果全是支持宏的鼠标,信仰周边都被排在了后面。
“绝地求生”淘宝搜索页面(靠前页)
面对网友的不满,赛事负责人也与《绝地求生》官方取得联系。官方表示利用鼠标宏的行为将被视为外挂处理。但硬件端鼠标宏的监测,还是一个难以解决的问题,目前只能通过监测游戏表现判断是否为外挂。
赛事负责人与《绝地求生》官方的对话
虽说鼠标宏并没有修改游戏数据,与传统意义上的外挂有所区别,但利用鼠标宏进行游戏的行为还是严重影响到了游戏的公平。至少周末两天都没吃到鸡的我表示:坚决赞同打击鼠标宏游戏的行为。
据《绝地求生》的创意总监 PlayerUnknown 在推特上的发帖,在昨晚某一瞬间《绝地求生》的在线人数(239167人)超过《CS:GO》(238472人);《绝地求生》也连续 16 周位列 Steam 周销量**靠前位。
衷心希望这一款好游戏能健康发展,也希望每一位玩家能自觉维护游戏的公平性,抵制外挂,共同创造良好的吃鸡环境。
本文编辑:老汤
以上就是绝地求生一键压枪编程(绝地求生鼠标宏连发压枪很过瘾是吧)的详细内容,希望通过阅读小编的文章之后能够有所收获!更多请关注喜价游戏网其它相关文章!
如若转载,请注明出处:https://www.xijia.cn/youxi/33632.html