营救公主(Java实现A*算法解决迷宫问题) (九)

2014-11-24 11:07:16 · 作者: · 浏览: 9
者已经在尝试过的列表中时,不做任何处理
if (getMap().isOverEdge(subPosition)
|| getMap().isWall(subPosition)
|| isInPassedTable(subPositionWeight))
{
continue;
}

subPositionWeights.add(subPositionWeight);
}
return subPositionWeights;
}

/**
* 添加一个点
*
*/
private void addPositionWeight(PositionWeight father,
PositionWeight positionWeight)
{
// 在待尝试列表中已经包含了当前点,则按照一定条件更新其父节点及其权值,否则直接添加
if (getAttemptPositions().contains(positionWeight))
{
updateCostByFather(father, positionWeight);
}
else
{
getAttemptPositions().add(positionWeight);
}
}

/**
* 计算花费的时间
*/
private int getSpendTime()
{
if (getAttemptPositions().contains(getPrincessPosition()))
{
int princessIndex = getAttemptPositions().indexOf(
getPrincessPosition());
PositionWeight princess = getAttemptPositions().get(princessIndex);

return princess.getSpendTime() <= time SUCCESS : FAIL;
}
return FAIL;
}

/**
* 从待尝试列表中查找总开销值最小的点(如果有几个相同开销的最小点,取靠近队尾的)
*
*/
private PositionWeight getMinPositionWeight()
{
PositionWeight minPositionWeight = getAttemptPositions().get(0);
for (PositionWeight positionWeight : getAttemptPositions())
{
if (minPositionWeight.getCost() >= positionWeight.getCost())
{
minPositionWeight = positionWeight;
}
}
return minPositionWeight;
}

/**
* 如果从父节点移动至子节点的G值小于子节点之前的G值(前提是子节点已经在开启列表中),则更新子节点的父节点及G值
*/
private void updateCostByFather(PositionWeight father,
PositionWeight subPosition)
{
int distanceOfAttemptFather = subPosition
.getDistanceFromAttemptFather(father);
int distanceOfPrince = father.getDistanceOfPrince()
+ distanceOfAttemptFather;
if (distanceOfPrince < subPosition.getDistanceOfPrince())
{
subPosition.updateByFather(father);
}
}

private MazeMap getMap()
{
return map;
}

private boolean isInPassedTable(PositionWeight positionWeight)
{
return getPassedPositions().contains(positionWeight);
}

private List getAttemptPositions()
{
return attemptPositions;
}

private List getPassedPositions()
{
return passedPositions;
}

private PositionWeight getPrincessPosition()
{
return princessPosition;
}

private void setPrincessPosition(PositionWeight princessPosition)
{
this.princessPosition = princessPosition;
}

private PositionWeight getPrincePosition()
{
return princePosition;
}

private void setPrincePosition(PositionWeight princePosition)
{
this.princePosition = princePosition;
}
}

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
* 王子
*
* 类名称:Prince 类描述: 创建人:dobuy
*
*/
public class Prince
{
/**
* 营救公主失败
*/
private final static int FAIL = -1;

/**
* 营救公主成功
*/
private final static int SUCCES