Ejemplo n.º 1
0
 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
Ejemplo n.º 2
0
 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
Ejemplo n.º 3
0
 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()
Ejemplo n.º 4
0
    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
Ejemplo n.º 5
0
 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)
Ejemplo n.º 6
0
 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
Ejemplo n.º 7
0
    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
Ejemplo n.º 8
0
    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
Ejemplo n.º 9
0
    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()
Ejemplo n.º 10
0
 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
Ejemplo n.º 11
0
 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
Ejemplo n.º 12
0
 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
Ejemplo n.º 13
0
 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