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*算法,大家有兴趣的可以自己去实现一下.

本站部分内容由互联网用户自发贡献,该文观点仅代表作者本人,本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如发现本站有涉嫌抄袭侵权/违法违规等内容,请联系我们举报!一经查实,本站将立刻删除。

相关推荐

  • 网上有什么简单的赚钱方法(16岁学生手机兼职日结)

    在网络上赚钱,首先要有自己的定位,这也是看我文章的朋友们问得最多的问题:做什么项目好? 我先总结一下,网上都有哪些赚钱的方式呢? 我觉得无非就4种:1、卖体力;2、卖产品;3、卖服务;4、卖广告。 当然了,还有一种,就是投资,这个需要有一定的资金支撑,这个不是我擅长的,所以我就不多说了。 1、什么是卖体力? 举个例子,我之前写过一篇关于游戏试玩的文章《在家玩…

    2022-01-09
  • 淘宝联盟峰会记录,解说淘宝联盟峰会

    下午1点,我准时来到2019年淘宝联盟的峰会现场, 这回不敢迟到了,去年在上海,迟到了差点没让进,还是托了混个脸熟才进去的,跟我同时到的其它人,都没给进,联盟的峰会安检,历年来都是很严格的。 今年,峰会的主题是:与时代,共生长。 (淘宝联盟总经理刘华雷) 我回顾了18年峰会的主题是:开放共建,生态繁荣。 近两年主题是非常一致的,核心点就是更加开放,共同成长。…

    2022-04-30
  • 如何赚钱农业发家致富,农业怎样致富

    农村搞种植就像经商一样,有赚钱的也有不赚钱的,有的守着几十亩地,一年到头也赚不了几个钱,有的只有几亩地,一年收入十几万却很轻松,而有的靠承包别人的土地一年收入几十万、上百万的也大有人在,赔钱的也不在少数。搞农业种植不容易,关键看你怎么干,下面四个农业种植的真实案例会让你明白,你做对了吗? 案例一 夫妻俩种植木耳菜,一年种两茬,五亩地收入6万元 这是笔者邻村的…

    2022-04-24 创业项目
  • 刺死辱母者案(山东聊城辱母案判决)

    2020年11月18日上午11点半,得知自己减刑释放的于欢还没缓过神来,被送到了冠县高速路口,妈妈、姐姐、姑姑和姑父已在路口候他多时。 几个小时前,山东聊城市中级人民法院作出刑事裁定书,认定于欢在服刑期间能够认罪悔罪,接受教育改造,积极参加各项学习,完成劳动任务,受到表扬奖励6次,决定减去余刑,提前5个多月被释放。 2016年4月14日,山东冠县女企业家苏银…

    2023-08-13
  • 北京灵异事件(娘娘庙的灵异事件)

    “娘娘庙事件”作为风水灵异事件之一,一直为人所津津乐道。连百度百科都有她的一席之地。 经过是这样的 北顶娘娘庙始建于明宣德年间,是北京城中轴线北延长线上的标志性建筑,是北京城著名的五座泰山神庙(俗称五顶)之一。曾在清乾隆年间整修。 第二天,还发生了一些更离奇的事件,在水立方的施工现场,挖掘到一个巨大的洞穴,发现里面竟然全是活蛇! 最后政府决定“保留这座具有文…

    2023-08-08
  • 兰芝水库系列怎么样(兰芝水库面霜怎么样)

    一、兰芝水库系列产品特点1. 天然成分:兰芝水库系列产品均以天然成分为主,无添加香料、色素等致敏物质,降低了过敏风险,适合各类肌肤使用。3. 保湿效果:兰芝水库系列产品在保湿方面表现出色,能够为肌肤提供长时间的水分供应,改善肌肤干燥问题。4. 修护功效:兰芝水库系列产品具有修复肌肤屏障、提高肌肤抵抗力的作用,有助于维持肌肤的健康状态。二、兰芝水库面霜成分分析…

    2024-03-24
  • 别瞧不起摆地摊的小生意(摆地摊赚钱真实经历)

    一开始以为路边摊都很挣钱,但我摆了一个月的地摊,钱没赚到不说,还亏了1万多块钱。接下来我就说一下自己在路边摆摊的真实经历,希望能够给那些想要摆摊的人一点经验。 以前我是在一个工厂里做装卸工,平均下来一个月的工资也有6000多块钱,有一次下班时和同事嬉闹不小心把腿给摔骨折了,医生建议至少要休养两三个月的时间。不上班在大城市生活开销还是蛮大的,所以我就拿着工厂补…

    2022-01-13 投稿
  • 杭州海底世界团购,杭州哪个海洋馆比较好

    10月21日,位于南山路上的杭州海底世界在其公众号上发布了推文,推文宣布因租约到期,杭州海底世界将于2021年11月1日正式关闭。记者联系了此前采访时对接的杭州海底世界工作人员,被告知“已经离职”。 与被网友戏称“西湖边的迪士尼”的杭州市青少年宫一样,杭州海底世界位于市区,出行方便,不少杭州家长会带孩子去那里看看海洋动物,学习海洋知识。 从1999年到202…

    2023-08-11
  • 无人区好看吗(无人区日落血河好看吗)

    现在随着社会发展人们的生活都变得越来越好,收入水平也都提高了。除了生活最基本的花费以外,人们也能负担起更多享受方面的花费了。于是很多人纷纷踏出家门当起了背包客。有些人出门旅行就喜欢看些秀丽的山山水水,也有些人出门玩就喜欢挑惊险刺激的地方。今天我们就来说一说中国最神秘莫测的四大无人区,一个比一个漂亮,不知道你曾经去过这些地方吗? 一、罗布泊无人区 罗布泊无人区…

    2023-06-01 投稿
  • 如何关闭花呗功能(支付宝花呗关闭方法)

    最近有粉丝朋友在后台吐槽,打算将支付宝花呗关了,我是月月还,月月还不完,小日子没法过了,请问支付宝花呗怎么关闭啊。其实,花呗对于大多数人来说是好东西,这月消费下月还,金额比较大的话,我们可以多放余额宝一个月,相当于能褥点羊毛。 花呗不要利息,使用很方便,但前提是需要有自制力。对于平时习惯了月月剁手的重度消费用户群体来说,花呗有时候确实也会带来一些烦恼,下面小…

    2021-12-05