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)

相关推荐

  • 那不勒斯队长顺序

    各位粉丝朋友们早上好,我是阿胜。 今天又是新的一周,酬勤一波,不休息来继续更新![奋斗] 我们来聊一聊意甲的卡利亚里和那不勒斯 今天的主角那不勒斯也是在前几天刚刚参加了欧战的,相信那场和巴萨的比赛大家还是有印象的。这场比赛阿胜也是全程看完,就单场比赛所展现出来的内容,我觉得对于考察那不勒斯近期状态是很有价值的。其实也很建议没看过那场比赛的朋友可以去看看录像,…

    2022-05-01 投稿
  • 网上如何免费做广告(网上做广告宣传)

    对一个专注于网络营销服务的公司来说,肯定有很多网络推广的途径和要点,但是每个公司都有自己的特点,应该引用不同的推广方法来达到推广的目的。今天,小编给大家分享一下免费网站推广的途径和方法。 1.自媒体平台软文推广。 如今有许多自媒体平台都可以进行文章推广,如果我们想做平台推广,一定要有大量的文章或原创文章来吸引流量,如果我们发一些低质量的文章,会导致我们在平台…

    2021-11-16
  • utf-8编码和gbk编码,如何查看linux系统编码

    在一些文字处理中,很容易看到一些文件的乱码,比如   乱码,指的是由于本地计算机在用文本编辑器打开源文件时,使用了不相应字符集而造成部分或所有字符无法被阅读的一系列字符。造成其结果的原因是多种多样的。 举个最简单的例子,我在纸上写上cache,有的人理解为”擦车”,有的人理解为”缓冲”,有的人理解为&…

    2023-07-04
  • 一个人可以单干的暴利项目(没人注意的暴利行业)

    大家好,我是在经历创业失败之后休息了半年的样子,然后去上两个月班,觉得没意义,没意思,我就回到家里自己做一个自由职业者。   这次给大家说一下,我具体是做什么工作,如果能做到一个月入3万这样子,其实说的还是有点保守了,现在已经不止这个数。 我大概一共有三个主要收入,还有三四种不稳定的一种收入吧,这三个项目有一个固定的5000的,一个收入是包含在小公…

    2021-11-28
  • 定向营销是什么意思(定向市场营销是什么意思)

    如今,客户可以被商家打上了数千个标签,消费者画像正变得日渐清晰。但同时,消费者的注意力也被海量信息所稀释,变得越来越宝贵。那么在算法时代,广告投放到底是更有效了,还是更低效了呢?在市场竞争的格局下,我们会预期商家采取怎样的营销策略?这又会对消费者福利有何影响? 北京大学光华管理学院应用经济学系助理教授刘烁及其合作者Andreas Hefti对此展开了相关研究…

    2021-12-02
  • 公益广告的作用,企业公益宣传片的特点

    一家公司发展不仅仅要求获取商业经济利益,当其出具规模时,也应当积极参与社会公益中,这也是大企业应该去承担的社会责任。现在已有很多知名公司制作企业公益宣传片,它不同于一般的商业广告宣传片,所以它有着独特的特点。那么,公益类企业宣传片制作有哪些特点?对企业又多大的影响力呢? 一、企业公益宣传片的特点 1、 非盈利性 非营利性是企业公益宣传片制作最本质的特征,它不…

    2023-02-02
  • 负债百万如何走出困境?欠债之后的正确做法

    万物都有其运作规律。金钱其实就要像一个人一样。你和它处好了关系,它就愿意一直留在你身边。当你和它的关系降到零度以下的时候,你就自然而然欠债了。 所有负债的人都是和金钱处不好关系的人。问他对金钱的感觉是什么?他更多的是恐惧和愤怒。而不是喜悦,开心。 恐惧和愤怒就是的负债的原罪。它们会让你陷在债务的沼泽里爬不出来。 你会发现怎么努力,早起晚归,把身体努力到垮掉都…

    2022-06-07 投稿
  • 哪家的卡流量多又便宜(流量卡哪家运营商便宜)

    【手机中国 新闻】如果说之前的三星一直有些高冷,那我想如今这家厂商已足够接地气了。 为何这么说?君不见三星和联通偷偷联手搞出个“星粉卡”,一时间令包括大王卡在内的一众流量卡黯然失色。不过可惜的是,在3月16日上线后,该卡会采取限时限量发售的模式,并且仅限三星用户。 (图片源自微博) 不过讲道理,这波操作没得说,三星给自家粉丝出的福利卡,当然不能便宜了别家用户…

    2023-05-30
  • 如何让搜索引擎收录网站(百度的核心能力有哪些)

    我们知道对于任何一个搜索引擎而言,每天都可能存在一些基础性的算法调整,用于优化线上的搜索结果,从而提供更好的搜索体验。 这让很多SEO人员,总是捉摸不透,前一段时间,我刚刚利用的SEO策略,近期可能就不是那么有效,这对于时效性比较高要求的SEO行业,很是考验。 但我们知道,即使搜索引擎算法在调整,总是有一些基础性的原理是不会改变的,因此,我们只要专注把这几项…

    2022-01-03
  • 索尼vaio型号大全,现在的vaio值得买吗

    一、写在前面了解笔记本电脑产品的同学,对于VAIO这个系列一定不会陌生。它代表的是SONY引以为傲的工业设计水准。2014年VAIO开始了独立运营,但产品质量依旧优异可靠。自2017年8月重新回归中国市场后,也陆陆续续推出了众多的笔记本电脑产品,如S13、SX14。 我印象里面最深刻的就是诺贝尔文学奖得主——莫言的采访视频中,曾经出现了一款外观小巧的VAIO…

    2023-07-09 投稿
  • 衣服上的油渍怎么洗掉,衣服上的油渍怎么洗掉小窍门

    在所有可能的洗衣问题中,油脂和油渍是最令人讨厌的。这些斑点不仅看起来像你衣服上的拇指酸痛一样突出;众所周知,它们也很难去除。 根据宝洁公司的高级科学家劳拉古德曼的说法,这些污渍的弹性要归功于基本的化学反应。大多数油脂和油在室温下是半固体或固体,这意味着去除需要温水或热水。它还取决于织物:古德曼说聚酯等合成纤维特别难以处理,因为油脂和油会被它们吸引。由于合成纤…

    2022-04-20 投稿
  • 为什么网络老是掉线(为什么笔记本网络老是掉线)

    大家好,这里是@实用数码笔记,分享各种实用的数码小技巧,期待您的点赞关注。 当下网络已经普及千家万户,笔记菌所在的小区百兆宽带已成为标配,可问题也随之而来。 不知道大家有没有发现,有时候在家看小说/刷剧/玩游戏,正在兴头上,突然网络就中断,或者变得很慢。 网络中断 这究竟是为什么呢? 又该如何确认是哪里出问题了呢? 其实无非是以下情况: 情况一、 您所打开…

    2023-05-31 投稿