[ create a new paste ] login | about

Link: http://codepad.org/60tCZh0D    [ raw code | fork ]

C++, pasted on Jun 8:
bool operator == (const Block &First, const Block &Second)
{
	return First.GetX() == Second.GetX() && First.GetY() == Second.GetY();
}

void HGame::StartAlgorithmus()
{
	std::cout<<"-------------------------"<<std::endl;
	std::cout<<"A* Algorithmus gestartet!"<<std::endl;
	std::cout<<"Weg wird berechnet, bitte warten..."<<std::endl<<std::endl;

	//Listen löschen und Felder freigeben
	Clear();

	//Clock starten!
	ClockTime.restart();

	ClosedList.push_back(Myqueue.front());
	//Solange ausführen, bis man entweder einen Weg hat oder nicht
	Block &GoalBlock	= Myqueue.back();
	while(!OpenList.empty() && ClosedList.back() != GoalBlock)
	{
		Block CurrentBlock	= OpenList.front();
		OpenList.pop();
		ClosedList.push_back(CurrentBlock);
		CurrentBlock.SetBlockID(4);		//ClosedList -> Farbe ändern

		int int_x = static_cast<int>(CurrentBlock.GetX() / 20.f +0.5f);//hier sollte kein float sein=> Block sollte keine floats speichern sondern ints
		int int_y = static_cast<int>(CurrentBlock.GetY() / 20.f +0.5f);//taucht später auch noch als Problem auf!
		Field[int_x][int_y].Available == true;//als closed markieren

		{
			int neighbors[][] = { {1,0}, {1,1}, {1,-1}, {-1,0}, {-1,1}, {-1,-1}, {0,1}, {0,-1} };
			for(int counter = 0; counter < 8; counter++)
			{
				int new_x = int_x + neighbors[counter][0];
				int new_y = int_y + neighbors[counter][1];

				if(Field[new_x][new_y].Available == true)//eine art closed check; ginge auch per ClosedList und wäre wahrscheinlich sicherer
				{
					//der knoten muss gelöscht werden um doppelte Einträge zu vermeiden!
					for(auto it = OpenList.begin(); it != OpenList.end();)
						if(fabs(it->GetX() - new_x*20.f) < 0.001f && fabs(it->GetY() - new_y*20.f) < 0.001f)
							it = OpenList.erase(it);
						else
							++it;

					OpenList.push_back(Block(Game, new_x*20.f, new_y*20.f, 3));		//3 = OpenList
					Block &m = OpenList.back();
				
					float h_dist_x = m.GetX() - GoalBlock.GetX();
					float h_dist_y = m.GetY() - GoalBlock.GetY();

					float dist_x = m.GetX() - CurrentBlock.GetX();
					float dist_y = m.GetY() - CurrentBlock.GetY();

					m.SetG(CurrentBlock.GetG() + sqrt(dist_x*dist_x+dist_y*dist_y));
					m.SetH(sqrt(h_dist_x*h_dist_x+h_dist_y*h_dist_y));
					m.SetF(m.GetG() + m.GetH());
					m.SetComeFrom(sf::Vector2i(CurrentBlock.GetX(), CurrentBlock.GetY()));
				}
			}
			OpenList.sort();
		}
	}
	Finish		= ClosedList.back() == GoalBlock;
	Impossible	= !Finish;

	if(ClosedList.empty() == false && Impossible == false)
	{
		bool Start = false;

		ComeFromX = ClosedList.back().GetX();
		ComeFromY = ClosedList.back().GetY();

		while(Start == false)
		{
			if(PathList.empty() == false)
			{
				if((PathList.back().GetX()+1 == Myqueue.front().GetX() && PathList.back().GetY() == Myqueue.front().GetY()) ||
					(PathList.back().GetX()+1 == Myqueue.front().GetX() && PathList.back().GetY()+1 == Myqueue.front().GetY()) ||
					(PathList.back().GetX()+1 == Myqueue.front().GetX() && PathList.back().GetY()-1 == Myqueue.front().GetY()) ||
					(PathList.back().GetX()-1 == Myqueue.front().GetX() && PathList.back().GetY() == Myqueue.front().GetY()) ||
					(PathList.back().GetX()-1 == Myqueue.front().GetX() && PathList.back().GetY()+1 == Myqueue.front().GetY()) ||
					(PathList.back().GetX()-1 == Myqueue.front().GetX() && PathList.back().GetY()-1 == Myqueue.front().GetY()) ||
					(PathList.back().GetX() == Myqueue.front().GetX() && PathList.back().GetY()+1 == Myqueue.front().GetY()) ||
					(PathList.back().GetX() == Myqueue.front().GetX() && PathList.back().GetY()-1 == Myqueue.front().GetY()))
					Start = true;
			}
			MoveBack();
		}
	}

	std::cout<<"OpenList: "<<OpenList.size()<<std::endl;
	std::cout<<"ClosedList: "<<ClosedList.size()<<std::endl;
	std::cout<<"PathList: "<<PathList.size()<<std::endl;

	//Wenn man das Ziel erreicht hat man einen Weg gefunden
	if(Finish == true)
		std::cout<<"Weg gefunden! ("<<ClockTime.getElapsedTime().asMilliseconds()<<"ms)"<<std::endl<<std::endl;

	//Wenn OpenList leer ist, aber einen Weg gefunden hat, hat man ihn ja trotzdem gefunden
	if(Impossible == true && Finish == false)
		std::cout<<"Das Ziel kann nicht erreicht werden! ("<<ClockTime.getElapsedTime().asMilliseconds()<<"ms)"<<std::endl<<std::endl;
}


Create a new paste based on this one


Comments: