- from utis import canshu as c
- from utis.shibie import Goods
- from utis2.obj_tool import KeyBord, HotKey
- bo = KeyBord() # 键鼠模拟工具类
- no_off = HotKey() # 热键
- VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT = 'a_u', 'a_d', 'a_l', 'a_r'
- # 读取配置
- with open('../data/fb.shi', errors='ignore') as f:
- f = safe_load(f)
- names = f['names']
- BUFF = f["buff"]
- ski_boss = f['s_boss']
- zhiye = f['zhiye']
- ski1 = f['q_ski']
- ski2 = f['f_x_ski']
- ONE_KEY_UP = f['ONE_KEY_UP'] # 一键捡物按键
- REV = f['REV']
- hit_off = f['GIT_OFF']
-
- class Goods:
- # 一个物品的信息类
- def __init__(self, name, x, y, w, h,x_s):
- self.name = name
- self.x = x
- self.y = y
- self.w = w
- self.h = h
- self.x_s = x_s # 相似度
- def __str__(self):
- return f"{self.name}xy:{self.x, self.y},wh:{self.w,self.h},s_x{self.x_s}"
-
- def __eq__(self, other):
- # 平面坐标系中相等比较
- return self.x == other.x and self.y == other.y
-
复制代码- class Search:
- def __init__(self):
- self.DATA = None
- self.start = None # 起点
- self.t_j = c.door_func_dict[c.t_j]
- self.door = c.door_func_dict[c.door]
-
- @property
- def end(self):
- # 获得终点
- for i, points in END_DICT.items():
- if not points.any():
- continue
- if i in (0, 1, 2):
- return self.get_near_point(points, center=True)
- elif i == 3:
- # 如果是门,选择一个最佳门,并返回其位置
- door = self.door(points, self.index)
- if door is not None:
- return np.array(door)
- elif i == 4:
- # 如果是怪物,选择最佳位置并返回
- if len(points) == 1:
- return self.monster_xiuzheng(points[0])
- near = self.filter_guai(points)
- return near
- return np.array([*self.t_j[self.index]])
-
- def __call__(self, data):
- self.DATA = data
- self.start = self.start_info(self.max_conf(c.zhiye)) # 1.获得起点
- return self.start, self.end # 返回起点、终点
复制代码- from utis import set_canshu as c
- from time import sleep, time, strftime, gmtime
- from os import getcwd
- from utis.shibie import model_run, HotKey,Ski
- from utis.boss_ski import Boss
- from utis.search import Search
- from utis.move import Move
- from utis.login import DengLu, Twon
- # 自动刷图
- class Auto:
- def __init__(self):
- set_window() # 窗口设置
- self.hot = c.hot
- self.hot.start() # 开关
- self.se = Search() # 寻找
- self.boss = Boss() # boss
- self.ski = Ski() #技能
- self.move = Move() # 移动
- self.map = Map() #地图
- self.login = DengLu() #登录
- self.town = Twon() # 城镇
- self.index = None
- self.DATA = {} # 识别数据
- self.img0 = None
- self.model = model_run()
- self.st, self.end = None, None # 起点 终点
- self.t1, self.t2, self.t3 = 0, 0, 0
-
- def fuben_move_and_get_end(self):
- # 副本中检测
- time_out = self.map(self.get_max_conf_point(), self.end)
- self.min_room_result()
- self.st, self.end = self.se(self.DATA, self.index) # 获得起点终点
- if self.end == c.jzb:
- self.move.up_key()
- self.ski.picking_up()
- return
- if self.update_start(time_out): # 超时卡点操作
- return
- move_res = self.move(self.st, self.end, self.map.DIR[self.index].w, self.map.p_fx) # 图内寻路处理部分
- self.move_result(move_res)
- # 移动结果处理
- def move_result(self, result):
- if not result:
- return
- if result == c.zb: # 捡装备
- self.ski.picking_up()
- elif result in c.guai:
- self.ski(self.img0, self.index) # 释放技能
-
- def boss_room(self):
- # 通关检测
- if self.map.is_boss: # 继续挑战:
- self.move.up_key()
- if not self.boss(self.img0, self.map.pl):
- return
- if self.boss.t_g: # True为检测到通关:
- self.boss.t_g = None
- t = time() - self.t2
- self.t3 += t
- print(f"本次用时---{strftime('%H:%M:%S', gmtime(t))},消耗PL:{self.map.pl},"
- f"总计用时---{strftime('%H:%M:%S', gmtime(self.t3))}")
- if self.boss.pl_none: # PL值为o
- if self.town.role_index:
- self.town.role_index -= 1 # 角色数量减一
- self.boss.pl_none = None
- print(f"当前角色总计用时---{strftime('%H:%M:%S', gmtime(self.t3))}")
- return True
-
- def town_res(self):
- # 城镇检测
- pl = IMG.get_pl(self.img0)
- if pl: # 检测pl值
- self.map.pl = c.pl - pl
- else:
- if self.town.role_index and self.town.is_select_role:
- print(f'# 当前为第{self.town.role_index}个角色,该角色没有pl值,更换其他角色')
- self.town.role_index -= 1 # 角色数量减一
- self.town.init()
- self.town(self.DATA) # 城镇模块
- def __call__(self):
- if not IMG.get_handel(c.play_name):
- if not self.login.DXF_denglu():
- print("启动游戏失败")
- return
- while True:
- if not self.off_no(): # 控制开关
- continue
- self.DATA, self.img0 = self.model.get_data() # 获得识别数据
- if self.hot.jietu:
- self.save_img0() # 保存截图
- if self.get_max_conf_point("min_boss") is not None: # 1.副本中检测
- self.fuben_move_and_get_end()
- continue
- if self.boss_room(): # 2.通关检测
- continue
- self.town_res() # 3.城镇检测
-
- if __name__ == '__main__':
- Auto()() #启动
-
复制代码
|