本帖最后由 xhtdtk 于 2021-8-14 19:13 编辑
直接开始:
(一)针对上个文章最后提出的两个问题做解答
1、是否触发了自动寻路
可以通过获取坐标链接来掌握我们现在的位置,在聊天框复制链接后通过剪贴板print出来
[Python] 纯文本查看 复制代码 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)[0])
y=float(re.findall(',(\\d\\d?\\d?)',xy)[0])
pyperclip.copy('')
return x,y,xy
效果:
这样就可以根据两点之间的举例来判断是否离目标越来越近,公式:|AB|=√[(x2-x1)^2+(y2-y1)^2]
2、是否触发了对话
若触发了对话,shift+鼠标左键获取链接时,聊天框不能获取链接。
所以先判断我和目标的距离,当游戏距离小于10的时候,尝试点击目标,否则等待。
当我不能获取链接时,说明我触发了对话。
[Python] 纯文本查看 复制代码 #触发NPC对话
while True:
time.sleep(3)
try:
xy=window.getxy()#若触发了对话,获取坐标就会报错
if '傲来国' in xy[2]:#判断我是否在傲来国
if ((xy[0]-98)*(xy[0]-98)-(xy[1]-18)*(xy[1]-18))**0.5<10:#判断我和目标的距离
time.sleep(3)
m.click(sizewindow[0]+410+int((98-xy[0])*20),sizewindow[1]+330+int((xy[1]-18)*20)-80)#点击任务,20个电脑坐标相当于1个游戏坐标
break
except:
m.click(sizewindow[0]+311,sizewindow[1]+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[0]+479,sizewindow[1]+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简单识别速度较快
[Python] 纯文本查看 复制代码 #点击
while True:
m.click(sizewindow[0]+360,sizewindow[1]+278)
time.sleep(random.randint(2,5))
m.click(sizewindow[0]+360,sizewindow[1]+278)
time.sleep(1)
m.click(sizewindow[0]+360,sizewindow[1]+278)
time.sleep(1)
img1 = ImageGrab.grab(bbox=(sizewindow[0]+276,sizewindow[1]+128,sizewindow[0]+541,sizewindow[1]+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秒再按空格(因为松开空格网脱钩方向移动非常快)
[Python] 纯文本查看 复制代码 #钓鱼
m.click(sizewindow[0]+403,sizewindow[1]+265)
lst=[]
while True:
img3 = ImageGrab.grab(bbox=(sizewindow[0]+394-79,sizewindow[1]+261-75,sizewindow[0]+441-79,sizewindow[1]+283-75))
img3.save('03.png')
img4 = ImageGrab.grab(bbox=(sizewindow[0]+532-79,sizewindow[1]+260-75,sizewindow[0]+575-79,sizewindow[1]+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 |