原理并不难,就是用Python写一个界面,然后放置一些组件按钮等,但是比连点器要灵活一些,因为这里还可以获取系统参数用于判断代码后序需要执行的方式:

大致思路的源代码如下所示:



# pyautogui.click((choice_ptx,choice_pty)) # 不断点击技能选择
小橘子V4.829 https://wwapw.lanzouu.com/im4Cy3crucaf
小橘子V6.512 https://wwapw.lanzouu.com/iPFUT3crtzbi

# 对选择技能的界面进行截图
screen_return = pyautogui.screenshot()
screen_return = np.array(screen_return).astype(np.uint8)
work3_roi = screen_return[work3_ymin:work3_ymin+work3_h, work3_xmin:work3_xmin+work3_w] 
work4_roi = screen_return[work4_ymin:work4_ymin+work4_h, work4_xmin:work4_xmin+work4_w] 
if debug and saveResImg:
    nowtime = datetime.datetime.now().strftime('%Y%m%d_%H%M%S')
    name34 = 'CSkill3_'+nowtime+'_'+str(gamei).zfill(3)+'.png'
    name4 = 'CSkill4_'+nowtime+'_'+str(gamei).zfill(3)+'.png'
    dimdir34 = osp.join(dstfo2, name34)
    dimdir4 = osp.join(dstfo2, name4)
    cv2.imwrite(dimdir34, work3_roi) # 保存整个游戏界面 2024-10-12 20:49:19
    
# ===============================================================================================
if printlog:
    print('tempW',tempW)
if allscreen_flag:
    roi_jnxz = work4_roi[0:int(0.31*tempW),int(0.41*tempW):int(1.69*tempW)] # '技能选择'四个字
    roi_jn_ico = work4_roi[int(0.72*tempW):int(1.23*tempW),:] # 三个技能图标的位置
    roi_jn_txt = work4_roi[int(1.18*tempW):int(1.69*tempW),:] # 技能图标下面对应的文字描述位置
    roi_jy_ico = work4_roi[int(1.69*tempW):,int(0.72*tempW):int(1.44*tempW)] # 精英掉落的位置
    if printlog:print('>>>>>>>>全屏roi_jnxz:', roi_jnxz.shape)
else:
    roi_jnxz = work4_roi[0:int(0.35*tempW),int(0.41*tempW):int(1.69*tempW)] # '技能选择'四个字
    roi_jn_ico = work4_roi[int(0.72*tempW):int(1.28*tempW),:] # 三个技能图标的位置
    roi_jn_txt = work4_roi[int(1.18*tempW):int(1.74*tempW),:] # 技能图标下面对应的文字描述位置
    roi_jy_ico = work4_roi[int(1.69*tempW):,int(0.72*tempW):int(1.49*tempW)] # 精英掉落的位置
    if printlog:print('>>>>>>>>小屏roi_jnxz:', roi_jnxz.shape)
    
# 开始匹配技能选择模板
ico_jnxz = all_ico_templs[0]
pts_jnxz, maxsco_jnxz = match_template(roi_jnxz, ico_jnxz) # 匹配技能选择小图标
randfloat2 = np.random.uniform(0.7, 0.9)
time.sleep(randfloat2) 
screen_return2 = pyautogui.screenshot()
screen_return2 = np.array(screen_return2).astype(np.uint8)
work4_roi2 = screen_return2[work4_ymin:work4_ymin+work4_h, work4_xmin:work4_xmin+work4_w]
roi_jn_ico = work4_roi2[int(0.72*tempW):int(1.23*tempW),:] # 三个技能图标的位置
roi_jn_txt = work4_roi2[int(1.18*tempW):int(1.69*tempW),:] # 技能图标下面对应的文字描述位置

if maxsco_jnxz>=icothre:
    # 匹配到技能选择才进行后续操作
    if printlog:print('匹配到技能选择图标,sco:', maxsco_jnxz)
    
    # 区域截图保存到本地查看效果
    nowtime = datetime.datetime.now().strftime('%Y%m%d_%H%M%S')
    dir_jnxz = osp.join(dstfo2, nowtime+'_jnxz_'+str(gamei).zfill(3)+'.png')
    dir_ico = osp.join(dstfo2, nowtime+'_ico_'+str(gamei).zfill(3)+'.png')
    dir_txt = osp.join(dstfo2, nowtime+'_txt_'+str(gamei).zfill(3)+'.png')
    dir_jy = osp.join(dstfo2, nowtime+'_jydl_'+str(gamei).zfill(3)+'.png')

    randfloat3 = np.random.uniform(0.1, 0.25)
    time.sleep(randfloat3) # 选技能之前延迟一下
    # pyautogui.click((jn_ico_xmin+5,jn_ico_ymin+5)) # 不断点击技能选择
    
    # 能索引,查get_jn_names()中的字典可知9为枪械,15,20为x,y坐标,0.95为对应的匹配分数
    matched_jn_ptscos = match_jineng(roi_jn_ico, all_ico_templs)
    if printlog:
        for idx_jn, ptsco in matched_jn_ptscos.items():
            print('>>>matched_jn_ptscos:', idx_jn, ptsco)
        print()
    
    # 开始正式根据技能的优先级进行点击,click_pts_3jn在前面已经做过坐标随机偏移了
    click_pts = click_prior_jn(matched_jn_ptscos, click_pts_3jn, roi_jn_ico)
    if printlog:print()
    
    pyautogui.click(click_pts)
    if printlog:print('click_pts:', click_pts)
    
# 开始匹配返回按钮
screen2 = pyautogui.screenshot()
screen2 = np.array(screen2).astype(np.uint8)
work_roi = screen2[work_ymin:work_ymin+work_h, work_xmin:work_xmin+work_w]
matpts2, maxsco2 = match_template(work_roi, temp_return)
if debug and saveResImg:
    cv2.imwrite(osp.join(dstfo, 'work_roi'+str(i)+'.png'), work_roi)

# print('匹配返回maxsco2:', i, maxsco2)
if maxsco2<matthre:
    continue # 没有找到返回按钮
else:
    # print('找到返回按钮')
    return_ptx = matpts2[0] + int(temp2W/2) + work_xmin # 注意需要映射回全原图的坐标
    return_pty = matpts2[1] + int(temp2H/2) + work_ymin
    randfloat7 = np.random.uniform(0.8, 1)
    time.sleep(randfloat7)
    if simulate: 
        print('AAAAA点击返回')
    else: 
        # 对一局游戏完成的界面进行截图
        if debug and saveResImg:
            screen_return = pyautogui.screenshot()
            screen_return = np.array(screen_return).astype(np.uint8)
            work3_roi = screen_return[work3_ymin:work3_ymin+work3_h, work3_xmin:work3_xmin+work3_w] # 整个游戏界面
            nowtime = datetime.datetime.now().strftime('%Y%m%d_%H%M%S')
            name3 = 'ResImg_'+nowtime+'_'+str(gamei).zfill(3)+'.png'
            dimdir3 = osp.join(dstfo2, name3)
            cv2.imwrite(dimdir3, work3_roi)
            
        return_ptxi = np.random.randint(return_ptx-5,return_ptx+5)
        return_ptyi = np.random.randint(return_pty-5,return_pty+5)
        if printlog:print('点击返回游戏的位置:', return_ptxi, return_ptyi)
        pyautogui.click((return_ptxi, return_ptyi)) # 点击返回退出游戏

更高级的远征版本的思路基本也是一致的,就是很多细小的匹配需要自己封装函数和类,便于频繁调用。因为代码设计到识别,所以对电脑的性能还是有一定要求的,十年前的笔记本估计是用不起来,新版本可以参考这里V8.223 https://wwapw.lanzouu.com/ioeSU3crtmfe

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐