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)

相关推荐

  • 蝎子养殖市场(野生蝎子养殖方法)

    蝎子是有毒的,但对于农民来说,它是一种益虫,能够间接地保护农作物。然而很多人并不领情,因为有药用和食用价值,售价高,就对它们进行近乎灭绝式的捕捉。捕蝎群体相当庞大而且猖獗,却难以得到有效管制。捕蝎的经济利润究竟有多大?大量捕蝎又会造成怎样的后果? 捕蝎人在展示他的成果 捕蝎子的人难道不会被蝎子蛰伤或蛰死吗? 全世界共有1750多种蝎子,所有蝎子尾部末端的螫针…

    2022-04-27 创业项目
  • 蓝色协议blue protocol,蓝色协议深绿之牙

    万代南梦宫今日公布了一款全新游戏,名为《蓝色协议》(Blue Protocol)。本作是一款在线动作 RPG 游戏,将登陆 PC 平台。游戏由“Project Sky Blue”开发,该开发团队的成员由 Bandai Namco Online 和 Bandai Namco Studios 组成。 《蓝色协议》的世界被设定在一个“有着动画电影般惊人画面表现的”…

    2023-07-12
  • 乔四爷的照片(乔四爷年轻的图片)

      79年带军帽出门 ,那是一种身份地位的象征 。所以那个时代偷军帽的很多 。刘涌是当兵出身。曾经掌掴刘德华。年轻时的刘涌很帅,也很有气质。 他是真正意义上的东北道上大哥, 只可惜昙花一现。文质彬彬,经常戴一副眼镜,很像《东北往事》中的张岳。 宋永佳 乔四年轻时照片,据说与24位女明星有染。 李正光 哈尔滨一号杀手。生死看淡。不服就干。乔四覆灭后,…

    2022-01-21 投稿
  • 爱丽丝漫游奇境主要内容30字(爱丽丝漫游奇境主要内容300字)

    推荐书籍:《爱丽丝梦游仙境》 推荐理由:因为里面的事件和现实的世界不同。比如有会说话的兔子,有奇奇怪怪的槌球比赛,有奇奇怪怪的疯子茶会,还有长得像扑克牌的女王,跟魔法一样。非常的好看。 精彩瞬间:《王后的槌球场》爱丽丝还是决定去问问比赛进行得怎么样了。远远她就听见王后在气急败坏地嚷嚷着。 从说话的内容中,她知道了有三位参赛者因误了击球而被王后判了他们死刑,觉…

    2023-05-24
  • 半熟恋人更新到哪一期了,半熟恋人最后一期播出时间

    经过3个多月的热播,全新素人恋爱综艺《半熟恋人》终于落下了帷幕,最终罗颖黄瑞恩、罗拉王能能两对CP成功官宣,并且明确表示私下正在交往。不管是对于观众还是对于谢楠、唐艺昕以及王子文等观察员,都无法否认这个结局非常完美。   值得注意的是,在《半熟恋人》最后一期更新之际,人气最高的“巴啦啦能量”CP更是直接现身直播间,两人官宣后甜蜜同框,给观众大撒狗粮…

    2022-03-17 投稿
  • 最终幻想3攻略 最佳职业搭配

    6.0新版的重骑兵,比起原版的更离谱了,导致现在70级的镰刀开了双盾+重骑兵物防可以达到5800+,可以单触水岛任何一个nm。 通过一些手段我们可以得知5800+物防相当于物理减伤96%,比起原版的重骑兵物防5300多了9%的减伤,魔法减伤也到了88%。 那么也就是说,从38级开始,有没有可能自闭人直接,拿着镰刀单人刷+6级的变异/适应怪/怪堆,或者直接找个…

    2023-07-10
  • 光伏产业发展前景,光伏产业的现状与未来

    中商情报网讯:光伏是国家重点支持的清洁能源,光伏电池是光伏产业重要组成部分。光伏将成为碳中和绝对主力,这将间接利好光伏电池产业发展,未来中国光伏电池行业前景广阔。 一、光伏将成碳中和绝对主力 光伏电池受利好 中国是全球最大的二氧化碳排放国,据IEA数据,2021年中国二氧化碳排放量就超过119亿吨,占全球总量的33%。2020年9月22日,中国政府在第七十五…

    2022-04-19 投稿
  • 淮北本地人网(淮北本地人网app)

    约1981年农历11月出生几天从安徽省淮北市濉溪县送养到本地的姚云寻亲503754bbhj 性别:女 出生时间:1981年11月24日(农历,不准确,户口日期) 送养时间:1981年11月29日(农历,应该准确,推测时间) 疑似户籍地:河北省周口市,鹿邑 送养地址:安徽省淮北市濉溪县(疑似县医院) 目前所在地:安徽省淮北市 特征描述:一个头旋,直发,右手断掌…

    2023-05-27
  • 1折机票(1折机票能退吗)

    国航国内机票退改将实行“阶梯费率”。至此,国航、东航、南航、海航四大航企均已宣布施行机票退改“阶梯费率”,另春秋航空等廉价航空也将实施阶梯费率。 总体来讲,机票越早退改,手续费越低,票款退改签费率也与购票价格和舱位有关,特价机票也可办理退改签手续。 资料图:乘务员们在客舱内为旅客调试机上上网功能。中新社记者 殷立勤 摄 退改签要趁早 航空公司纷纷推行退改签“…

    2021-12-26
  • 百亿补贴活动多长时间?拼多多818活动百亿补贴持续多久?

    拼多多一些比较大型的活动,百亿补贴栏目也会参与优惠,里面的部分商品会在原来的基础上再降价一点点。那么,拼多多818活动百亿补贴持续多久?2022年08月01日-2022年08月18日一、拼多多百亿补贴活动多久一次?百亿补贴每天开抢的时间点刷新很频繁,有时候8点一次后,9点又有一轮,这个是没有规律的。参与百亿补贴的商品的活动开始和结束时间都不一样,我们看到有的…

    2023-02-08
  • 在淘宝上卖什么赚钱,在淘宝上卖什么挣钱

    卖什么比较好?或者可以换成什么比较好卖! 竞争小?热度高?利润高? 真要说个具体的,那么推荐你玩具、洗护。   现在的电商已经不是2008年以前随便上架几个产品就能卖的时代了,大部分类目的竞争已经很激励了,比如卖女装、化妆品等。 所以,这两年要想在淘宝上赚到钱一定要做竞争小利润高的蓝海类目,这种类目由于商品数量比较少,所以哪怕运营推广的水平差一点,…

    2022-04-24 投稿
  • 招人最厉害的方法(招人怎样效率最高最新方法)

    #做招聘很难吗# 班妹儿因为是做招聘这个行业的,平常会接触到很多的HR。时间久了,班妹儿发现HR真的是属于工资差距很大的行业,班妹儿自己接触过很多月薪在15000+的HR,也接触过每月只能拿4000左右底薪的HR。 (图片来源于网络) 请教并总结了下面3个原因,建议大家收藏,希望能帮助到从事这个行业的朋友们,或者是准备要做这个行业的朋友们。 1. 前期多准备…

    2022-05-07 投稿