最近用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;
}
}