dnf外挂教程(dnf脚本制作教程)

最近刷了一段时间提灯与地下城这个游戏,太肝了,毛都干没了,于是想制作一个替我刷图的脚本,说干就干,总结下思路。

总思路是 识别当前地图 –> 与地图中可以交互的点交互 —>识别当前地图。

当然这种是比较简单的思路,后期可以拓展。

准备

思路是使用opencv识别人物,道具和怪物等元素,但是考虑到怪物种类不一而足,素材收集也非一日之功,于是转换思路,从小地图入手,小地图的图标是种类固定的,像这样:

使用golang gocv制作提灯与地下城的自动刷图脚本,解放双手
buff

使用golang gocv制作提灯与地下城的自动刷图脚本,解放双手
怪物

使用golang gocv制作提灯与地下城的自动刷图脚本,解放双手
出口

使用golang gocv制作提灯与地下城的自动刷图脚本,解放双手
青蛙

使用golang gocv制作提灯与地下城的自动刷图脚本,解放双手
宝石

使用golang gocv制作提灯与地下城的自动刷图脚本,解放双手
金币

这里注意,采集到的图标需要和手机或者模拟器的图标一一对应。小地图的图片可以通过adb screencap命令获取或者minicap也是可以的。

首先观察小地图的长框可以发现是275 x 275,进一步观察可以发现分为11*11的格子,然而上面两格比较容易匹配出错,所以我们可以用一个11×9的整数数组来表示地图分布:

使用golang gocv制作提灯与地下城的自动刷图脚本,解放双手
地图等分

func GetDevidedCentralPoint(piecesX ,piecesY int,src gocv.Mat)[][]int{

	//formed up a vector of (11-2)*11

  //use line to devide the map picture into 9x11 pieces

	width:=src.Cols()

	height:=src.Rows()

	lgr.Debug("width:%v height:%v",width,height)

	WPP:=width/piecesY

	HPP:=height/piecesX

	res:=make([][]int,piecesX)

	green := color.RGBA{0, 255, 0, 0}

	for i:=0;i<piecesX;i++{

		resInY:=make([]int,piecesY)

		

		for j:=0;j<piecesY;j++{

			Img,err:=src.ToImage()

			if err!=nil{

				lgr.Debug("Transform to image failed,err:",err)

			}else{

				colour:=Img.At(WPP*j+WPP/2,HPP*i+HPP/2)

				pt:=image.Point{WPP*j+WPP/2,HPP*i+HPP/2}

				str:=fmt.Sprintf("%v",j)

				gocv.PutText(&src,str,pt,gocv.FontHersheySimplex,0.5,green,1)

				r,g,b,_:=colour.RGBA()

				

				if (uint8(r)>20 && uint8(g)>20 && uint8(b)>20){

					//lgr.Debug("current point(%v,[%d,%v,%v]) color is : %v",pt,uint8(r),uint8(g),uint8(b),colour)

					//gocv.Circle(&src,pt,2,green,1)

					resInY[j]=1

					

				}else{

					resInY[j]=0

				}

				

			}

			

			}

			res[i]=resInY

	}

	return res

}

然后再分别匹配上面收集的图标,匹配到就将地图数组中对应的位置改为相应的数字,定义如下:


使用golang gocv制作提灯与地下城的自动刷图脚本,解放双手

 

/*-1 for store, 0 for unknow status, 1 for path, 2 for hero,3 for exit,4 for gold,5 for pet ,6 for enermys ,7 for iron box,8 for red box,9 for buff , 13 for frog,-2 for goldbox,-3 for temple, */

const heroImg= "./asset/hero.jpg"

const enermyImg= "./asset/enermy.jpg"

const exitImg= "./asset/exit.jpg"

const goldImg= "./asset/gold.jpg"

const gemImg= "./asset/gem.jpg"

const redboxImg= "./asset/redbox.jpg"

const templeImg= "./asset/temple.jpg"

const IronboxImg= "./asset/Ironbox.jpg"

const buffImg= "./asset/buff.jpg"

const petImg= "./asset/pet.jpg"

const pet1Img= "./asset/pet1.jpg"

const pet2Img= "./asset/pet2.jpg"

const pet3Img= "./asset/pet3.jpg"

const frogImg= "./asset/frog.jpg"

const selectorImg= "./asset/selector.jpg"

const storeImg= "./asset/store.jpg"

const goldboxImg= "./asset/goldbox.jpg"

const canceImg= "./asset/cancel.jpg"

const piecesX=9

const piecesY=11

然后,将采集到的地图元素与当前地图一一匹配,使用的方法是之前提过的gocv.MatchTemplate()方法,然后使用gocv.MinMaxLoc()得到可信度和对应的坐标,代码如下:

func MatchTarget(imgTempl,imgSrc ,imgSrc1 gocv.Mat,type_ int ,res [][]int){  

    

    result:=gocv.NewMat()

    defer result.Close()

    m :=gocv.NewMat()

    

    blue := color.RGBA{0, 0, 255, 0}

    gocv.MatchTemplate(imgTempl,imgSrc,&result,gocv.TmCcoeffNormed,m)

    //gocv.MatchTemplate(imgTempl,imgSrc,&result,1,m)

    m.Close()

    minValue,maxConfidence,_,maxLoc :=gocv.MinMaxLoc(result)

    if maxConfidence < 0.9 {

        lgr.Debug("Max confidence of %f is too low. MatchTemplate could not find template in scene.", maxConfidence)

        return

    }

	

    width:=imgSrc.Cols()

	height:=imgSrc.Rows()

	

	WPP:=width/piecesY

	HPP:=height/piecesX

	

	

    for {

        //lgr.Debug("The most possible location is : %v,value is : %v",maxLoc,maxConfidence)

        rect:=image.Rect(maxLoc.X,maxLoc.Y,maxLoc.X+imgTempl.Cols(),maxLoc.Y+imgTempl.Rows())

		indx:=(maxLoc.X+imgTempl.Cols()/2)/WPP

		indy:=(maxLoc.Y+imgTempl.Rows()/2)/HPP

        pt:=image.Pt(indy,indx)

        lgr.Debug("x:%v ,y:%v  %v,type:%v",indy,indx,maxLoc,type_)

        if type_==2{

            HeroPosition=pt

        }

		res[indy][indx]=type_

        if type_==3{

			ExitPosition=pt

            Dtm:=time.Since(starttime)

            wtm:=time.Duration(10)*time.Minute

            kc:=40

            if killedCnt<kc&&Dtm<wtm&&!IsFirstFloor{

                res[indy][indx]=0

            }

        }

        if type_==-1{

            IsFirstFloor=true

        }

        gocv.Rectangle(&imgSrc1, rect, blue, 1)

        //lgr.Debug("outer result adress:%v",result)

        maxLoc,maxConfidence=GetNextMaxLoc(result,maxLoc,minValue,imgTempl.Cols(),imgTempl.Rows())

		

        if maxConfidence<0.9{

            break

        }

    

    }

    

   

  }

  

func GetNextMaxLoc(result gocv.Mat,maxLoc image.Point,minValue float32,templateW,templateH int)(image.Point,float32){

    startX:=maxLoc.X-templateW

    startY:=maxLoc.Y-templateH

    endX :=maxLoc.X + templateW

    endY :=maxLoc.Y + templateH

    //lgr.Debug("Inner result adress:%v",result)

    

    if startX<0 || startY <0 {

        startX = 0

        startY = 0

    }

    if endX >result.Cols()-1 || endY > result.Rows()-1{

        endX=result.Cols()-1

        endY=result.Rows()-1

    }

    

    for y:=startY;y<endY;y++{

        for x:=startX;x<endX;x++{

            //ret:=result.GetFloatAt(y,x)

            //lgr.Debug("Get point (%v,%v) to %v",x,y,ret)

        

            result.SetFloatAt(y,x,minValue)

            //ret:=result.GetFloatAt(y,x)

            //lgr.Debug("set point (%v,%v) to %v",x,y,ret)

        }

    }

    

    _,maxConfidence,_,maxLoc :=gocv.MinMaxLoc(result)

    lgr.Debug("the point %v is max confidence point %v",maxLoc,maxConfidence)

    return maxLoc,maxConfidence

}

对每一个地图元素,调用MatchTarget 方法来刷新当前地图数组[][]rest,最后就得到了当前的地图元素。

然后就是寻路的算法,我自己使用的是A*算法,大家有兴趣的可以自己去实现一下.

本文来自投稿,不代表展天博客立场,如若转载,请注明出处:https://www.me900.com/14724.html

(0)

相关推荐

  • 怎样充q币划算(什么平台充值q币最便宜)

    此前,云闪付就和微信达成“共识”,云闪付用户可以通过扫描个人微信收款码完成支付,实现条码互联互通。从此,微信里算是多了一条可选的路,碰到微信余额不足的情况也不需要到处提钱周转了。此外,手机淘宝App也增加了云闪付的支付方式,消费者的支付选择也更加灵活自由了。   一直以来,由于独立的资金体系、生态圈以及竞争关系等,支付工具之间都是以独立的形式存在。…

    2021-11-28
  • 电信卡免流app(电信卡免流app怎么查)

    爱上抖音,其实就是爱上记录与分享生活中的美好瞬间。相信对于热爱生活的你们来说,将美好记录、分享的过程也是让快乐和温情加倍的体验~ 然而,美好无限,流量却有限。之前总有小伙伴偷偷私信我们,说自从习惯了用视频记录和分享生活之后,每个月的流量都不够用了! 为了让大家能够无所顾虑地、随时随地留住每一个美好的时刻,抖音特别联合中国电信推出“抖音无限流量卡”,全网流量尽…

    2023-05-28
  • 三元牛奶怎么样,三元牛奶怎么样排名第几

    12月9日,2021凤凰网“挑战与变革——展望科技未来”科技峰会盛大开幕。三元极致牛奶通过凰家评测硬核、专业、真诚的检验,被评为牛奶类别2021凰家评测年度好物,成为乳品类唯一上榜产品。 凰家评测是凤凰网旗下专注各品类产品评测及科普的王牌栏目,坚持用硬核态度,做有料评测的品牌理念,定位于高质量、专业认真的评测产品。2021年,凰家评测选择了22款市售国内外品…

    2022-04-16
  • 无线网络密码破解器,无线网络改密码

    《关于无线网络密码破解器的探索与思考》 一、无线网络密码破解器的概念与原理 无线网络密码破解器,从字面上理解,也许就是一种能够破解无线网络密码的工具。它的原理可能是通过各种技术手段,对无线网络中的信号进行分析和探测,试图获取密码的相关信息。 就好像我们在黑暗中摸索,无线网络密码破解器就像是一个带有特殊感知能力的工具,它能够感知到无线网络中的各种信号和数据,然…

    2025-09-30
  • 软文论坛怎么发表(论坛推广软文案例)

    软文营销可以说是最基本的网络营销方法之一,他看起来很普通,但是只要将软文营销做好你会发现它要比很多硬广营销效果更好,这也是为什么很多大企业不愿意放弃软文营销一个重要原因。很多营销人员不知道,软文广告经典案例300字怎么写,为了帮助到大家,下面资深文案策划人员为大家介绍。     1、软文关键词   软文广告经典案例300字怎么写?在撰写软文时首先需…

    2022-03-12
  • 相册名称一套,工作纪念相册怎么做

    工作是我们每个人一生中重要的一部分经历,以工作经历来制作工作留念相册,无论是作为礼物送给领导或同事还是作为个人收藏留念,都是很有意义的。之前分享的工作相册制作方法,结合本文,给大家分享一些工作留念相册的制作方法。 1、收集素材制作一本工作留念相册素材是不可或缺的,这里素材主要以相片为主,围绕工作留念相册的主人翁收集。照片主要分为团体照和个人照,可以是日常工作…

    2023-06-30
  • 如何瘦大腿,小腿粗怎么办怎么才能瘦腿视频

    夏天啦,很多宝宝跟赛普君吐槽说不喜欢穿裙子,就是因为腿不好看 太粗,太弯。。。那为啥不去健身呢?大家都说没时间 今天赛普君就给大家推荐一组在家里就能练习的腿部塑形课程,可不要再找借口哦 一共9个动作,在家就可以练,地板上,床上,沙发上都行。 因为动作幅度都很小,可以在睡前练习。每个动作拉伸30秒。 瘦腿塑形动作一: 瘦腿塑形动作二: 瘦腿塑形动作三: 瘦腿塑…

    2023-06-28 投稿
  • 七夕送男友什么礼物最有意义(七夕送男友什么礼物最有意义即将结婚)

    “不屑一顾于先生,随处可见乔晶晶”,这几天小编快被“荣耀夫妇”给甜哭,简直太爱这对了,不愧是顾漫大大的小说改编。相信不止是小编,应该有很多人也没逃过荣耀夫妇的“蛊惑”,甚至可以说是陷进去了。 那么说起甜甜的恋爱,七夕节也距离我们又近了一步,前几天小编给各位男士推荐了几款适合送女友的七夕礼物,今天我就来和大家分享一些适合送男士的七夕礼物,千万别错过哦! 香水?…

    2023-05-25 投稿
  • 餐饮新店开业推广方案(新店开业怎么做营销)

    一、宣传目的: “XX”是一家集中西餐饮、豪华KTV、足浴、保健推拿、专业美容美发、棋牌娱乐、咖啡语茶等汇于一体,为成都市独特的一家高档次、高品位的餐饮休闲娱乐行业,引领着成都餐饮休闲娱乐新潮流。现开业在即,如何确保“首战必胜”是所有新生项目的首要问题,对于“XX”来说,开业时的兴衰决定了“XX”的命运。为了确保“首战必胜”,不同的项目遇到的症结也有所不同。…

    2022-01-03
  • 秦始皇陵墓修建死了多少人,秦始皇陵有多少人陪葬

    重磅消息!考古学家在秦始皇帝陵陪葬墓中,发掘出大量的文物,填补了秦代高**墓葬考古的空白,是秦始皇帝陵考古的又一重大收获。 秦始皇是秦国第一个皇帝,也是首次完成中国大一统的政治人物,在我国历史中地位非常高。不仅如此,秦始皇本人对陵墓也非常重视,因此修建的陵墓规格也非常高,只是现如今秦始皇地宫还没有被发掘,只发掘了兵马俑。 尽管秦始皇地宫还没有发掘,但兵马俑的…

    2022-03-18 投稿
  • 拍照效果最好的手机排行(国产手机拍照效果排行)

    截至目前今年上半年的旗舰手机基本已经发布的差不多了,不难发现这些旗舰机型在影像方面都有出色的表现,在笔者看来,当短视频开始流行之后全民影像时代已正式开启。因此,在上半年的新机比拼当作,各家厂商如“八仙过海”般的“各显神通”,推出了多款让我们影像深刻的影像旗舰,那在这么多款机型中哪款拍照手机热度最高呢?   近日,中关村发布了2021年5月拍照手机热…

    2022-01-02 投稿
  • 中国最有前途的行业,国内最有前途的行业

    距离高考还有75天,很多考生和家长都开始考虑专业和院校,那么你知道现在比较热门的专业有哪些吗?   接下来,就带大家了解工学、理学、法学、文学、医学、经济学这六大类51个热门专业,篇幅较长,建议大家收藏分享,方便随时查阅。 第一章   工学类专业   工学大类包括力学类、机械类、材料类、计算机类、土木类等专业类别,范围及其广泛,…

    2022-04-24