根据游戏规律制作脚本之自动钓鱼
本帖最后由 xhtdtk 于 2021-8-14 19:13 编辑直接开始:
(一)针对上个文章最后提出的两个问题做解答
1、是否触发了自动寻路
可以通过获取坐标链接来掌握我们现在的位置,在聊天框复制链接后通过剪贴板print出来
def getxy(self):
pyperclip.copy('')#将剪贴板复制的信息设置为空
left,top,right,bottom=win32gui.GetWindowRect(self.hld)#获取游戏窗口位置
m = PyMouse()
k = PyKeyboard()
#组合键,shift+鼠标左键点击坐标
k.press_key(k.shift_key)
m.click(left+100,top+65)#游戏坐标信息框,根据游戏窗口相对位置点击
time.sleep(0.5)
k.release_key(k.shift_key)
#点击聊天框2次全选
m.click(left+190,top+610,1,2)
#组合键,ctrl+c复制
time.sleep(0.5)
k.press_key(k.control_key)
k.tap_key('c')
time.sleep(0.5)
k.release_key(k.control_key)
#删除聊天框信息
k.tap_key(k.delete_key)
#将在剪贴板复制的信息赋值并返回
xy=pyperclip.paste()
if xy!='':
x=float(re.findall('(\\d\\d?\\d?),',xy))
y=float(re.findall(',(\\d\\d?\\d?)',xy))
pyperclip.copy('')
return x,y,xy
效果:
这样就可以根据两点之间的举例来判断是否离目标越来越近,公式:|AB|=√[(x2-x1)^2+(y2-y1)^2]
2、是否触发了对话
若触发了对话,shift+鼠标左键获取链接时,聊天框不能获取链接。
所以先判断我和目标的距离,当游戏距离小于10的时候,尝试点击目标,否则等待。
当我不能获取链接时,说明我触发了对话。
#触发NPC对话
while True:
time.sleep(3)
try:
xy=window.getxy()#若触发了对话,获取坐标就会报错
if '傲来国' in xy:#判断我是否在傲来国
if ((xy-98)*(xy-98)-(xy-18)*(xy-18))**0.5<10:#判断我和目标的距离
time.sleep(3)
m.click(sizewindow+410+int((98-xy)*20),sizewindow+330+int((xy-18)*20)-80)#点击任务,20个电脑坐标相当于1个游戏坐标
break
except:
m.click(sizewindow+311,sizewindow+381)#触发了对话,买鱼竿
time.sleep(0.5)
k.tap_key(k.escape_key)
time.sleep(1)
k.tap_key(k.tab_key)
time.sleep(1)
m.click(sizewindow+479,sizewindow+504)
time.sleep(0.5)
k.tap_key(k.escape_key)
break
(二)实现自动钓鱼
过程:1找到渔夫→2买鱼竿→3去钓鱼位置→4点击鱼竿进入钓鱼模式→5自动钓鱼
1、alt+h进入小昕社区搜索钓鱼,根据窗口相对坐标点击傲来国
2、根据窗口相对位置购买鱼竿
3、根据窗口相对位置点击钓鱼位置
4、alt+e打开背包,为了方便我将鱼竿放在背包最后一个位置,根据窗口相对位置右键点击进入钓鱼模式
疑问:刚买的鱼竿不是放在最后一个位置怎么办
说明:鼠标静置在背包的物品时,会显示物品信息,根据其显示的相对位置再加上窗口相对位置进行物品名字截图,就能判断哪个是鱼竿,因为钓鱼才是重点,所以这一步简化。
5、钓鱼过程
过程5.1 点击第一个图标抛竿(第二个图标选择鱼饵,第三个图标收杆 )
过程5.2 上钩提示,10秒内点击感叹号
过程5.3 比拼体力,按空格键将指针维持在安全区域内,评分为正,否则为负
过程5.4 卖鱼
5.5 循环以上四个过程就可以实现自动钓鱼,我在这其中遇到什么问题呢,我们一个一个来解决。
5.5.1 抛竿之后如何判定鱼上钩了让鼠标一直点击第一个图标,截图OCR识别,如果不是“你已经抛竿了点击收杆后可重新抛竿”,说明鱼上钩了。ddddocr简单识别速度较快
#点击
while True:
m.click(sizewindow+360,sizewindow+278)
time.sleep(random.randint(2,5))
m.click(sizewindow+360,sizewindow+278)
time.sleep(1)
m.click(sizewindow+360,sizewindow+278)
time.sleep(1)
img1 = ImageGrab.grab(bbox=(sizewindow+276,sizewindow+128,sizewindow+541,sizewindow+161))
img1.save('01.png')
with open('01.png', 'rb') as f:
img_bytes1 = f.read()
res1 = ocr.classification(img_bytes1)
#print(res1)
if res1!='你已经抛竿了点击收杆后可重新抛竿':
break
5.5.2 比拼体力过程中,如何让指针维持在安全区域
空格键松开,容易脱钩,截图判断是否出现“脱钩”,有就立刻按空格
空格键一直按,容易断线,截图判断是否出现“断线”,有就立刻松开空格,等待0.6秒再按空格(因为松开空格网脱钩方向移动非常快)
#钓鱼
m.click(sizewindow+403,sizewindow+265)
lst=[]
while True:
img3 = ImageGrab.grab(bbox=(sizewindow+394-79,sizewindow+261-75,sizewindow+441-79,sizewindow+283-75))
img3.save('03.png')
img4 = ImageGrab.grab(bbox=(sizewindow+532-79,sizewindow+260-75,sizewindow+575-79,sizewindow+284-75))
img4.save('04.png')
with open('03.png', 'rb') as f:
img_bytes3 = f.read()
res3 = ocr.classification(img_bytes3)
lst.append(res3)
#print(res3)
with open('04.png', 'rb') as f:
img_bytes4 = f.read()
res4 = ocr.classification(img_bytes4)
lst.append(res3)
#print(res4)
if lst.count('')>200:
k.release_key(k.space_key)
break
if '脱' in res3:
k.press_key(k.space_key)
if '断' in res4:
k.release_key(k.space_key)
time.sleep(0.6)
k.press_key(k.space_key)
最后附上源码,需要安装相应的第三方库,游戏窗口是800*600,自动钓鱼只能拿钓鱼成就,因为钓鱼分数不是很高
可以直接在傲来国(100,10)运行钓鱼.py nanmian 发表于 2022-7-17 20:28
我也是玩神武的。下载了你那个钓鱼的脚本,但是用的时候,一直卡在点击那里,请问有什么解决方法吗?
自从钓鱼不能换宝图,就没有意义了,要家园积分还不如多种菜 林沫 发表于 2021-8-14 18:52
这个我之前有写过一个自动师门的(就是现在的修业)需要我可以发思路 你这个思路很棒
做师门买二级药,买烹饪这些要怎么解决呢{:301_1003:} 膜拜 学习学习思路 支持大佬,学习学习 看到钓鱼还以为是奶块或者我的世界哈哈,就点进来了 这里厉害了,真是大佬啊 我昨天被封了5个号,弃坑了 8年神武正式脱坑。 学习了不错 自动钓鱼的思路很棒!