苦逼的岁月

最近用JAVA给老师写一个游戏AI的代码,本来JAVA就学了不到俩星期,直接上这玩意,感觉一边码代码一边学习语法,尤其细节上还有很多不清楚

这次有一个算最短路径,石头无法经过,而木头可以经过,但是木头权值较大,而空地可以直接经过,这明显用优先权队列搞搞,但是JAVA里用起来都是泪啊...

结构体被类所替代,然后注意那个比较函数放的位置,一开始一直放在外面报错,然后初始化...

首先导入包名

import java.util.LinkedList;
import java.util.PriorityQueue;

然后建立自己的节点类

  public  class  node//新建node节点类,主要是为了同步步数信息
	  {
		  Coord c;
		  int step;
	   }
正文,注意比较函数,入队为offer,出队并删除为poll

 public int getDistance(Player player, Home home)
	 {
		  int[] a={-1,1,0,0};
		  int[] b={0,0,1,-1};
		  int [][] visit=new int [16][16];
		  int i;
		  node start = null,end=null,temp=null,temp2=null;
		  Coord p = player.getPos();
		  Coord h = home.getC();
		  start.c.x=p.x;//一个炸弹人的坐标
		  start.c.y=p.y;
		  end.c.x=h.x;//对面老家的坐标
		  end.c.y=h.y;
		  Comparator<node> cmp;
		  cmp = new Comparator<node>()//定义比较函数从小到大
		  {
	          public int compare(node e1, node e2) 
	          {
	              return e1.step - e2.step;
	          }
	       };
		  Queue<node> queue = new PriorityQueue<node>(255,cmp);
		  visit[p.x][p.y]=1;//起始点被访问过
		  queue.offer(start);//起点进队
		  while(!queue.isEmpty())//当队列不为空
		  {    
			  temp=queue.poll();//出队并返回值
			  if (temp.c==end.c)//如果就是终点
			  {
				 return temp.step; //返回步数
			  }
			  for (i=0;i<=3;i++)
			  {
				  if ((temp.c.x+a[i]>=0)&&(temp.c.x+a[i]<15)&&(temp.c.y+b[i]>=0)&&(temp.c.y+b[i]<15)&&(this.map.map[temp.c.x+a[i]][temp.c.y+b[i]]!=ObjectType.STONE)&&(this.map.map[temp.c.x+a[i]][temp.c.y+b[i]]!=ObjectType.BOMB)&&(visit[temp.c.x+a[i]][temp.c.y+b[i]]==0))
                    {
	                 visit[temp.c.x+a[i]][temp.c.y+b[i]]=1;
	                 temp2.c.x=temp.c.x+a[i];
	                 temp2.c.y=temp.c.y+b[i];
	                 if (this.map.map[temp2.c.x][temp2.c.y]==ObjectType.WOOD)//如果这块是木头则步数加7
	                 {
	                	 temp2.step=temp.step+7;
	                 }
	                 else
	                	 temp2.step=temp.step+1;//否则步数加1
	                     queue.offer(temp2);//将下一个节点入队
	                }
		    }
		       
	  }
                   return -1;
	  }
}
	



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值