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)

相关推荐

  • 卡尼尔男士洁面乳,男士控油保湿护肤品哪个牌子好

    卡尼尔男士洁面乳,男士控油保湿护肤品哪个牌子好卡尼尔男士洁面乳,男士控油保湿护肤品哪个牌子好卡尼尔男士洁面乳,男士控油保湿护肤品哪个牌子好卡尼尔男士洁面乳,男士控油保湿护肤品哪个牌子好

    现在不仅仅女士要用护肤品,男士也应该用的,谁不想自己美美哒,更年轻一点呢,男人也不例外,凡是大街上你所能遇到的精致男人,不用怀疑,都是在用护肤品护理自己肌肤的。对于男士来说,哪些护肤品能有效的控油保湿呢?小编今天给各位型男盘点出保湿控油护肤品排行榜十强,上榜的品牌依次为:悦蕾、科颜氏、欧莱雅、娇韵诗、兰芝、悠莱、欧莱雅、欧莱雅、卡尼尔,现在就跟随小编一块来看…

    2023-06-27 投稿
  • 两岸青山相对出中的出,两岸青山相对出中的出指的是什么

    两岸青山相对出中的出,两岸青山相对出中的出指的是什么两岸青山相对出中的出,两岸青山相对出中的出指的是什么两岸青山相对出中的出,两岸青山相对出中的出指的是什么两岸青山相对出中的出,两岸青山相对出中的出指的是什么

    李白似乎总是在长江边游历,这又是一首写长江上的景色的诗。   (1)诗歌背景 我在百度搜天门山,搜出来都是湖南张家界的天门山。这座山是因为在峭壁上有一个天门洞而得名的。 李白这首诗写的天门山,是位于安徽省和县与当涂县长江两岸的两座山,在江北的叫西梁山,在江南的叫东梁山,两山隔江对峙,仿佛天生的大门。 (2)诗句解析 首句“天门中断楚江开”,在史杰鹏…

    2022-03-21 投稿
  • seo千牛帮,千牛平台网址介绍

    以下是一篇关于“seo千牛帮”的文章: 一、什么是seo千牛帮? “seo千牛帮”可能是一个与搜索引擎优化(SEO)相关的工具或服务集合,也许它是为电商卖家提供的一种助力工具呢?我觉得它就像是电商领域的一位“小助手”,能在SEO方面给予一些帮助。千牛这个名字,也许和淘宝、天猫等电商平台常用的千牛工作台有一定的关联,好像是专门为电商卖家打造的一套工具体系。 在…

    2025-11-13
  • 淘宝整点聚怎么抢,淘宝整点抢券技巧什么时候点进去

    《淘宝整点聚怎么抢:全面攻略与技巧分享》 在淘宝的众多活动中,整点聚无疑是一个极具吸引力的存在,众多商品以超低价格限时抢购,让人心动不已。 然而,想要成功抢到心仪的商品,却并非易事,需要我们掌握一些技巧和策略。 那么,淘宝整点聚到底怎么抢呢?接下来,我将为大家详细介绍。 一、提前了解活动规则 想要在淘宝整点聚中抢到商品,首先要做的就是提前了解活动规则。 这包…

    2025-03-13
  • 央媒批评孙杨事件最新消息(孙杨事件最新消息 新闻)

    央媒批评孙杨事件最新消息(孙杨事件最新消息 新闻)央媒批评孙杨事件最新消息(孙杨事件最新消息 新闻)央媒批评孙杨事件最新消息(孙杨事件最新消息 新闻)央媒批评孙杨事件最新消息(孙杨事件最新消息 新闻)

    孙杨因“抗检事件”而被国际体育仲裁法庭(CAS)禁赛8年,这在世界体坛引起了巨大反响。 孙杨是奥运会三金得主,是中国男子游泳在奥运会上夺金第一人,2020年东京奥运会今年7月份将举办,原本是男子200米、400米和800米自由泳的夺金热门,不过现在看来一切都化为泡影。 此前,孙杨表示要上诉至瑞士联邦高级法院,但看完CAS公布的仲裁报告、SUN听证会完整视频之…

    2022-01-14 投稿
  • 超级搞笑笑话,四川方言超级搞笑笑话

    超级搞笑笑话,四川方言超级搞笑笑话超级搞笑笑话,四川方言超级搞笑笑话超级搞笑笑话,四川方言超级搞笑笑话超级搞笑笑话,四川方言超级搞笑笑话

    一、手机没话费,因为之前不是丢了钱包.正在补卡,身上没钱,于是找妹妹帮我冲一下,妹妹可怜巴巴的说,哥,你也知道,我是个学生,穷的一塌糊涂~然后我说,充一百,到时给你五百,嘿,妹妹办事效率还可不是盖的,我刚说完。她就立马给我冲了两百……   二、上高中时候,学校收补课费200,我想借这个机会问家里多要点。于是,我就 给爸打电话,说学校收补课费。爸问:…

    2022-05-01 投稿
  • 长颈鹿是鹿吗(长颈是鹿类生物)

    长颈鹿是鹿吗(长颈是鹿类生物)长颈鹿是鹿吗(长颈是鹿类生物)长颈鹿是鹿吗(长颈是鹿类生物)长颈鹿是鹿吗(长颈是鹿类生物)

      刚从网上看到一段科普视频,瞪大眼睛宣传鹿豚是鹿类动物,围观的人还真不少。我不生气,但很感慨。 我们先要告诉大家,鹿豚不是鹿,是猪科动物。而且顺便还要纠正如下图的很多,长颈鹿也不是鹿,小鹿犬也不是鹿,等等。   很多动物长的貌似鹿,叫的名字也带鹿字,但其实真的不是鹿类动物。 鹿与非鹿,动物学上有明确的划分标准。鹿是草食陆生偶蹄哺乳动物,…

    2022-05-08 投稿
  • 为什么流量特别卡(如何把流量变流畅)

    物联卡为什么会死卡? 用过物联卡的朋友不是都听过商家给咱们说的死卡了吗?要给你换一张流量卡。这种情况大部分商家会说,是因为运营商不可抗拒因素给用户死的卡。这句话完全是在耍流氓,跟没说没什么两样吗? 而究其原因,就是商家自己把卡给玩死了。因为物联卡明确规定禁止发往广西、云南、新疆、**这四个地区,并且禁止用它用来电信诈骗。你用的卡的号段的其中一张就发生了这种问…

    2023-05-29
  • 保税仓东西为什么便宜,国内正规的保税仓有哪些

    保税仓东西为什么便宜,国内正规的保税仓有哪些保税仓东西为什么便宜,国内正规的保税仓有哪些保税仓东西为什么便宜,国内正规的保税仓有哪些保税仓东西为什么便宜,国内正规的保税仓有哪些

    1月10日,**商品展示中心一角。 张丽君 摄 中新网南平1月10日电 (张丽君 蔡东京)“这是一款**人都知道的咖啡——古坑咖啡;这个牌子的蒟蒻很受**当地人喜欢;这款原酿的金门高梁,口感很好;这是有儿时味道的零食‘真鱿鱼’……”福建省同心创业发展集团有限公司副总经理、台商许世扬一进入同心商超,就滔滔不绝向记者介绍着**商品专区的各色美食。 1月10日,同…

    2022-03-23 投稿
  • 白色冰糖和黄色冰糖有什么区别

    白色冰糖和黄色冰糖有什么区别白色冰糖和黄色冰糖有什么区别白色冰糖和黄色冰糖有什么区别白色冰糖和黄色冰糖有什么区别

    冰糖是我们生活中常见的食材,是由白砂糖煎炼而成的结晶块,蔗糖是重要的原材料,缺一不可,平常煮粥、炖雪梨的时候,适当的放一些冰糖,可以有效提升品味,丰富口感,除此之外,冰糖中还含有大量的营养物质,有补中益气,和胃润肺的养生功效,非常受到人们的欢迎,一般都是家庭常备。 冰糖不但营养丰富,还有较强的储存优势,品质纯正的冰糖,保质期长,不易变质,在中国八大菜系中,冰…

    2022-05-09 投稿
  • 中尉军官退伍费有多少(中尉军官退伍费有多少钱)

    军官退出现役一般有三种方式:一种是计划安置,第二种是自主就业,第三种是退休。选择的方式不同,退役的补助费也不同,自主就业(不要工作)的多,安排工作和退休的少。另外,补助费还要根据级别大小来确定,级别高的补助多,级别低的补助少;具体多少,有一个测算标准,这里就不再细说,为节省大家的宝贵时间,直接介绍吧! 互卸军衔 首先,来看计划安置的能拿多少?退役补助费主要由…

    2022-03-19
  • 正规淘宝兼职(创业成功背后都有哪些故事和启示)

    今天要分享的这个创业故事里的主人公,我的一个好朋友,温州平阳某小学教师,他兼职做淘宝,从身无分文到身价千万,他只用了5年时间,也可以称为网赚名人了,在他创业成功背后都有哪些故事呢? 温州平阳某小学教师黄某,2007年毕业参加工作,分配到某乡村小学教数学。黄某家庭出生在山区农村,父母务农,家庭条件不理想。从2007分配至某乡村小学任教后,黄某也一直认真教书育人…

    2023-06-07