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

三国杀钓鱼自动化

三国杀钓鱼脚本

前言

本来是想做必杀的,但是后来测试了大约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当天再发布。本脚本完全开源,欢迎大家交流,且未经本人允许禁止转载。

相关文章:

三国杀钓鱼自动化

三国杀钓鱼脚本 前言 本来是想做必杀的&#xff0c;但是后来测试了大约400钓发现纯靠连点没有漏掉的鱼&#xff0c;所以必杀功能就舍弃了。 我pyinstaller打包后运行.exe居然黑屏了&#xff1f;&#xff1f;&#xff1f;可能是多进程报错处理没写好&#xff0c;反正还是用vsc…...

在pycharm中使用sqllite

在pycharm中使用sqllite sqllite 简介 SQLite 是一个开源的、轻量级的、关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它设计用于嵌入到应用程序中&#xff0c;并且可以在无需外部服务器进程的情况下运行。SQLite 提供了完整的 SQL 语言支持&#xff0c;允…...

Linux——文件操作

前言 1&#xff09;在Linux下面&#xff0c;一切皆文件&#xff0c;文件文件内容文件属性 2&#xff09;在访问文件是&#xff0c;都得先将文件打开&#xff0c;修改文件的本质其实还是通过执行代码的形式修改。 3&#xff09;文件是被进程打开的&#xff0c;一个进程可以打…...

数据结构 ——— 数组栈oj题:有效括号

目录 题目要求 代码实现 题目要求 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每…...

Character AI被起诉!14岁青少年自杀,AI陪伴何去何从

终于&#xff0c;AI在青少年心理问题方面&#xff0c;被推上了风口浪尖。 最近&#xff0c;美国佛罗里达州&#xff0c;一名14岁男孩Sewell Setzer的父母控告Character AI公司&#xff0c;声称孩子沉迷该公司的AI聊天机器人&#xff0c;最后走上了自杀的道路。 跟AI聊天还能致…...

CSS3 动画相关属性实例大全(三)(columns、filter、flex、flex-basis 、flex-grow、flex-shrink属性)

CSS3 动画相关属性实例大全&#xff08;三) &#xff08;columns、filter、flex、flex-basis 、flex-grow、flex-shrink属性&#xff09; 本文目录&#xff1a; 一、columns属性&#xff08;设置元素的列宽和列数&#xff09; 二、filter属性&#xff08;调整图像、背景和边…...

中国最厉害的思想家改名大师颜廷利:以诚信为基,塑企业信誉

跨文化融合&#xff0c;共筑包容性文化殿堂。尊重差异&#xff0c;促进团队合作&#xff0c;以诚信为基&#xff0c;塑企业信誉。融合《升命学说》智慧&#xff0c;推动员工多元化&#xff0c;践行社会责任&#xff0c;树立良好形象。创新不息&#xff0c;持续学习&#xff0c;…...

Python 代码实现用于进行水质模拟和优化加氯量

# -*- coding:utf-8 -*- import epamodule as em import epanetmsxmodule as msx import pandas as pd import numpy as np# 水质模拟,会产生一个rpt文件,但并不是返回这个文件。 def quality_simulation(inp_file,rpt_file,msx_file...

挖矿病毒来势汹汹

病毒来了, 我的个人站点使用了 wordpress, 它的不知哪个漏洞让黑客攻入了我的站点 使用 top 命令看到了有不明进程始终占据了 100% 的 CPU snapshot 1 snapshot 2 通过以下 "三板斧"可以查杀这个进程 先用 top (shiftp) 查找占据 CPU 最多的进程根据其进程号 pid 查看…...

国产数据库的蓝海在哪?

昨天有幸参加了 OceanBase2024年度发布会。在过去的几年中&#xff0c;OB 作为国内自主研发的分布式数据库&#xff0c;取得了令人瞩目的成就&#xff0c;特别是在金融行业&#xff0c;OB 通过不断的技术革新和优化&#xff0c;已经成为行业的领导者之一。OceanBase 展现了强大…...

MySQL~表的操作(创建表,查看表,修改表,删除表)

1.创建表 1.1.创建表 首先要选择需要操作的数据库&#xff0c;USE 数据库名&#xff0c;后续可以根据实际情况操作时添加。 USE fruitsales;建表语法&#xff1a; create table 表名( 字段名1 数据类型, 字段名2 数据类型, ); 实例&#xff1a;创建fruit_bak1表。 create t…...

多线程加锁与手搓智能指针实践

前缀知识 如何手搓智能指针 参考链接 如何多线程加锁&#xff0c;线程间通信 参考链接 注意&#xff1a; 在第一个链接中&#xff0c;重载赋值构造函数时&#xff0c;返回值类型为引用类型&#xff0c;仅适用于返回的这个对象, 在该函数调用前 (已经)存在了!!! 具体可参考 参考…...

3180. 执行操作可获得的最大总奖励 I

力扣刷题记录 dp 回溯 3180. 执行操作可获得的最大总奖励 I 思路 和往常一样&#xff0c;先使用暴力求解&#xff0c;想到了回溯算法&#xff0c;选择了当前数字&#xff0c;就跳到下一个数字&#xff0c;形成一个树形结构来遍历所有结果集合&#xff0c;但是没有找到优化算…...

react18中的jsx 底层渲染机制相关原理

jsx 底层渲染机制 渲染 jsx 时&#xff0c;会先解析 jsx&#xff0c;生成一个虚拟 dom(virtual dom)。然后将虚拟 dom 渲染成真实 dom。如果 jsx 中包含事件&#xff0c;会将事件绑定到真实 dom 上。 虚拟 dom 对象&#xff0c;是框架内部构建的一套对象体系&#xff0c;对象…...

Spring Boot 实现文件上传下载功能

文章目录 一、原理分析1.1 请求类型1.2 服务器解析 二、功能实现2.1 创建项目并导入依赖2.2 文件上传功能实现2.2.1 文件上传 Service2.2.2 文件上传 Controller 2.3 文件下载功能实现2.3.1 文件下载 Service2.3.2 文件下载 Controller 2.4 文件上传前端代码(可选)2.4.1 上传文…...

ArcGIS 10.8 安装教程(含安装包)

目录 一、ArcGIS10.8二、安装链接三、安装教程四、ArcGIS实战 &#xff08;一&#xff09;ArcGIS10.8 1. 概述 ArcGIS 10.8是由美国Esri公司开发的GIS平台&#xff0c;用于处理、分析、显示和管理地理数据&#xff0c;并实现数据共享。它具有新特性和功能&#xff0c;性能更…...

【小白学机器学习16】 概率论的世界观2: 从正态分布去认识世界

目录 1 从正态分布说起 1.1 正态分布的定义 1.2 正态分布的名字 1.3 正态分布的广泛&#xff0c;和基础性 2 正态分布的公式和图形 2.1 正态分布 2.2 标准正态分布 3 正态分布的认识的3个层次 3.1 第1层次&#xff1a;个体的某个属性的样本值&#xff0c;服从正态分布…...

Python 爬虫项目实战:爬取某云热歌榜歌曲

一、网络爬虫的定义 网络爬虫&#xff08;Web Crawler&#xff09;&#xff0c;也成为网页蜘蛛或者网页机器人&#xff0c;是一种按照既定规则自动浏览网络并提取信息的程序。爬虫的主要用途包括数据采集、网络索以及内容抓取等。 二、爬虫基本原理 1、种子URL&#xff1a;爬…...

HCIP-HarmonyOS Application Developer 习题(十八)

&#xff08;判断&#xff09;1、在HarmonyOS有序公共事件中&#xff0c;高优先级订阅者可修改公共事件内容或处理结果&#xff0c;但不能终止公共事件处理。 答案&#xff1a;错误 分析&#xff1a;有序公共事件&#xff1a;主要场景是多个订阅者有依赖关系或者对处理顺序有要…...

操作系统学习笔记2.3互斥

文章目录 进程同步实现方式 进程互斥实现方式 软件实现方法硬件实现方法同步问题生产者-消费者问题问题描述解决方案代码解析 多生产者-多消费者问题问题描述 解决方案代码解析总结 抽烟者问题问题背景 同步与互斥的挑战解决方案实现步骤代码解释 关键点 进程同步 进程同步是指…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...