古剑钓鱼脚本

背景

玩过古剑的小伙伴应该都知道钓鱼时个耗时又无聊的东西
今天教大家如何写个自动钓鱼脚本
ps:成功率大约在80%
ps:本文不提供任何可执行脚本

准备

  • 使用python
  • 三个lib:
    • numpy,
    • PIL,
    • pywinio

目标

古剑钓鱼脚本_第1张图片
a-未到达目标区域时
古剑钓鱼脚本_第2张图片
b-到达目标区域时

首先我们的目标是能够识别出钓鱼时上面的两种状态,

  • 指针到达了黄色的指定区域
  • 指针没有到达黄色的指定区域

如果到达了就按下Q键,没有到达的话等待

分析图片

  1. 这是一张矩形图片
  2. 图片的主要部分是一个蓝色的圆盘(需提取)
  3. 在圆盘的外部有些没有用的干扰背景(需剔除)
  4. 黄色扇区的目标区域(需提取)
  5. 黄色的指针(需提取)
  6. 指针和目标区域是否重叠(需判断)

实现

0.准备

截图

from PIL import ImageGrab
snapshot = ImageGrab.grab()

按键

  • pywinio
  • 大漠插件
  • 按键精灵
    以上3种方式均可,大漠插件只支持32位的python,当然大漠也可以截图
1. 提取蓝色圆盘
#圆盘的颜色
img = Image.open()
default_color = np.array([90, 163, 192], dtype="uint8")
img = np.abs(np.array(img).astype(int) - default_color)

效果:


古剑钓鱼脚本_第3张图片

2. 提取黄色的目标区域和转钩,并转化成黑白图片
def to_gray(img):
    y = np.array(img).astype(int) - np.array([33, 78, 158])
    y = np.mean(y, axis=2)
    y = ((y - np.mean(y)) / (np.max(y) - np.min(y)))
    y = y > 0.1
    return y * 255
img = to_gray(img)

效果


古剑钓鱼脚本_第4张图片
image.png

3. 屏蔽背景干扰

首先画个园

white_elipse = Image.new(size=img.size,mode="L",color=(0))
draw = ImageDraw.Draw(white_elipse)
draw.ellipse((0,0,white_elipse.width,white_elipse.height),fill=(255))
white_elipse
古剑钓鱼脚本_第5张图片
image.png

然后直接点乘即可

img = (np.array(white_elipse)>128) * img
古剑钓鱼脚本_第6张图片

然后在看看如果转钩到达了目标区域是的状态

古剑钓鱼脚本_第7张图片
image.png
4. 检测判断

仔细观察上图,

  • 可以发现当转钩到达目标区域时白色减少,黑色增多了
  • 减少的白色的总面积恰好是转钩所占据的面积

所以只需简单判断:

  • 这一刻的白色面积 - 上一刻白色面积 > 转钩掉面积

就可以判断是否到达了目标区域

白色区域面积计算:

def area(img):
    return np.count_nonzero(img) / np.size(img)
zuang_gou_area = 0.004 #转钩掉面积

你可能感兴趣的:(古剑钓鱼脚本)