def run(number): """运行""" tools = Tools() for _ in range(1, number + 1): logger.info("任务共 {} 次 | 第 {} 次".format(number, _)) tools.tap(x=925, y=510, _log="开始,等待任务完成") while True: tools.capture_screen() match_result = tools.match_img(capture_img=tools.paths["screen"], temp_img=tools.paths["shengli"]) if match_result: tools.tap(700, 400, "胜利!\n") tools.sleep(randint(2, 5)) break tools.sleep(3)
class DiYu(object): __doc__ = "每日地域鬼王,默认使用热门" # TODO 重写鬼王代码,尽量每一步都有图片识别,并且能识别场景 def __init__(self): self.tools = Tools() # 右上角 筛选 self.shaixuan = (906, 37) # 热门 self.shoucang = (969, 363) # 姑获鸟 (选择第一个) self.guhuoniao = (812, 208) # 以津真天 (选择第二个) self.yijin = (807, 312) # 山童 (选择第三个) self.shantong = (822, 417) # 挑战 self.tiaozhan = (907, 424) # 40级按钮坐标 self.jibie_40 = (327, 236) # 1级按钮坐标 self.jibie_1 = (102, 241) def difficulty_adjustment(self): """难度从 40 级调整到 1 级""" logger.info("难度从 40 级下调至 1 级") self.tools.swipe(self.jibie_40[0], self.jibie_40[1], self.jibie_1[0], self.jibie_1[1]) def process(self, name): # 寻找准备按钮 self.tools.find_img(path=self.tools.paths["zhunbei"], x=933, y=472, log="点击准备按钮") # 寻找胜利(经验页面)按钮 self.tools.find_img(path=self.tools.paths["qianshengli"], x=416, y=83, log="点击胜利按钮") # 寻找胜利图标 self.tools.find_img(path=self.tools.paths["shengli"], x=700, y=400, log="胜利") search_num = 0 # 寻找进攻按钮的次数,当前设定 3, search_total = 3 while True: self.tools.capture_screen() # 点击进攻按钮 match_result = self.tools.match_img( capture_img=self.tools.paths["screen"], temp_img=self.tools.paths["tiaozhan"]) if match_result: self.tools.tap(925, 88, "退出\n{} - 结束".format(name)) break if search_num == search_total: logger.warning("匹配超时,自动跳过当前操作") break search_num += 1 logger.debug(f"第{search_num}次匹配图像") self.tools.sleep(1) self.tools.sleep(4) def beat(self): # 如果点地域鬼王出现新挑战鬼王,自动关闭 self.tools.capture_screen() _color = self.tools.get_pixel(46, 47) logger.debug(f"像素:{_color}") if _color == (140, 144, 159): self.tools.tap(self.shaixuan[0], self.shaixuan[1]) self.tools.tap(self.shaixuan[0], self.shaixuan[1], "点击【筛选】") self.tools.tap(self.shoucang[0], self.shoucang[1], "点击【热门】") self.tools.tap(self.guhuoniao[0], self.guhuoniao[1], "点击【鬼王】") self.difficulty_adjustment() self.tools.tap(self.tiaozhan[0], self.tiaozhan[1], "点击挑战") self.process("鬼王") # ------------------------------------------------ # self.tools.tap(self.shaixuan[0], self.shaixuan[1], "点击【筛选】") self.tools.tap(self.shoucang[0], self.shoucang[1], "点击【热门】") self.tools.tap(self.yijin[0], self.yijin[1], "点击【鬼王】") self.tools.tap(self.tiaozhan[0], self.tiaozhan[1], "点击挑战") self.process("鬼王") # ------------------------------------------------ # self.tools.tap(self.shaixuan[0], self.shaixuan[1], "点击【筛选】") self.tools.tap(self.shoucang[0], self.shoucang[1], "点击【热门】") self.tools.tap(self.shantong[0], self.shantong[1], "点击【鬼王】") self.tools.tap(self.tiaozhan[0], self.tiaozhan[1], "点击挑战") self.process("鬼王")
class TuPo(object): __doc__ = "结界突破。默认每次进攻前失败一次(防止结界突破难度提升)。" \ "会调用腾讯 AI OCR 接口查询剩余结界券数量。" \ "请确保阵容是解锁状态。" def __init__(self): self.tools = Tools() @staticmethod def shuffle_location(): """寮结界突破坐标""" # 因为攻击胜利会自动补上,所以只需要点第一个位置就可以 p1 = ((475, 142), (527, 305)) p2 = ((489, 141), (534, 303)) p3 = ((531, 138), (512, 302)) # 随机将上述坐标打乱 result = [p1, p2, p3, p1, p2, p3] shuffle(result) return result def beat(self, p): """进攻操作,包含主动失败退出,正常攻击""" # 结界坐标 x = p[0][0] y = p[0][1] # 结界对应进攻按钮坐标 xj = p[1][0] yj = p[1][1] # 点击结界 self.tools.tap(x, y, "点击结界") # 点击进攻按钮 while True: self.tools.capture_screen() match_result = self.tools.match_img( capture_img=self.tools.paths["screen"], temp_img=self.tools.paths["jingong"]) if match_result and self.tools.get_pixel(530, 277) != (173, 170, 156): self.tools.tap(xj, yj, "点击进攻按钮") break else: logger.warning("冷却时间未到") self.tools.tap(x, y) sys.exit(0) self.tools.sleep(1) # 开始后点击 4 号式神 click_list = [(662, 314), (659, 333), (658, 352)] while True: self.tools.capture_screen() self.tools.sleep(0.2) c = self.tools.get_pixel(431, 568) if c == (255, 255, 255): x, y = choice(click_list) self.tools.tap(x, y, "点击茨林") break self.tools.sleep(1) # 寻找胜利图标 self.tools.find_img(path=self.tools.paths["shengli"], x=501, y=436, log="胜利") def run(self): n = 0 logger.warning("数据库无数据,默认使用本地坐标") loc_list = self.shuffle_location() for loc in loc_list: n += 1 self.tools.sleep(1) logger.info("第{}次突破".format(n)) self.beat(loc) if n == 6: break
class TuPo(object): __doc__ = "结界突破。默认每次进攻前失败一次(防止结界突破难度提升)。" \ "会调用腾讯 AI OCR 接口查询剩余结界券数量。" \ "请确保阵容是解锁状态。" def __init__(self): self.tools = Tools() @staticmethod def shuffle_location(): """结界突破九宫格坐标""" # 第一个元组是结界按钮,第二个元组是对应进攻按钮 p1 = ((275, 138), (307, 309)) p2 = ((546, 141), (574, 309)) p3 = ((810, 143), (839, 310)) p4 = ((287, 251), (306, 415)) p5 = ((553, 254), (574, 419)) p6 = ((821, 255), (840, 417)) p7 = ((284, 360), (307, 526)) p8 = ((538, 361), (573, 526)) p9 = ((807, 362), (838, 528)) # 随机将上述坐标打乱 result = [p1, p2, p3, p4, p5, p6, p7, p8, p9] shuffle(result) return result def beat(self, p): """进攻操作,包含主动失败退出,正常攻击""" # 结界坐标 x = p[0][0] y = p[0][1] # 结界对应进攻按钮坐标 xj = p[1][0] yj = p[1][1] num = 2 # 进攻次数 2 次 n = 0 for _ in range(num): # 点击结界 self.tools.tap(x, y, "点击结界") # 判断结界是否手动操作过 search_num = 0 # 寻找进攻按钮的次数,当前设定 3, search_total = 3 while True: self.tools.capture_screen() # 点击进攻按钮 match_result = self.tools.match_img( capture_img=self.tools.paths["screen"], temp_img=self.tools.paths["jingong"]) if match_result: self.tools.tap(xj, yj, "点击进攻按钮") break if search_num == search_total: break search_num += 1 logger.debug(f"第{search_num}次匹配图像") self.tools.sleep(1) if search_num == search_total: logger.warning("匹配超时,自动跳过当前操作") break if n == 0: # 寻找退出按钮 while True: self.tools.capture_screen() match_result = self.tools.match_img( capture_img=self.tools.paths["screen"], temp_img=self.tools.paths["zhunbei"]) if match_result: self.tools.tap(28, 26, "找到退出按钮") self.tools.tap(592, 338, "点击退出按钮") self.tools.tap(408, 143, "退出") self.tools.sleep(2) break self.tools.sleep(1) n += 1 else: # 寻找准备按钮 self.tools.find_img(path=self.tools.paths["zhunbei"], x=933, y=472, log="点击准备按钮") # 开始后点击 4 号式神 click_list = [(662, 314), (659, 333), (658, 352)] while True: self.tools.capture_screen() self.tools.sleep(0.2) c = self.tools.get_pixel(431, 568) if c == (255, 255, 255): x, y = choice(click_list) self.tools.tap(x, y, "点击茨林") break self.tools.sleep(1) # 寻找胜利图标 self.tools.find_img(path=self.tools.paths["shengli"], x=501, y=436, log="胜利") def run(self): # 先从数据库获取坐标列表,如果有数据去 n = 0 logger.warning("数据库无数据,默认使用本地坐标") loc_list = self.shuffle_location() for loc in loc_list: n += 1 self.tools.sleep(1) logger.success("第{}次突破".format(n)) self.beat(loc) if n in (3, 6, 9): self.tools.sleep(1) self.tools.tap(167, 483) self.tools.sleep(1) self.tools.tap(167, 483) # 截图识别次数 if self.tools.capture_png(): result = self.tools.ocr_api() if result < 9: logger.warning("不足9次,停止") logger.info("任务完成") else: logger.success("剩余结界突破券:{}".format(result)) self.run() else: logger.error("截图失败")