Ejemplo n.º 1
0
void AStar(Tank*enemy,Tank*ltank)
{
	APoint vfirst(enemy->MapCoordinate());
	APoint vfinal(ltank->MapCoordinate());
	list<APoint> openlist;
	list<APoint> closelist;
	openlist.push_back(vfirst);        //加入到openlist,表示已经侦查过
	while (!openlist.empty())
	{
		APoint vetex = openlist.front();
		openlist.pop_front();         // 从openlist中删除
		if (vetex==vfinal)            //找到目标,确定第一步方向
		{
			Direction first=FRONT;
			while (!(vetex==vfirst))
			{
				switch (vetex.getToSourceDirection())   //还原
				{
				case FRONT:
					vetex = *find(closelist.begin(),closelist.end(),APoint(vetex.getX(),vetex.getY()-1));
					first = RETREAT;
					break;
				case RETREAT:
					vetex = *find(closelist.begin(),closelist.end(),APoint(vetex.getX(),vetex.getY()+1));
					first = FRONT;
					break;
				case LEFT:
					vetex = *find(closelist.begin(),closelist.end(),APoint(vetex.getX()-1,vetex.getY()));
					first = RIGHT;
					break;
				case RIGHT:
					vetex = *find(closelist.begin(),closelist.end(),APoint(vetex.getX()+1,vetex.getY()));
					first = LEFT;
					break;
				default:
					break;
				}
			}
			enemy->setDirection(first);
			return;
		}
		else                         //处理四个方向节点
		{
			closelist.push_back(vetex);  //加入到closelist中,表示已经检测过

			APoint up(vetex.getX(),vetex.getY()-1);    //up 方向
			if (find(openlist.begin(),openlist.end(),up)==openlist.end()&&find(closelist.begin(),closelist.end(),up)==closelist.end()&&MapValue(up.getX(),up.getY())!=CANTMOVE&&MapValue(up.getX(),up.getY())!=CANTACROSS)//不在两列表中且可以通过
			{
				int toCost = vetex.getToHereCost()+MapValue(up.getX(),up.getY());
				int cost =toCost +Heuristic(up,vfinal);     //更新 总价值=到前一节点的值+此节点的值+启发值
				up.setToHereCost(toCost);
				up.setCost(cost);
				up.setDirection(RETREAT);      //设置到前一节点的方向
				openlist.push_back(up);        //加入到openlist
			}

			APoint down(vetex.getX(),vetex.getY()+1);    //down 方向
			if (find(openlist.begin(),openlist.end(),down)==openlist.end()&&find(closelist.begin(),closelist.end(),down)==closelist.end()&&MapValue(down.getX(),down.getY())!=CANTMOVE&&MapValue(down.getX(),down.getY())!=CANTACROSS)//不在两列表中且可以通过
			{
				int toCost = vetex.getToHereCost()+MapValue(down.getX(),down.getY());
				int cost = toCost+Heuristic(down,vfinal);     //更新 总价值=到前一节点的值+此节点的值+启发值
				down.setToHereCost(toCost);
				down.setCost(cost);
				down.setDirection(FRONT);      //设置到前一节点的方向
				openlist.push_back(down);        //加入到openlist
			}

			APoint left(vetex.getX()-1,vetex.getY());    //left 方向
			if (find(openlist.begin(),openlist.end(),left)==openlist.end()&&find(closelist.begin(),closelist.end(),left)==closelist.end()&&MapValue(left.getX(),left.getY())!=CANTMOVE&&MapValue(left.getX(),left.getY())!=CANTACROSS)//不在两列表中且可以通过
			{
				int toCost = vetex.getToHereCost()+MapValue(left.getX(),left.getY());
				int cost = toCost+Heuristic(left,vfinal);     //更新 总价值=到前一节点的值+此节点的值+启发值
				left.setToHereCost(toCost);
				left.setCost(cost);
				left.setDirection(RIGHT);      //设置到前一节点的方向
				openlist.push_back(left);        //加入到openlist
			}

			APoint right(vetex.getX()+1,vetex.getY());    //right 方向
			if (find(openlist.begin(),openlist.end(),right)==openlist.end()&&find(closelist.begin(),closelist.end(),right)==closelist.end()&&MapValue(right.getX(),right.getY())!=CANTMOVE&&MapValue(right.getX(),right.getY())!=CANTACROSS)//不在两列表中且可以通过
			{
				int toCost = vetex.getToHereCost()+MapValue(right.getX(),right.getY());
				int cost = toCost+Heuristic(right,vfinal);     //更新 总价值=到前一节点的值+此节点的值+启发值
				right.setToHereCost(toCost);
				right.setCost(cost);
				right.setDirection(LEFT);      //设置到前一节点的方向
				openlist.push_back(right);        //加入到openlist
			}
			openlist.sort(compareAP);
		}
	}
}
Ejemplo n.º 2
0
void NBAStar(Tank*assassin,Tank*ltank)
{
	vector<APoint> vec_weight;
	vector<APoint> vec_bullet;
	AStarWeightAdjust(vec_weight,ltank);      //朝向上路径权值改变
	if (ltank->getBullet().getIsFly())
	{
		AStarWithBulletWeightAdjust(vec_bullet,ltank);  //子弹路径上权值改变
	}

	APoint vfirst(assassin->MapCoordinate()); //起点
	APoint vfinal(ltank->MapCoordinate());    //终点
	list<APoint> openlist;
	list<APoint> closelist;
	openlist.push_back(vfirst);        //加入到openlist,表示已经侦查过
	while (!openlist.empty())
	{
		APoint vetex = openlist.front();
		openlist.pop_front();         // 从openlist中删除
		if (vetex==vfinal)            //找到目标,确定第一步方向
		{
			Direction first=FRONT;
			while (!(vetex==vfirst))
			{
				switch (vetex.getToSourceDirection())   //还好
				{
				case FRONT:
					vetex = *find(closelist.begin(),closelist.end(),APoint(vetex.getX(),vetex.getY()-1));
					first = RETREAT;
					break;
				case RETREAT:
					vetex = *find(closelist.begin(),closelist.end(),APoint(vetex.getX(),vetex.getY()+1));
					first = FRONT;
					break;
				case LEFT:
					vetex = *find(closelist.begin(),closelist.end(),APoint(vetex.getX()-1,vetex.getY()));
					first = RIGHT;
					break;
				case RIGHT:
					vetex = *find(closelist.begin(),closelist.end(),APoint(vetex.getX()+1,vetex.getY()));
					first = LEFT;
					break;
				default:
					break;
				}
			}
			assassin->setDirection(first);
			return;
		}
		else                         //处理四个方向节点
		{
			closelist.push_back(vetex);  //加入到closelist中,表示已经检测过

			APoint up(vetex.getX(),vetex.getY()-1);    //up 方向
			if (find(openlist.begin(),openlist.end(),up)==openlist.end()&&find(closelist.begin(),closelist.end(),up)==closelist.end()&&MapValue(up.getX(),up.getY())!=CANTMOVE&&MapValue(up.getX(),up.getY())!=CANTACROSS)//不在两列表中且可以通过
			{
				int toCost = vetex.getToHereCost()+MapValue(up.getX(),up.getY());
				if (find(vec_weight.begin(),vec_weight.end(),up)!=vec_weight.end())  //路径在坦克炮口前+DANGEROUS
				{
					toCost += DANGEROUS;
				}
				if (find(vec_bullet.begin(),vec_bullet.end(),up)!=vec_bullet.end())  //路径在炮弹路线上+BULLETDANGEROUS
				{
					toCost += BULLETDANGEROUS;
				}
				int cost =toCost +Heuristic(up,vfinal);     //更新 总价值=到前一节点的值+此节点的值+启发值
				up.setToHereCost(toCost);
				up.setCost(cost);
				up.setDirection(RETREAT);      //设置到前一节点的方向
				openlist.push_back(up);        //加入到openlist
			}

			APoint down(vetex.getX(),vetex.getY()+1);    //down 方向
			if (find(openlist.begin(),openlist.end(),down)==openlist.end()&&find(closelist.begin(),closelist.end(),down)==closelist.end()&&MapValue(down.getX(),down.getY())!=CANTMOVE&&MapValue(down.getX(),down.getY())!=CANTACROSS)//不在两列表中且可以通过
			{
				int toCost = vetex.getToHereCost()+MapValue(down.getX(),down.getY());
				if (find(vec_weight.begin(),vec_weight.end(),down)!=vec_weight.end())  //路径在坦克炮口前+DANGEROUS
				{
					toCost += DANGEROUS;
				}
				if (find(vec_bullet.begin(),vec_bullet.end(),down)!=vec_bullet.end())  //路径在炮弹路线上+BULLETDANGEROUS
				{
					toCost += BULLETDANGEROUS;
				}
				int cost = toCost+Heuristic(down,vfinal);     //更新 总价值=到前一节点的值+此节点的值+启发值
				down.setToHereCost(toCost);
				down.setCost(cost);
				down.setDirection(FRONT);      //设置到前一节点的方向
				openlist.push_back(down);        //加入到openlist
			}

			APoint left(vetex.getX()-1,vetex.getY());    //left 方向
			if (find(openlist.begin(),openlist.end(),left)==openlist.end()&&find(closelist.begin(),closelist.end(),left)==closelist.end()&&MapValue(left.getX(),left.getY())!=CANTMOVE&&MapValue(left.getX(),left.getY())!=CANTACROSS)//不在两列表中且可以通过
			{
				int toCost = vetex.getToHereCost()+MapValue(left.getX(),left.getY());
				if (find(vec_weight.begin(),vec_weight.end(),left)!=vec_weight.end())  //路径在坦克炮口前+DANGEROUS
				{
					toCost += DANGEROUS;
				}
				if (find(vec_bullet.begin(),vec_bullet.end(),left)!=vec_bullet.end())  //路径在炮弹路线上+BULLETDANGEROUS
				{
					toCost += BULLETDANGEROUS;
				}
				int cost = toCost+Heuristic(left,vfinal);     //更新 总价值=到前一节点的值+此节点的值+启发值
				left.setToHereCost(toCost);
				left.setCost(cost);
				left.setDirection(RIGHT);      //设置到前一节点的方向
				openlist.push_back(left);        //加入到openlist
			}

			APoint right(vetex.getX()+1,vetex.getY());    //right 方向
			if (find(openlist.begin(),openlist.end(),right)==openlist.end()&&find(closelist.begin(),closelist.end(),right)==closelist.end()&&MapValue(right.getX(),right.getY())!=CANTMOVE&&MapValue(right.getX(),right.getY())!=CANTACROSS)//不在两列表中且可以通过
			{
				int toCost = vetex.getToHereCost()+MapValue(right.getX(),right.getY());
				if (find(vec_weight.begin(),vec_weight.end(),right)!=vec_weight.end())  //路径在坦克炮口前+DANGEROUS
				{
					toCost += DANGEROUS;
				}
				if (find(vec_bullet.begin(),vec_bullet.end(),right)!=vec_bullet.end())  //路径在炮弹路线上+BULLETDANGEROUS
				{
					toCost += BULLETDANGEROUS;
				}
				int cost = toCost+Heuristic(right,vfinal);     //更新 总价值=到前一节点的值+此节点的值+启发值
				right.setToHereCost(toCost);
				right.setCost(cost);
				right.setDirection(LEFT);      //设置到前一节点的方向
				openlist.push_back(right);        //加入到openlist
			}
			openlist.sort(compareAP);
		}
	}
}