当前位置: 首页 > 科技观察

HarmonyOS纯ets语言实现抓神经猫游戏

时间:2023-03-15 13:17:46 科技观察

更多内容请访问:??????????????????????????????????????????????????1.前言<<捉神经猫>>游戏相信很多朋友都玩过。最近ARKUI不是很火吗?,6年前看过一篇文章,分析了号称神经猫最难抓的神经猫的寻路算法。回去看看,这个项目不就是个好实践吗,干就干了。2.效果目前已经完成了整个游戏的UI(当然图片是网上找的),游戏逻辑(开始,移动,输赢判断),可以学习的知识:ets方法的UI布局,ets组件开发的思路,定义弹出框,ets语言构造多叉树,广度优先算法,最小路径算法,设置图片动画等整体开发后,UI流畅,难度不高,但是这种声明式UI不同于以往的命令式UI编程方式,需要换一种思路。最耗时的部分是猫跑掉的算法。算法本来就是薄弱环节。只需点击视频即可完成。废话不多说,我们用动图来感受一下。先失败:后成功:三、关键部分解读(一)玩法游戏的地图是由一些灰点9*9交错排列而成。在初始情况下,游戏生成地图时,会随机选择一些点变成橙色作为墙,然后玩家每点击一个灰色点,点就变成橙色,猫移动一步。胜负的判断是,如果猫被围成一个圆圈,它就赢了。当猫跑到地图上时如果你在边缘,你就输了。游戏玩法非常简单。(2)一些代码的代码结构是这样的。由于时间关系,代码的结构没有优化。有些地方看起来很混乱,包括文件名和变量名。待会儿有时间再调整。我现在就看一下。我们走吧。发布另一个“猫”类:@ObservedexportclasscatData{pos_x:numberpos_y:numberlocation:numberstep:number=0inWall:boolean=falseconstructor(loc:number=defaultLocation){this.setLocation(loc)}reset(){this.inWall=falsethis.step=0this.setLocation(defaultLocation)}setLocation(loc:number){console.log("setLoction:"+loc)this.location=locthis.setPosition()}setPosition(){让col:number=Math.floor(this.location/9)让row:number=this.location%9this.pos_x=(col%2?row*38+17:row*38)这个。pos_y=col*38//console.log("x:"+this.pos_x+"y:"+this.pos_y)}moveTo(location:number){this.setLocation(location)this.step++}catInWall(yes:boolean=true){this.inWall=yes}}cat类的主要作用是记录移动步数,然后移动位置。当游戏重新开始时,一些属性将被重置。(3)主要逻辑游戏的主要逻辑是依靠玩家点击圆点。当点击圆点时,首先将圆点设置为墙,然后先找出猫可以逃脱的路线,然后让猫选择一条路线继续前进。转义,主要逻辑代码如下:;}myCircleDataArray[index].setClick()让catLocation=myCat.locationmyCircleDataArray.forEach(item=>{item.path=-100item.depth=100})myCircleDataArray[catLocation].depth=0让邻居=getNeighbors(catLocation,myCircleDataArray[catLocation].depth)neighbors.forEach(item=>{myCircleDataArray[item.location].depth=item.depth})letneighborList:Array=neighbors而(neighborList.length>0){letneighborsArrayList:Array=[]neighborList.forEach(item=>{letneighborsTemp=buildNeighborChild(item)neighborsTemp.forEach(item=>{neighborsArrayList.push(item)})})neighborList=neighborsArrayList}邻居bors.forEach(item=>{calcCirclePath(item)})letbest=getBestNeighbor(neighbors)console.log("最好的邻居是:"+best.location+"path="+best.path);if(best.path==100){console.log("猫在墙上");myCat.catInWall()myGame.setState(gameState.gameVictory)}myCat.moveTo(best.location)if(catCheckLocation()==true){console.log("catescaped")myGame.setState(gameState.gameFailed)}neighbors.length=0}这里先说一下寻路算法。目前使用广度优先遍历。找到几条最短路径后,当有两条以上的最短路径时,查看哪条路径的子路径较多(防止进入玩家设置的陷阱)functiongetBestNeighbor(neighbors:Neighbor[]):Neighbor{letneighbor:Neighbor=neighbors[0]//已经得到最短路径for(vari=1;ineighbors[i].path){neighbor=neighbors[i]}}console.log("theshortestnei:"+neighbor.location)//选择孩子多于其他for(varj=0;j