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-03-18 投稿
  • The Best Deals On Affordable Prices

    adventure n. 冒险,冒险活动,奇遇adventurer n. 冒险家adventurism n. 冒险主义 [语境] Reading adventure stories quickened my imagination. 阅读冒险故事激发了我的想象力。 advertise vt. 公布,宣告; vi. 登广告advertisement n. 广告…

    2023-05-24
  • 电信9元流量卡不限量(电信29元100g流量卡是真的吗)

    山东电信老版29元100g卡可以找客服加40元20G流量促销包,每月减免40元,等于可以加0元20G通用长期 办理入口:直接登陆中国电信app,找人工在线客服,就说要求办理添加 40元20G流量促销包套餐和20GB流量促销减免包-40元套餐 这俩个业务,实现增加0元20g。 客服核实对话 如果你还没有山东电信 那么 …..他来了 长期20年套餐 …

    2023-05-24 投稿
  • 约瑟夫拜登对华态度怎么样(约瑟夫拜登对中国的看法)

    前不久,中美在瑞士苏黎世举行了今年以来的第三次会晤,不同于前两轮的剑拔弩张,这回双方事前都尽量保持低调,避免了外界杂音干扰,显然都是带着诚意而来。不出意外的是,会谈确实取得了一些成果,两国一致同意管控分歧,共同推动中美关系重回健康稳定的轨道。 而从现实出发,也确实营造出了缓和矛盾的氛围,比如双方正就经贸问题进行进一步磋商,**贸易代表戴琪则表示,愿意豁免部分…

    2022-01-06 投稿
  • 金针菇坏了怎么看出来(金针菇发黄了还能吃吗)

    金针菇发黄十足十足正常现象吗?买的金针菇变黄了是什么原因?金针菇发黄了还能吃吗?金针菇怎么保存不发黄?防止金针菇变黄的处理方法有哪些?   一、金针菇发黄还能吃吗 可以食用。 金针菇本身的颜色是偏乳白色,可能放了几天后颜色会偏向于黄色,只要金针菇没有烂没有长霉也没有其他的异味都是可以吃的,而且就算你发现金针菇好像变大了也是没事的,菌类本身就适合温度…

    2022-05-10
  • 焦虑症其实很简单治愈(焦虑症最好的自愈方法)

    :在我接待的焦虑症来访者中,开始咨询时、被询问频率最高的一句话:“该怎么做?” A:其实,你有没有想过:根本不需要做什么! 为什么会有焦虑症状呢? 大概哪里有压迫,哪里就有反抗吧!就像皮球一样,越拍、弹的就会有越高。 当我们感觉到身体某个部分有点痒,下意识的反应就是去挠一挠,每每遇到令我们自己主观上感觉不舒服的感觉,我们往往都试图通过某种途径、改变当下的状态…

    2022-01-01
  • 双十字星代表着什么(出现双十字星是代表什么意思?)

    今日A股大盘震荡,成交量和昨日持平,盘中地方银行股,医药股活跃,这也是行情末期的一个现象,大盘在构筑短期顶部,这个判断我没有改变,大盘今天收出又一颗十字星,明天大盘会怎么走,我们一起来分析。   第一,技术面看,大盘明天仍会延续震荡下跌的走势。就是涨到3500点,也是顶部结构,这是因为: 1,A股大盘在历史套牢区始终没有放量,量能不支持大盘再创新高…

    2021-12-22 投稿
  • 十大专利代理公司(中国十大专利代理公司)

    数据说明:数据来源第三方专利网站,以下内容均由作者根据来源数据整理所得;可能会因为来源数据公开时间等因素造成一定误差; ;截止2022年8月2号,广东省2022年公开发明授权专利最多的公司主要为:华为,腾讯,OPPO;最多的大学主要为:华南理工,广东工业,中山大学;更多信息请看”发明授权前50公司,院校”。 在发明授权专利排名前50家…

    2023-04-02
  • 药妆品牌哪个最好用?比较好的药妆护肤品牌

    现在的女孩子对护肤品都是十分讲究的,尤其是一些大牌的护肤品,更是受到了众多爱美女孩子的青睐。 很多人都逐渐了解到,大牌护肤品从各方面的护肤效果都比较好,毕竟年轻有光泽的肌肤,谁不想要呢? 在众多的大牌护肤品当中,海蓝之谜、cpb、赫莲娜是万众瞩目的贵妇品牌。那么,同为贵妇品牌,到底哪个好呢?今天我们就这个问题来做一番讨论。 首先,我们先来了解一下海蓝之谜、C…

    2023-01-16 投稿
  • microsoftoffice文件格式兼容包

    电脑上的软件有很多,很多人没有时间一个个去体验,所以下面给大家分享7款Windows必装软件,一个比一个好用,让你的电脑体验拉满。 01*RocketDock 亮点:仿Mac风格的Dock栏。 不得不承认,Mac电脑的界面风格确实很好看,打开软件的效率也更高,那么Windows能实现吗?当然可以!用它就能实现,自由添加应用、目录、分隔符,鼠标移动上去也会放大…

    2023-05-29 投稿
  • 抖音怎么取消实名认证(取消实名认证的方法抖音)

    其实对于已经实名认证的小伙伴来说,很多人是因为认证错了,或者是想要取消。进行取消了实名认证要如何去解除?这里给大家罗列下几种方法: 首先第一种方法就是你发送邮件取消实名认证,抖音取消实名认证的一个操作方法就是你要准备一些相应的材料,发送邮件到feedback@douyin.com ,邮件标题就写取消实名认证。然后再加上你的抖音昵称、抖音号、以及你的姓名。 抖…

    2022-05-27
  • qq炫舞维护公告 ,平台运营策略有哪些

    11月27日,红星资本局从迅雷网游**官网获悉,由于平台运营策略调整,结合整体运营情况考虑,迅雷网游**将于今年12月1日正式停运,关停加速服务和各类活动。 据其官网显示,迅雷网游**是“迅雷网络”(全称深圳市迅雷网络技术有限公司,XNET.US)推出的一款致力于帮助玩家解决游戏延时高、卡顿、掉线等问题的专业级加速软件。迅雷网游加速用户分为普通用户和会员用户…

    2023-06-02