本文为基于pyautogui、tkinter以及几个标准库开发的用于传奇3法师自动练级的python脚本,代码编写并不完美,只是将本人业余学的python正好运用到了实践当中,有了兴趣的趋动,最终能成功运行,权当是python练手一用。
接上篇博文《【实战项目记录1】编写一个传奇3法师自动练级的python脚本》
今天发布剩下的模块:初始化模块mir3_init.py;遇敌判断模块mir3_is_enemy.py;捡物品模块:mir3_is_item.py
大部分都是借助了pyautogui的控制键鼠功能和图片识别功能,个人觉得比较难的是设置行动范围和规划捡物品路线,供参考。
1.初始化模块mir3_init.py
#!/usr/bin/env python # -*- coding:utf-8 -*- # @Time :2022-5-4 0:08 # @Author :Mengxh # @File :mir3_init.py import os # 装备图库载入列表 itemlist = [] for root, dirs, files in os.walk("./pics/pickup", topdown=False): for name in files: itemlist.append(os.path.join(root, name)) # 定义逐点行走方向和鼠标左右键 l = 350 # x = 100左 r = 700 # x = 900右 u = 200 # y = 150上 d = 500 # y = 550下 role_x = 503 # 人物中心点x坐标 role_y = 353 # 人物中心点y坐标 x_list = [x for x in range(23,1031,48)] y_list = [x for x in range(65,641,32)] lu = (l, u) # 左上 ld = (l, d) # 左下 ru = (r, u) # 左上 rd = (r, d) # 左上 move_list_u = [lu, ru] move_list_d = [ld, rd] move_list = move_list_d + move_list_u region_0 = (1052, 67, 362, 214) # 大补贴截屏范围 region_main = (21, 51, 1000, 730) # 游戏主画面范围 region_jq = (903, 30, 120, 125) jq_pos = (975, 105) print('行走方向设置完成') print('主游戏画面区域设置完成') if __name__ == '__main__': print(x_list) print(y_list) 2.遇敌判断模块mir3_is_enemy.py
#!/usr/bin/env python # -*- coding:utf-8 -*- # @Time :2022-5-3 23:49 # @Author :Mengxh # @File :mir3_is_enemy.py import time import pyautogui import mir3_init pyautogui.PAUSE = 1 def is_enemy(): t = pyautogui.locateOnScreen('./pics/locatepng/guaiwu.png', region=mir3_init.region_0, confidence=0.7) if t is not None: return True # for i in range(2): # pyautogui.press('f2', interval=0.5) # im_1 = pyautogui.locateOnScreen('./pics/menupng/kouxue.png', region=mir3_init.region_main, confidence=0.9) # im_2 = pyautogui.locateOnScreen('./pics/menupng/kouxue.png', region=mir3_init.region_main, confidence=0.9) # if im_1 or im_2: # # print('打了有怪') # return True # else: # # print('打了无怪') # return False else: # print('信息无怪') return False if __name__ == '__main__': time.sleep(2) is_enemy() 3.捡物品模块:mir3_is_item.py
#!/usr/bin/env python # -*- coding:utf-8 -*- # @Time :2022-5-3 23:30 # @Author :Mengxh # @File :mir3_is_item.py import pyautogui import mir3_init import threading import pandas as pd # 对比标准x,y坐标列表,重新设置物品标准坐标 def compare_xy(a,b): x = mir3_init.x_list[list(map(lambda x: abs(x - a), mir3_init.x_list)).index(min(list(map(lambda x: abs(x - a), mir3_init.x_list))))] y = mir3_init.y_list[list(map(lambda x: abs(x - b), mir3_init.y_list)).index(min(list(map(lambda x: abs(x - b), mir3_init.y_list))))] return x,y def is_item(item, pos_list): ts = pyautogui.locateAllOnScreen('%s' % item, region=mir3_init.region_main, confidence=0.6) if ts is not None: for t in ts: pos = pyautogui.center(t) pos = compare_xy(pos.x,pos.y) pos_list.append(pos) def move_line(pos_list): pos0 = (mir3_init.role_x,mir3_init.role_y) df = pd.DataFrame(pos_list, columns=['x', 'y'], dtype='int32') df['s'] = ((df['x'] - pos0[0]) ** 2 + (df['y'] - pos0[1]) ** 2) ** 0.5 newpos_list = [] while True: i = df['s'].idxmin() newpos_list.append((int(df.loc[i][0]),int(df.loc[i][1]))) delta_x = pos0[0] - df.loc[i][0] delta_y = pos0[1] - df.loc[i][1] df = df.drop(index=[i]) df['x'] = df['x'] + delta_x df['y'] = df['y'] + delta_y df['s'] = ((df['x'] - pos0[0]) ** 2 + (df['y'] - pos0[1]) ** 2) ** 0.5 if df.shape[0] == 0: return newpos_list def multi_thread(): print('开始扫描装备') threads = [] pos_list= [] for item in mir3_init.itemlist: threads.append( threading.Thread(target=is_item, args=(item, pos_list)) ) for thread in threads: thread.start() for thread in threads: thread.join() print('结束扫描装备') if pos_list: pos_list = move_line(pos_list) print(pos_list) return pos_list if __name__ == '__main__': while True: multi_thread() 最后比较遗憾的是,这个脚本必须在前台运行,电脑就只能挂机,干不了别的事。自己本想用pywin32尝试后台控制,但因为本人非专业人士,不懂Windows编程,尝试最终也是失败。