Ejemplo n.º 1
0
void FieldSystem::Update(double elapsed)
{
	if (m_automaticModeEnabled && m_gameMode == MODE_DONE)
	{
		m_eventManager->FireEvent<StepEvent>(new StepEvent());
		UpdatePheromones();
		RecalculateColors();
	}
}
Ejemplo n.º 2
0
										  /// ANT COLONY ALGORITHMS ///
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
           /////                       /////                       /////                       /////       
void ant_colony()
{
	srand(time(NULL));

	const int loop_number = 1000;
    
    int** ants = CreateAnts(); 

    int *best_path = ShortestPath(ants);
    
	double bestLength = CycleLength(best_path);

	double **pheromones = InitializePheromones();

    int counter = 0;
       
	while (counter < loop_number)
    {
       UpdateAnts(ants, pheromones);
       UpdatePheromones(pheromones, ants);
           
       int *currBestTrail = ShortestPath(ants);
       double currBestLength = CycleLength(currBestTrail);

	   if (currBestLength < bestLength)
	   {
		   delete best_path;
		   best_path = NULL;
		   bestLength = currBestLength;
           best_path = currBestTrail;
       }
       counter++;
     }

	cout<<bestLength;
	 
	getchar();
	getchar();
}
Ejemplo n.º 3
0
void FieldSystem::EventListener(IEvent* eventData)
{
	if(MousePositionEvent* event = dynamic_cast<MousePositionEvent*>(eventData))
	{
		glm::ivec2 mousePos = event->getMousePosition();
		m_pickedField = nullptr;

		//Simple mouse picking for field
		for(std::map<unsigned int, BaseComponent*>::iterator it = m_fieldComponents->begin(); it != m_fieldComponents->end(); ++it)
		{
			FieldComponent* fieldComp = static_cast<FieldComponent*>(it->second);
			unsigned int entityId = fieldComp->getEntityId();

			TransformComponent* transformComp = static_cast<TransformComponent*>((*m_transformComponents)[entityId]);
			SpriteComponent* spriteComp = static_cast<SpriteComponent*>((*m_spriteComponents)[entityId]);

			glm::vec4 bounds = glm::vec4(transformComp->getPosition().x * transformComp->getScale().x, transformComp->getPosition().y * transformComp->getScale().y, spriteComp->getTextureBounds().z * transformComp->getScale().x, spriteComp->getTextureBounds().w * transformComp->getScale().y);

			bool isPickedField = m_pickedField == nullptr && fieldComp->getIsPassable() && mousePos.x > bounds.x && mousePos.x < bounds.x + bounds.z && mousePos.y > bounds.y && mousePos.y < bounds.y + bounds.w;

			//Either showing start or goal to set
			switch(m_gameMode)
			{
			case MODE_CHOOSE_START:
				if(isPickedField)
				{
					fieldComp->setIsStart(true);
					m_pickedField = fieldComp;
				}
				else
				{
					fieldComp->setIsStart(false);
				}
				break;
			case MODE_CHOOSE_GOAL:
				if(isPickedField)
				{
					fieldComp->setIsGoal(true);
					m_pickedField = fieldComp;
				}
				else
				{
					fieldComp->setIsGoal(false);
				}
				break;
			case MODE_DONE:
				if (isPickedField)
				{
					m_pickedField = fieldComp;
				}
				break;
			default:
				break;
			}
		}
		RecalculateColors();
	}
	else if(MouseClickEvent* event = dynamic_cast<MouseClickEvent*>(eventData))
	{
		if (event->getButton() == sf::Mouse::Button::Left)
		{
			//Take enemy step/reculculate path or set start/goal
			if (m_gameMode == MODE_DONE)
			{
				m_eventManager->FireEvent<StepEvent>(new StepEvent());
				UpdatePheromones();
				RecalculateColors();
			}
			else
			{
				if (m_pickedField != nullptr)
				{
					switch (m_gameMode)
					{
					case MODE_CHOOSE_START:
						m_eventManager->FireEvent<StartSetEvent>(new StartSetEvent(m_pickedField));
						std::cout << "Start set" << std::endl;
						m_eventManager->FireEvent<ShowMessageEvent>(new ShowMessageEvent("Please choose a goal point."));
						m_gameMode = MODE_CHOOSE_GOAL;
						break;
					case MODE_CHOOSE_GOAL:
						m_eventManager->FireEvent<GoalSetEvent>(new GoalSetEvent(m_pickedField));
						std::cout << "Goal set" << std::endl;
						m_eventManager->FireEvent<ShowMessageEvent>(new ShowMessageEvent("Press mouse button for simulation step or 'A' for automatic mode."));
						m_gameMode = MODE_DONE;
						break;
					default:
						break;
					}
				}
			}
		}
		else if (event->getButton() == sf::Mouse::Button::Right)
		{
			if (m_pickedField != nullptr)
			{
				m_pickedField->setIsPassable(!m_pickedField->getIsPassable());
				m_pickedField->setCurrentPheromoneStrength(0);
				m_pickedField->setNewPheromoneStrength(0);
				RecalculateColors();
			}
		}
	}
	else if (KeyEvent* event = dynamic_cast<KeyEvent*>(eventData))
	{
		if (m_gameMode == MODE_DONE && event->getKey() == sf::Keyboard::A && event->getIsDown())
		{
			m_automaticModeEnabled = !m_automaticModeEnabled;
		}
	}
}