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)

相关推荐

  • web表单设计代码,前端表单设计

    一、背景 前端开发中涉及表单的页面非常多,看似功能简单,开发快速,实则占去了很大一部分时间。当某个表单包含元素过多时还会导致html代码过多,vue文件过大。从而不容易查找、修改和维护。为了提高开发效率及降低维护成本,下面介绍表单配置化组件的封装原理与封装方法。 二、技术方案     如上图所示,封装表单配置化组件的关键点有三个一是如何解…

    2023-07-05
  • 市场和销售哪个前景好(销售类行业那个前景好)

    销售从来不是一个低门槛的职业,他需要从业人员具备高度的智商、情商,同时还得具备坚持、勤奋、魄力、执着、能吃苦等等优秀的品质,而一个好的销售,无疑他未来的道路是越走越宽,越走越高的,80%的中小企业家都是销售出身,做一名优秀的销售你准备好了吗?接下来针对优秀销售的打造我们将开展如下的课程,希望各位认真学习! 什么是销售 优秀销售应具备的个人素质 走出销售的误区…

    2022-05-23 创业杂谈
  • 58同城万家计划发条帖子就赚12元,宝妈轻松赚钱小副业

    01 项目介绍 今天给大家拆解一个58同城的副业小项目! 项目名称:58同城万家计划! 大家都知道,58同城也是一家体量很大的互联网公司,很大一部分业务是围绕本地生活服务来展开的。 但现在美团、支付宝、抖音、快手等平台都在抢本地生活的流量,比如之前给大家拆解过的抖音团购项目。 58同城为了抢夺市场份额,自然也要花心思来竞争,而互联网公司最擅长的就是用资本的力…

    2022-05-01
  • 淘宝怎样货到付款购物(淘宝怎么货到付款买东西)

    货到付款是当你在淘宝上或者其他电子商务平台上购买商品中由快递代收商品款项的一个叫法,商品由快递先送到卖家的手上,卖家通过验收商品之后,把钱交给快递员,也就是我们中国经常说的一句俗语,一手交钱一手交货,当你将货款交付给快递员之后,货款再转入给卖方的账户。   这种方式可以让买家在接收快递员送货时,打开包装检验购买的商品,查看商品是否与商家描述一致,质…

    2021-11-28
  • 哪个调查网最赚钱最快(调查问卷赚钱平台)

    最近有想法成为自由职业者,在没有一点外界经济来源的情况下,为了生存,我想尽一切办法去搜寻赚钱的途径。在这几天疯狂搜寻赚钱途径的经历中,自己有一些感悟和想法分享给一样想赚更多钱的伙伴们。   赚钱的途径有哪些?   我在网上搜寻到的一些下载APP试玩赚钱,转发文章赚钱,做问卷调查表赚钱,分享购物链接赚钱,做地图标记赚钱,回答各平台问题赚钱,…

    2021-12-30
  • 本地连接受限制或无连接怎么办,dns设置哪个最好最快

    hit2台服是一款由韩游公司nexon开发一款可以搬砖的角色扮演动作游戏,hit2台服里面的游戏角色也比较多,玩家们可以根据自己的爱好来选择合适的角色进行游玩。hit2台服在5月23日开启公测,有很多玩家们向小编询问hit2台服进不去/打不开怎么办,接下来就让小编来告诉大家怎么去解决hit2台服进不去的解决方法。 hit2台服进不去/打不开的解决方法 方法一…

    2023-06-25
  • 怎样通过自媒体赚钱(什么是自媒体运营是怎么赚钱的)

    许多自媒体人有了一定粉丝就想赚钱,但他们不知道如何赚钱。实际上,自媒体有很多方法可以赚钱,而且收入挺不错的,只要你有足够的粉丝,利润就不是问题。   一、提高影响力,打造个人IP 只要你的内容足够好,你分享内容就能够影响很多人。在这个粉丝经济时代,关注就会产生价值,你的行为将受到读者的关注。你的每句话都在你自己的领域或在粉丝的眼中,都是具有一定的影…

    2022-01-08
  • 肉鸽养殖成本,肉鸽养殖成本与利润视频

      肉鸽养殖是近几年很火的一个养殖项目,也是比较具有争议的养殖项目,有的人说养肉鸽很赚钱,也有人说养肉鸽投资大,利润小,养殖不赚反亏,那么,肉鸽养殖到底到赚不赚钱呢?成本与利润各是多少?下面,我们来具体分析。 成本投入按100对种鸽计算 固定投入 成本投入分为两块,一块是固定投入包括养殖场地、笼具、种鸽;二是养殖过程中饲料、水电费、防疫的投入。 鸽…

    2022-04-20
  • 江西省抚州市南丰县(江西省抚州市南丰县白舍镇派出所)

    4月8日,由中共抚州市委宣传部、中共南丰县委、南丰县人民政府、抚州市文联联合主办了主题为“橘花盛开 诗会南丰”——谷雨来寻子固家2023抚州?南丰谷雨诗会名家讲座。 在讲座中,中国著名诗人王久辛、江西著名诗人林珊结合各自创作经历,分别围绕“诗歌创作、创作体会”两方面内容进行了分享,我县一百多名师生到场聆听。 据了解,谷雨诗会是江西省文艺界和群众以吟诗的形式歌…

    2023-05-29 投稿
  • 如何最快挣钱还债,这几个快速赚钱项目了解一下

    这是一个粉丝的问题。目前社会上有太多失信被执行人,处在寸步难行的困境中,即使自己内心有还债的强烈欲望,却总是找不到一些切实可行的挣钱途径。那么,对于一个一无所有的失信被执行人,现在有哪些切实可行的挣钱途径呢?我这里给大家推荐几个,仅供调研参考。 现代家政服务公司 近期,我正在对这个项目进行调研,随着对项目了解得深入,使我坚信,对于一个一无所有的失信被执行人而…

    2022-04-28 投稿
  • 三金属丝外周球囊扩张导管,外周球囊扩张导管

    5月8日,记者从广东博迈医疗科技股份有限公司(以下简称“博迈医疗”)获悉,该公司历时五年创新研发的全球首创三金属丝外周刻痕球囊导管已顺利完成中国临床试验全部入组,将为广大外周血管狭窄病变和血液透析动静脉内瘘狭窄患者带来福音。 Tri-Wedge 三金属丝外周球囊扩张导管 预计明年取得中国产品注册上市许可 近日,位于松山湖的博迈医疗宣布,其历时五年创新研发的全…

    2023-07-08