三国杀钓鱼自动化

三国杀钓鱼脚本

前言

本来是想做必杀的,但是后来测试了大约400钓发现纯靠连点没有漏掉的鱼,所以必杀功能就舍弃了。
我pyinstaller打包后运行.exe居然黑屏了???可能是多进程报错处理没写好,反正还是用vscode运行python吧。这样最起码可以保证不死机。

环境配置

python 3.12.7
Visual Studio Code 任何版本
雷电模拟器9
Win11 23H2

雷电模拟器安装

通过官网https://www.ldmnq.com下载。这个没啥好说的,没有网络问题,直接下一步下一步就行了。
说一下问题我运行vivo端的游戏商店或者三国杀时,发现不能使用。最后查阅信息有一个解决方法是将模拟器的手机型号设置为除了vivo以外的任意一款手机型号。

python 安装

通过官网https://www.python.org/downloads/release/python-3127找到下面Windows installer (64-bit)下载。
链接为https://www.python.org/ftp/python/3.12.7/python-3.12.7-amd64.exe,可以点击此处直接下载
之后,安装python,安装步骤这里不是重点。推荐一位bilibili的up主的视频,根据他的安装即可,后面会讲。

Visual Studio Code 安装

通过官网https://code.visualstudio.com找到Download for Windows下载即可。
同样安装步骤,后面会讲。

如何安装?

https://www.bilibili.com/video/BV1w7411N7Ti这个up主的BV1w7411N7Ti视频可以很好的讲解。记得Visual Studio Code 需要加插件,别忘了看文档安装一下。

脚本

脚本代码-python

这是一段python代码,复制到文本文件更改后缀名为py,即可运行。也可以继续观看B站up的视频稍微学习一点点怎么运行代码。

from PIL import ImageGrab
import multiprocessing
import pygetwindow
import pyautogui
import keyboard
import numpy
import json
import timeclass CustomError(Exception):def __init__(self,message):self.message=message
class Fishing():standWidth=1962standHeight=1115def __init__(self,window):self.window= window self.left=window.leftself.top=window.topself.jsonDir="./position.json"self.config=Noneself.GameInit()def WindowJudge(self,window):return (window.width,window.height)==(Fishing.standWidth,Fishing.standHeight)def GameInit(self):if not self.WindowJudge(self.window):raise CustomError("window size is not match!")else:self.config=dict(json.loads(self.__read(self.jsonDir)))def Click(self,position):pyautogui.click(self.left+position[0],self.top+position[1])def DragTo(self,position,speed):pyautogui.dragTo(self.left+position[0],self.top+position[1],speed,button="left")def __read(self,file):f=open(file,'r',encoding="utf-8")res=f.read()f.close()return res
def StateFishing(CodeRun):while CodeRun.value:#不可更改!if keyboard.is_pressed('esc'):CodeRun.value=Falseexit(0)def FishingRun(codeRun,runTime,slow,stink,again,queue,queueNumber):window = pygetwindow.getWindowsWithTitle('雷电模拟器')[0]fishingGame=Fishing(window)queueNumber.value=0queue.put((window.left,window.top))queue.put(fishingGame.config['slowColor'])queue.put(fishingGame.config['WatchRange'])time.sleep(0.1)queueNumber.value=1queue.put((window.left,window.top))queue.put(fishingGame.config['stinkColor'])queue.put(fishingGame.config['stinkOffset'])queue.put(fishingGame.config['StinkyRange'])time.sleep(0.1)queueNumber.value=2queue.put((window.left,window.top))queue.put(fishingGame.config['againColor'])queue.put(fishingGame.config['AgainRange'])time.sleep(0.1)queueNumber.value=3queue.put((window.left,window.top))queue.put(fishingGame.config['energyColor'])queue.put(fishingGame.config['EnergyRange'])time.sleep(0.1)while runTime>0 and codeRun.value:runTime-=1print("剩余%d次垂钓"%runTime)time.sleep(0.5)fishingGame.Click(fishingGame.config['beginButton'])time.sleep(0.5)fishingGame.DragTo(fishingGame.config['dragToPosition'],0.3)time.sleep(5.3)startTime=time.time()while not stink.value and codeRun:if time.time()-startTime>2:breakfishingGame.Click(fishingGame.config['liftingPosition'])stink.value=Falsewhile codeRun.value:if slow.value :fishingGame.Click(fishingGame.config['fishingButton'])if again.value:fishingGame.Click(fishingGame.config['againButton'])breakcodeRun.value=Falseexit(0)
def WatchSpeed(codeRun,slow,queue,queueNumber):while queueNumber.value!=0:passwindow=queue.get()slowColor=queue.get()watchRange=queue.get()left,top=watchRange["position1"]right,down=watchRange["position2"]while codeRun.value:screenshot =numpy.array( ImageGrab.grab(bbox=(window[0]+left, window[1]+top, window[0]+right, window[1]+down)))screenshotShape=screenshot.shapecnt=0for i in range(screenshotShape[0]):for j in range(screenshotShape[1]):temp=screenshot[i][j]if ((int(temp[0])-slowColor[0])**2+(int(temp[1])-slowColor[1])**2+(int(temp[2])-slowColor[2])**2)**0.5>5:cnt+=1slow.value= cnt/(screenshotShape[0]*screenshotShape[1])<0.6exit(0)
def WatchStinky(codeRun,stink,queue,queueNumber):while queueNumber.value!=1:passwindow=queue.get()stinkColor=queue.get()stinkOffset=queue.get()watchRange=queue.get()left,top=watchRange["position1"]right,down=watchRange["position2"]top+=stinkOffsetdown+=stinkOffsetwhile codeRun.value:screenshot =numpy.array( ImageGrab.grab(bbox=(window[0]+left, window[1]+top, window[0]+right, window[1]+down)))screenshotShape=screenshot.shapecnt=0for i in range(screenshotShape[0]):for j in range(screenshotShape[1]):temp=screenshot[i][j]if ((int(temp[0])-stinkColor[0])**2+(int(temp[1])-stinkColor[1])**2+(int(temp[2])-stinkColor[2])**2)**0.5<50:cnt+=1stink.value= cnt/(screenshotShape[0]*screenshotShape[1])>0.1exit(0)def WatchAgain(codeRun,again,queue,queueNumber):while queueNumber.value!=2:passwindow=queue.get()againColor=queue.get()watchRange=queue.get()left,top=watchRange["position1"]right,down=watchRange["position2"]while codeRun.value:screenshot =numpy.array( ImageGrab.grab(bbox=(window[0]+left, window[1]+top, window[0]+right, window[1]+down)))screenshotShape=screenshot.shapecnt=0for i in range(screenshotShape[0]):for j in range(screenshotShape[1]):temp=screenshot[i][j]if ((int(temp[0])-againColor[0])**2+(int(temp[1])-againColor[1])**2+(int(temp[2])-againColor[2])**2)**0.5<50:cnt+=1again.value= cnt/(screenshotShape[0]*screenshotShape[1])>0.8exit(0)
def WatchEnergy(codeRun,energy,queue,queueNumber):while queueNumber.value!=3:passwindow=queue.get()energyColor=queue.get()watchRange=queue.get()left,top=watchRange["position1"]right,down=watchRange["position2"]while codeRun.value:screenshot =numpy.array( ImageGrab.grab(bbox=(window[0]+left, window[1]+top, window[0]+right, window[1]+down)))screenshotShape=screenshot.shapecnt=0for i in range(screenshotShape[0]):for j in range(screenshotShape[1]):temp=screenshot[i][j]if ((int(temp[0])-energyColor[0])**2+(int(temp[1])-energyColor[1])**2+(int(temp[2])-energyColor[2])**2)**0.5<50:cnt+=1energy.value= cnt/(screenshotShape[0]*screenshotShape[1])>0.8
if __name__ == '__main__':runTime=999# 运行次数codeRun = multiprocessing.Value('b', True)queueNumber = multiprocessing.Value('i', -1)slow = multiprocessing.Value('b', True)stink= multiprocessing.Value('b', True)again= multiprocessing.Value('b', False)queue=multiprocessing.Queue(20)processList=[]processList.append(multiprocessing.Process(target=StateFishing, args=(codeRun,)))processList.append(multiprocessing.Process(target=FishingRun, args=(codeRun,runTime,slow,stink,again,queue,queueNumber)))processList.append(multiprocessing.Process(target=WatchSpeed,args=(codeRun,slow,queue,queueNumber)))processList.append(multiprocessing.Process(target=WatchStinky,args=(codeRun,stink,queue,queueNumber)))processList.append(multiprocessing.Process(target=WatchAgain,args=(codeRun,again,queue,queueNumber)))for each in processList:each.start()for each in processList:each.join()

脚本代码-json

此处需要创建在你的上述python脚本文件的同一目录下,命名为position.json,注意扩展名为json。此处由于电脑性能不同需要手动调节一下stinkOffset,负号代表检测区间向上方偏移像素。由于本脚本设计原理是通过监控并对进程通信实现的,所以由于电脑性能问题需要平移一定距离以留充足反应。如果刺鱼点太靠上,数值应当由-32适当调大,如果太靠下应当由-32适当调小。防呆小tips:-40比-32小。

{"stinkOffset":-32,"beginButton":[1625,880],"dragToPosition":[1625,630],"liftingPosition":[1625,880],"fishingButton":[1625,880],"againButton":[1420,950],"WatchRange":{"position1":[1195,135],"position2":[1305,140]},"AgainRange":{"position1":[1250,920],"position2":[1290,960]},"StinkyRange":{"position1":[626,530],"position2":[629,600]},"EnergyRange":{"position1":[1366,189],"position2":[1367,209]},"stinkColor":[239,199,107],"slowColor":[99,77,66],"againColor":[255, 199, 99],"energyColor":[255,170,90]
}

安装库

复制下面的命令,在命令框中输入即可自动安装清华镜像下的依赖库。如果不会安装,还是去看一下上文B站up的视频,会有讲解pip指令的教程,这里也只是需要知道在哪里输入就可以了。或者去搜一下别人的文档,只要能确定在那里输入就可以。

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple keyboard pillow pyautogui pygetwindow numpy

说明

  1. 脚本是针对雷电模拟器做的适配,因此最好不要换模拟器,而且甚至版本都不要变。
  2. 窗口分辨率设置为平板版 > 1920x1080(dpi 280)。代码中做了窗口检测,而且需要做到像素匹配。这里代码中像素匹配是1962x1115,设置分辨率后应该就是这个尺寸,不要缩放,如果缩放了,改成其他分辨率后再改回来。
  3. 再runTime中输入此次运行次数,如果不写就会按照我的代码默认参数999次去运行下去了。且换鱼饵是要重开的
  4. 脚本是模拟鼠标操作,所以不要让任何可能影响点击的操作置于模拟器前,运行脚本时模拟器必须处于显示的状态,而不是最小化。
  5. 可以按下esc退出,如果前10秒左右按下,其他功能会终止,由于代码中的延迟语句的缘故,代码整体会等一会才能终止。10秒左右之后,可以立即终止。
  6. 运行时要先进入开始垂钓的界面中运行脚本。
  7. 本脚本中所有用到的位置信息全部存放在position.json中,可以根据自己的需求进行更改。但是需要注意的是分辨率的更改可能会引起操作、监控位置以及阈值信息的改变,需要手动测试。

By-Round Moon

后继

这个脚本没有对其他电脑做过测试,我的电脑比较好的OMEN,所以运行流畅,但是我的脚本是基于监控信息加进程通信实现的,有可能不同电脑性能不一样导致无法运行,而且刺鱼操作需要调试,但是基本无妨。
另外最近脚本交易盛行,有可能会被他人使用,这里标识一下我的创作日期是2024年10月19日晚22点,为了完成2024年的1024任务所以等到1024当天再发布。本脚本完全开源,欢迎大家交流,且未经本人允许禁止转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/457313.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决JAVA使用@JsonProperty序列化出现字段重复问题(大写开头的字段重复序列化)

文章目录 引言I 解决方案方案1:使用JsonAutoDetect注解方案2:手动编写get方法,JsonProperty注解加到方法上。方案3:首字母改成小写的II 知识扩展:对象默认是怎样被序列化?引言 需求: JSON序列化时,使用@JsonProperty注解,将字段名序列化为首字母大写,兼容前端和第三方…

【C++】进阶:类相关特性的深入探讨

⭐在对C 中类的6个默认成员函数有了初步了解之后&#xff0c;现在我们进行对类相关特性的深入探讨&#xff01; &#x1f525;&#x1f525;&#x1f525;【C】类的默认成员函数&#xff1a;深入剖析与应用&#xff08;上&#xff09; 【C】类的默认成员函数&#xff1a;深入剖…

【从零开始的LeetCode-算法】910. 最小差值 II

给你一个整数数组 nums&#xff0c;和一个整数 k 。 对于每个下标 i&#xff08;0 < i < nums.length&#xff09;&#xff0c;将 nums[i] 变成 nums[i] k 或 nums[i] - k 。 nums 的 分数 是 nums 中最大元素和最小元素的差值。 在更改每个下标对应的值之后&#xf…

论文略读:Not all Layers of LLMs are Necessary during Inference

202404 LLMs的推理阶段非常昂贵 目前实现LLM高效推理的流行方法包括模型剪枝和稀疏模型 但这些方法可能会改变LLM参数&#xff0c;从而冒险损害其泛化能力。这篇论文动态减少激活神经元的数量以加速LLM推理 根据输入实例动态决定推理终止时刻

openjdk17在java方法中创建对象 类加载在C++源码实现步骤

java的testYYM方法中OtherClass类是如何被加载的 ##有请志愿者java实验类 ByteCodeTest、OtherClass import java.lang.reflect.Method;public class ByteCodeTest {private int insert678;public static void main(String[] args) throws Exception {ByteCodeTest byteCodeT…

leetcode动态规划(十三)-目标和

题目 494.目标和 给你一个非负整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 或 - &#xff0c;然后串联起所有整数&#xff0c;可以构造一个 表达式 &#xff1a; 例如&#xff0c;nums [2, 1] &#xff0c;可以在 2 之前添加 &#xff0c;在 1 之前添…

Unity(四十八):Unity与Web双向交互

效果 游戏对象绑定脚本 游戏脚本源码 using System.Collections; using System.Collections.Generic; using UnityEngine;public class Tent : MonoBehaviour {public Camera camera;// Start is called before the first frame updatevoid Start(){}// Update is called once…

鸿蒙网络编程系列36-固定包头可变包体解决TCP粘包问题

1. TCP数据传输粘包简介 在本系列的第6篇文章《鸿蒙网络编程系列6-TCP数据粘包表现及原因分析》中&#xff0c;我们演示了TCP数据粘包的表现&#xff0c;如图所示&#xff1a; 随后解释了粘包背后的可能原因&#xff0c;并给出了解决TCP传输粘包问题的两种思路&#xff0c;第一…

网络通信与并发编程(六)线程、进程池与线程池

线程、进程池与线程池 文章目录 线程、进程池与线程池一、线程二、线程的相关操作2.1创建线程的两种方式2.2线程的其他操作2.3死锁现象和递归锁2.4条件2.5定时器2.6 队列与堆栈 三、进程池与线程池 一、线程 线程是指cpu上实际执行计算的单位&#xff0c;而进程是将计算所需资…

潮畔汽车文化营地开营啦!全民测试场启动典礼圆满成功

在这个充满活力与创新的时代&#xff0c;汽车已不仅仅是代步工具&#xff0c;它承载着人们对速度、自由、科技与梦想的追求&#xff0c;成为了一种生活方式的象征。随着汽车文化的日益丰富和多元化&#xff0c;如何更好地连接汽车制造商、消费者以及广大汽车爱好者&#xff0c;…

群控系统服务端开发模式-应用开发-业务架构逻辑开发准备工作

安装与仓库已经调整完毕&#xff0c;现在开发业务架构逻辑&#xff0c;其次再开发功能逻辑。业务架构逻辑开发与功能逻辑开发不是一回事&#xff0c;一定要明白。业务架构指的是做某一件事或是某一种类型的事的逻辑&#xff0c;在互联网web应用中通常指一套系统的外在逻辑&…

Vue学习笔记(四)

事件处理 我们可以使用 v-on 指令 (通常缩写为 符号) 来监听 DOM 事件&#xff0c;并在触发事件时执行一些 JavaScript。用法为 v-on:click"methodName" 或使用快捷方式 click"methodName" 事件处理器的值可以是&#xff1a; 内联事件处理器&#xff1…

Jetpack架构组件_LiveData组件

1.LiveData初识 LiveData:ViewModel管理要展示的数据&#xff08;VM层类似于原MVP中的P层&#xff09;&#xff0c;处理业务逻辑&#xff0c;比如调用服务器的登陆接口业务。通过LiveData观察者模式&#xff0c;只要数据的值发生了改变&#xff0c;就会自动通知VIEW层&#xf…

基于Python大数据的王者荣耀战队数据分析及可视化系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

IDEA开发工具使用技巧积累

一、IDEA 工具设置默认使用maven的settings.xml文件 第一步&#xff1a;打开idea工具&#xff0c;选中 File ——> New Projects Setup ——> Settings for New Projects 第二步&#xff1a;先设置下自动构建项目这个选项 第三步&#xff1a;选中 Build Tools ——>…

windows下pycharm社区版2024下载与安装(包含新建第一个工程)

windows下pycharm社区版2024下载与安装 下载pycharm pycharm官网 安装pycharm 1.进入官网 pycharm官网 下载 点击Download–>右侧Other versions 下载对应的社区版&#xff08;如下图&#xff09;&#xff1a;下载网址 2.点击运行下载好的安装包 点击下一步 3.更改pychar…

2020款Macbook Pro A2251无法充电无法开机定位及修复

问题背景 up主有一台2020年的Macbook Pro&#xff0c;带Touch Bar&#xff0c;16G512G&#xff0c;四核I5&#xff0c;型号A2251 应该是一周没充电了&#xff0c;之前还用的好好的&#xff0c;后来有一天出差想带上 打开没电&#xff0c;手头上有个小米的66W快充头&#xff0c…

C#的自定义Tip窗体 - 开源研究系列文章

上次编写了自定义的提示和对话框窗体&#xff0c;这次记录的是自定义的Tip窗体&#xff0c;用于显示提示操作。有时间没编程了&#xff0c;这次就当进行了记录。 1、 项目目录&#xff1b; 2、 源码介绍&#xff1b; 1) 实现&#xff1b; 2) 应用&#xff1b; 3、 运行界面&…

Leetcode刷题笔记12

HJ1 字符串最后一个单词的长度 字符串最后一个单词的长度_牛客题霸_牛客网 这里可以使用rfind()&#xff0c;rfind()函数从字符串的末尾向前查找第一个空格的位置。这个空格将是最后一个单词和前面的单词的分隔符。首先使用getline读取字符串&#xff0c;然后用rfind找到最后一…

现在设备普遍切换成TYPE-C适配器后,一拖三数据线接口变革探析

随着科技的飞速发展&#xff0c;电子设备的接口标准也在不断地更新换代。近年来&#xff0c;TYPE-C接口凭借其高速传输、正反可插等显著优势&#xff0c;逐渐成为了众多电子设备的主流接口。从智能手机到平板电脑&#xff0c;从笔记本电脑到移动电源&#xff0c;TYPE-C接口的应…