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

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

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

(0)

相关推荐

  • 百度云超级会员试用1天(百度云盘试用活动)

    最近百度网盘低调上线了单次付费功能,5分钟全速下载收费2.9元,24小时全天不限速收费5.9元。针对饱受网友诟病的非会员限速问题,这会是一个好的解决办法吗?为了找到答案,小编亲自体验了刚刚上线的单次付费功能。 首先来看下非付费用户的下载速度,我们找来一个未开通会员的百度网盘账号,随机选取一个文件进行下载,下载速度约为100kb/s。 随后开启超级会员试用通道…

    2022-05-26 投稿
  • 纸箱分为哪几种纸板(常见的几种纸箱检验标准)

        1 瓦楞纸   1、是以优质麦草为原料采用无污染制浆工艺加#11 美废生产高强瓦楞原纸的企业,代表企业是山东永发纸业有限公司,其主要纸箱纸板用户分布在华北、华东等地的高中档纸箱纸板生产线以及一些强度要求高的单面机企业。由于麦草资源相对丰富,价格将有所松动,企业生产成本将有所下降,产品竞争力将明显提高。 2、是以美废(及俄…

    2022-05-11 投稿
  • 世界十大悍匪排行榜(世界十大悍匪排行榜详情)

    第一个就是白宝山,他1958年出生在北京,长大之后因为偷窃被判处12年的徒刑。在出狱之后白宝山更加猖狂,在2年之间杀害了15个人,抢劫无数。到1997年被抓,随后被判处死刑。   第二个叫做呼兰大侠,这并不是一个人名。而是因为1986年的时候,在黑龙江呼兰县的一座公检家属楼,有53个人被杀,而且在墙上留下了“呼兰大侠”的名字。到今天为止,这名“呼兰…

    2021-11-28 投稿
  • 中国打击乐器图片及名称(中国打击乐器的名称)

    我国有许多传统乐器。他们以悠久的历史,优美的音调和丰富的曲调而著称。以下是我国十大传统乐器的,一起来看一看吧。 1.鼓 鼓是中国传统的打击乐器。它具有很强的共鸣感,声音可以传到很远的地方,因此鼓成为提高士兵士气的绝佳工具。据说黄帝以前是用兽皮打鼓的,在与蚩佑的战争中为他的军队加油打气。 根据《礼记》,粘土鼓是在古代出现的。但是,它主要用作祭祀工具连接人类世界…

    2021-12-16 投稿
  • 醋酸铅反应的现象,醋酸铅沉淀反应原理

    醋酸铅是沉淀吗?这是一个很有意思的问题,让我们一起来探究一下吧。 首先,我们要知道什么是沉淀。沉淀是指一种物质在溶液中不能溶解或者溶解度很低,而以固体的形式分离出来的现象。例如,当我们把氯化钠(食盐)和硫酸铜(蓝色晶体)的溶液混合在一起时,就会出现白色的固体,这就是沉淀反应的结果。这个白色的固体就是沉淀,它的化学式是氯化铜。 那么,醋酸铅是不是沉淀呢?要回答…

    2023-07-07
  • 启牛商学院理财靠谱吗,是真的理财产品吗

    只需12元,实现理财收入比工资还高?据央视财经1月18日报道,打着廉价名义的微淼财商课,实则是贩卖焦虑,向学员推荐6998元的课程。学员付费之后才发现直播变成录播,课程也涉嫌注水,“货不对版”。而所谓“专业从业人员”的微淼讲师,甚至不需要相关从业资质。 令人咋舌的是,微淼的授课老师经常声称,通过分析公司财报的方式,可以得出某些公司股票适合购买的结论,甚至帮学…

    2022-04-22 投稿
  • 为什么抖音号会被永久封禁(什么情况下抖音会被永久封禁)

    在抖音平台上面,肯定也需要先去了解一下平台的规则,并且在经营账号的时候也要遵守规则,如果不小心被永久封禁了,这种情况下,卖家们自然也是想要了解需要多久才能够恢复正常呢? 抖音账号被永久封禁是没有办法自己恢复正常的,如果有时间限制的话上面有时间显示,一般时间到啦才能恢复正常。 这时候只能是通过官方进行申诉,有两个途径可以进行申诉,一个是我们收到账号评级通知的地…

    2022-03-14
  • videofk(videofk视频在线解析下载)

    1:腾讯设计导航 腾讯出品的设计导航网站,主要分为两个部分:左边的设计网站汇总导航,以及右边的优秀设计作品文章精选。 大厂出品的,品质还是很有保障的,不管是设计行业、新媒体行业的朋友们,还是打算往这方面发展的朋友,都可以上去看看。 3:iLoveIMG 一个免费的在线图片处理网站,几乎包含了所有的图片的编辑操作功能。对于电脑上没有安装PS、AI这些图片处理软…

    2023-03-29
  • 什么游戏可以赚钱真实可靠(自媒体赚钱方法)

    现在是一个大众赚钱的时代。很多人在一边上班的时候一边弄兼职就赚了比上班还高的钱。那你说你是朝九晚五的工作家里有网,想通过手机和电脑赚钱,那有哪些渠道呢?主要有以下五个方式可以赚钱。 第一个方式是通过自媒体赚钱,这里的自媒体,我们仅仅理解为写文章。你只要会写文章,就可以在各个自媒体平台像今日展天博客,像百度百家,像新浪看点,网易订阅,搜狐自媒体,这些都可以来赚…

    2022-01-04
  • 计算机主题下载,主题免费下载软件

    主题信息主题名称:[全网首发]华为Mate 20 RS动态主题优化版“ 致敬时代!” 主题大小:59.7MB 主题格式:hwt 适用系统:emui3.0/3.1/4.0/4.0.x/4.1/5.0/5.1/8.0/8.1/8.2/9.0 主题数量:7个 发布时间:2018/10/18产品介绍10月16日晚,华为在伦敦举办新品发布会,除了推出华为M…

    2023-07-11 投稿
  • 熟水饮用水到底是什么意思?

    炎炎夏日,及时补水、喝水成为生活中更加重要的事。至于喝哪种水、怎么喝水,不同的人有不同的选择。有人习惯喝瓶装矿泉水、冰镇饮料,有的人则更喜欢“大热天喝热茶”,还有人认为凉白开更解渴,到底哪种水更补水呢?上周,在由人民日报社《健康时报》和中国民族卫生协会健康饮水专业委员会联合主办的第三届健康饮水(熟水)产业发展论坛上,来自相关领域的专家、学者会聚一堂,共同就传…

    投稿 2022-05-03
  • 梦幻西游神器,梦幻西游神器介绍及收集指南

    在梦幻西游中,很多日常任务除了获得随机物品奖励之外,还会获得额外的积分奖励。而玩家则可以用这些积分,兑换相应的物品。 今天,这位小伙伴就要兑换波神器积分。 第1本,腰带书。要知道,腰带书的价值,可是仅次于项链书的存在!这个开局,非常nice。 让人万万没想到的是,第4本是魔棒书、第5本是弓书、第6本是巨剑书,全部凉凉。 小伙伴们,你们觉得这位玩家的运气如何?…

    投稿 2023-05-11