def Click_Zhuangbei(screen=None): at = (549, 155, 858, 352) if screen is None: screen = self.getscreen() old = UIMatcher.img_cut(screen, at) while True: self.click(525, 71, post_delay=0.5) screen = self.getscreen() new = UIMatcher.img_cut(screen, at) if self.img_equal(old, new) > 0.98: continue break
def get_six_clothes(screen=None): if screen is None: screen = self.getscreen() Six_Points = [ (101, 111), (336, 112), (65, 198), (371, 199), (101, 284), (336, 286), ] sc = cv2.cvtColor(screen, cv2.COLOR_RGB2HSV) value = sc[:, :, 1] out = [] # 从左到右,从上到下 for p in Six_Points: w, h = 60, 30 pic = UIMatcher.img_cut(value, (p[0], p[1], p[0] + w, p[1] + h)) if debug: print(pic.max()) if pic.max() > 150: out += [True] else: out += [False] if debug: print(out) return out
def wait_for_loading(self, screen=None, delay=0.5, timeout=30): """ 等待黑屏loading结束 :param screen: 设置为None时,截图,否则使用screen :param delay: 检测间隔 :param timeout: 超过timeout,报错 Add 2020-08-15: 增加对Connect的检测。 """ time.sleep(delay) sc = self.getscreen() if screen is None else screen last_time = time.time() while True: self._move_check() if self.is_exists(img='img/connecting.bmp', at=(748, 20, 931, 53), screen=sc): time.sleep(delay) sc = self.getscreen() continue sc_cut = UIMatcher.img_cut(sc, MAIN_BTN["loading_left"].at) if not (sc_cut == 1).all(): break if time.time() - last_time > timeout: raise Exception("Loading 超时!") time.sleep(delay) sc = self.getscreen()
def _check_img_in_list_or_dir(self, target_txt, target_pic_at, target_dir, target_list_name, screen): data = self._load_data_cache() if data is None: return target_txt # No Dataset, Do Nothing. target_list = getattr(data, target_list_name) if target_txt in target_list: return target_txt # Good if not os.path.isdir(target_dir): os.makedirs(target_dir) P = pathlib.Path(target_dir) if target_pic_at is not None: screen = UIMatcher.img_cut(screen, target_pic_at) for p in P.iterdir(): if p.suffix == ".bmp": bmp2 = cv2.imdecode(np.fromfile(str(p), dtype=np.uint8), -1) if self.img_equal(screen, bmp2, similarity=0.5) > 0.98: if debug: print("找到相似图片:", p) if p.stem in target_list: return p.stem # 失败 target_name = checkNameValid(target_txt) save_target = os.path.join(target_dir, target_name + ".bmp") save_target = str(pathlib.Path(save_target)) cv2.imencode('.bmp', screen)[1].tofile(save_target) self.log.write_log("warning", f"文字{target_txt}可能识别有误!请修改{save_target}的文件名为正确的值!") return target_txt
def get_bar(self, bar: PCRelement, screen=None): """ 进度条类百分比获取 :param bar: 含有at,fc,bc元素的PCRelement 其中,at为截取进度条,fc为进度条【横向中线】前景色,bc为进度条【横向中线】背景色 :param screen: 设置为None,重新截屏 :return: 百分比0~1 """ if screen is None: screen = self.getscreen() at, fc, bc = bar.at, bar.fc, bar.bc x1, y1, x2, y2 = at ym = int((y1 + y2) / 2) # 只取中之条 mid_line = UIMatcher.img_cut(screen, (x1, ym, x2, ym)) # R,G,B -> B G R fc = np.array([fc[2], fc[1], fc[0]]) bc = np.array([bc[2], bc[1], bc[0]]) tf = np.sqrt(((mid_line - fc)**2).sum(axis=2)).ravel() tb = np.sqrt(((mid_line - bc)**2).sum(axis=2)).ravel() t = tf < tb left = 0 right = len(t) - 1 for ind in range(len(t)): if t[ind]: left = ind break for ind in range(len(t) - 1, -1, -1): if not t[ind]: right = ind break t = t[left:right + 1] return t.sum() / len(t)
def CheckExist(screen=None): # 是否还有申请?检测最上面是不是一片空白(方差过小) if screen is None: screen = self.getscreen() at = (363, 134, 902, 195) bd = UIMatcher.img_cut(screen, at) s = bd.std() return s > 10
def img_equal(self, img1, img2, at=None, similarity=0.01) -> float: """ 输出两张图片对应像素相似程度 要求两张图片大小一致 :return: 相似度 0~1 """ if isinstance(img1, str): img1 = cv2.imread(img1) if isinstance(img2, str): img2 = cv2.imread(img2) at = self._get_at(at) if at is not None: img1 = UIMatcher.img_cut(img1, at) img2 = UIMatcher.img_cut(img2, at) img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) / 255 img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) / 255 return np.sum(np.abs(img1 - img2) < similarity) / img1.size
def get_daoju_number(self, screen=None, must_int=True): """想尽一切办法获得右上角道具数量。 利用x号定位,获取精确范围。 若开启must_int:则会再搞不出整数时返回(None, 原始str),搞出时返回(整数,原始str) 否则,返回整数或原始str """ MIDS = {1: 49, 2: 39, 3: 31, 4: 21, 5: 11} # 中位数 sc = self.getscreen() if screen is None else screen at = (647, 199, 714, 217) sc = UIMatcher.img_cut(sc, at=at) plus = cv2.imread(filename="img/plus.bmp") choose = self.img_where_all_prob(plus, screen=sc, threshold=0.6) if len(choose) == 0: if must_int: return None, -1 else: return -1 choose = choose[0] prob, x, y, (x1, y1, x2, y2) = choose num_at = (x2 + 647, 199, 720, 214) out = self.ocr_center(*num_at) if out == -1: if must_int: return None, out else: return out new_out = make_it_as_number_as_possible(out) if len(new_out) == 0: if must_int: return None, out else: return out the_int = int(new_out) int_len = len(str(the_int)) if int_len > 5: if must_int: return None, out else: return the_int # The median X should be +- 3 M_X = MIDS[int_len] if -3 <= x - M_X <= 3: # Good int, maybe. if must_int: return the_int, out else: return the_int else: # Maybe Bad INT. if must_int: return None, out else: return must_int
def maizhuangbei(self, day_interval): """ 卖掉数量前三的装备,(如果超过1000) 适合小号 :param day_interval: 日期间隔:每过day_interval天进行一次卖出 """ def get_last_record(): ts = self.AR.get("time_status", UDD["time_status"]) return ts["maizhuangbei"] def set_last_record(): ts = self.AR.get("time_status", UDD["time_status"]) ts["maizhuangbei"] = time.time() self.AR.set("time_status", ts) tm = get_last_record() diff = time.time() - tm if diff < day_interval * 3600 * 24: self.log.write_log( "info", f"离下次卖装备还有{day_interval - int(diff / 3600 / 24)}天,跳过。") return self.lock_home() self.lock_img(ZHUCAIDAN_BTN["bangzhu"], elseclick=[(871, 513)]) # 锁定帮助 self.click_btn(ZHUCAIDAN_BTN["daoju"], until_appear=ZHUCAIDAN_BTN["daojuyilan"]) self.click_btn(ZHUCAIDAN_BTN["zhuangbei"], until_appear=ZHUCAIDAN_BTN["chushou"]) if not self.is_exists(ZHUCAIDAN_BTN["chiyoushu"]): self.click(723, 32, post_delay=3) self.click(285, 228, post_delay=1) self.click(587, 377, post_delay=3) self.click_btn(ZHUCAIDAN_BTN["jiangxu"], until_appear=ZHUCAIDAN_BTN["jiangxu"]) for _ in range(3): self.click_btn(ZHUCAIDAN_BTN["chushou"], until_appear=ZHUCAIDAN_BTN["chushouqueren"]) self.click(645, 315, post_delay=2) # max th_at = (518, 267, 530, 282) # 千位 img = self.getscreen() cut_img = UIMatcher.img_cut(img, th_at) if debug: print("VAR:", cut_img.var()) if cut_img.var() > 1000: # 有千位,卖 self.click_btn(ZHUCAIDAN_BTN["chushou2"], until_appear=ZHUCAIDAN_BTN["chushouwanbi"]) for _ in range(5): self.click(1, 1) else: break set_last_record() self.lock_home()
def dragdown(): obj = self.d.touch.down(55, 347) time.sleep(0.1) obj.move(55, 130.5) time.sleep(0.8) sc = self.getscreen() r1c0 = UIMatcher.img_cut(sc, get_equ_at(1, 0)) flag = False if r1c0.std() < 15: # 拖到底了 flag = True obj.up(55, 130) time.sleep(1) return flag
def dragdown(): obj = self.d.touch.down(55, 445) time.sleep(0.5) obj.move(55, 130) time.sleep(0.8) sc = self.getscreen() r1c0 = UIMatcher.img_cut(sc, at=(56, 354, 140, 441)) r1c0.std() flag = False if r1c0.std() < 15: # 拖到底了 flag = True obj.up(55, 130) time.sleep(1) return flag
def get_fight_current_member_count(self, screen=None): """ 获取”当前的成员"的数量 要求场景:处于”队伍编组“情况下。 :return: int 0~5 """ count_live = 5 if screen is None: sc = self.getscreen() else: sc = screen for i in range(1, 6): cur = UIMatcher.img_cut(sc, FIGHT_BTN["empty"][i].at) if debug: print("std: ", i, cur.std()) if cur.std() <= 15: count_live -= 1 return count_live
def dao_ju_kuang(screen=None): at = (616, 78, 924, 227) # 道具框 djk = screen if screen is not None else self.getscreen() djk = UIMatcher.img_cut(djk, at) return djk