A* 寻路算法


构造point 类

应包括

X 坐标

Y坐标

G值

H值

F值

parent 父节点


AStar类

应包括

起点

终点

开放列表

关闭列表

障碍列表

地图数组


流程:

1 将起点放入开放列表

2 从开放列表中查找F值最低的点

3 检测此点周围的可到地点,并放入开放列表中

4 将此点放入闭合列表,并在开放列表中将其删除

5 如果在开放列表中检测到终点,则找到路径,结束查找,反之从2开始重复


最短路径是从终点开始遍历父节点,直到起点形成的路径。

package AzureL;

import java.util.ArrayList;

import AzureL.Point;
import android.util.Log;

public class Astar {
	private  Point start; //起点
	private  Point terminal; //终点
	private  ArrayList openlist; 
	private  ArrayList closelist;
	private  int[] pass = {1,2};
	private  int[][] map; //地图
	/**
	 * 构造函数
	 * @param s 起点
	 * @param t 终点
	 * @param m 地图
	 */
	public Astar(Point s,Point t,int[][] m){
		start = s;
		terminal = t;
		map = m;
		openlist  = new ArrayList();
		closelist =  new ArrayList();
	}
	/**
	 * 获得起点
	 * @return  返回起点
	 */
	public Point getStartPoint(){
		return start;
	}
	/**
	 * 获得终点
	 * @return 返回终点
	 */
	public Point getTerminalPoint(){
		return terminal;
	}
	/**
	 * 返回开放列表
	 * @return 返回开放列表
	 */
	public ArrayList getopenlist(){
		return openlist;
	}
	/**
	 * 返回闭合列表
	 * @return 返回闭合列表
	 */
	public ArrayList getcloselist(){
		return closelist;
	}
	/**
	 * 从openlist查找最低F值的点
	 * 
	 * @return 最低F值点的序号
	 */
	private  Point getPfromopenlist(){
		Point p;
		int f = 0;
		int t = 0;
		if(openlist.size()>1){
			
			for(int i = 0;i p.getF()){
					f = p.getF();
					t = i;
					Log.i(" getP ","t = "+t);
				}
			}
			return openlist.get(t);
		}
		else{
			return openlist.get(0);
		}
	}
	/**
	 * 找到路径 
	 * @return 返回闭合列表
	 */
	public  ArrayList findPath(){
		openlist = new ArrayList();
		closelist = new ArrayList();
		openlist.add(start);
		
		while(openlist.size() > 0){
			Point p = getPfromopenlist();
			checkArroundPoint(p);
			openlist.remove(p);
			closelist.add(p);
			if(containPoint(openlist, new Point(terminal.getX(),terminal.getY()))){
				break;
			}
		}
		
		return closelist;
	}
	/**
	 * 查找此点周边可用点
	 * @param p 当前点 
	 */
	private  void checkArroundPoint(Point p){
		
		for(int ix = -1;ix<2;ix++){
			for(int iy = -1;iy<2;iy++){
				if( !(ix == 0 && iy == 0)){
					Point newPoint = new Point(p.getX()+ix,p.getY()+iy);
					if(newPoint.getX()>=0 && newPoint.getX()=0 && newPoint.getY()+iy list,Point p){
		for(int i = 0;i list,Point p){
		for(int i = 0;i


你可能感兴趣的:(J2ME,游戏开发,算法,terminal,list,class,null)