Пример #1
0
void ICP::DcGS(void) const
{
  // Go search

  NoParameters();
  if (IsGameOver()) ReportGameOver();
  else
  {
    Move move;

    FindMove(move);
    PrintFSL(fsLbMove); move.Print(stateptr->FetchSearchFEnv()); PrintNL();
  };
}
Пример #2
0
void MovingMonsters::MoveRound1() //поиск ходов ведущих прямо к приемнику
{
	//считаем расстояния до всех приемников
	FillDistances();
	//сортируем монстриков по расстоянию. чтобы сперва ходили те кто ближе и освобождали место для других. стандартный sort технически слжно использовать
	if (_monstersPositions.size() > 1)
	{
		for (size_t i=0; i < _monstersPositions.size() - 2; ++i)
		{
			for (size_t j=i+1; j<_monstersPositions.size() - 1; ++j)
			{
				if (_movesToRecievers[_monstersPositions[i]->Cell()] > _movesToRecievers[_monstersPositions[j]->Cell()])
				{
					std::swap(_monstersPositions[i], _monstersPositions[j]);
				}
			}
		}
	}

	//двигался ли хоть кто то из монстриков - возможно он освободил место для другого
	_somethingMoved = true;

	while (_somethingMoved)
	{
		_somethingMoved = false;
		//расстояния готовы - начинаем ход
		for (std::vector<Thief::HardPtr>::iterator it = _monstersPositions.begin(); it != _monstersPositions.end();)
		{
			//для каждого монстра
			if((*it)->IsKilled() || (*it)->GetAnimationName() == "thief_hide")
			{
				++it;
				continue;
			}
			Game::FieldAddress monsterFa((*it)->Cell());
			_minDistance = _movesToRecievers[monsterFa]; //чтобы не ухудщить текущее положение
			_possibleMoves.clear();
			//ищем лучшие пути
			FindMove(monsterFa, monsterFa.UP);
			FindMove(monsterFa, monsterFa.LEFT);
			FindMove(monsterFa, monsterFa.RIGHT);
			FindMove(monsterFa, monsterFa.DOWN);
			//если пути есть - идем по случайному
			if (!_possibleMoves.empty())
			{
				if (_minDistance == 0) //если дошли - проигрываем
				{
					if (checkThisReceiverCanFill(_possibleMoves)) //если эти приемники вот вот заполнится
					{
						it = _monstersPositions.erase(it); //ходить не будет, но и ходы не пропускает
					} else { //иначе поражение
						MonsterEat(monsterFa, _possibleMoves.front());
						_monstersPositions.clear();
						break;
					}
				}
				else
				{
					size_t count = _possibleMoves.size();
					size_t n = math::random(0u, count-1);
					//с кем меняемся
					Game::FieldAddress chipFa = _possibleMoves[n];
					int leftMoves = MoveMonster(monsterFa, chipFa);

					if (leftMoves > 0) //если ходы еще остались
					{
						_someMonsterStillCanMove = true;
					}

					//if (_minDistance == 1)
					//{
					//	//пират на расстоянии 
					//}

					it = _monstersPositions.erase(it); //удаляем монстрика потому что он уже ходил
				}

			} else {
				//монстрик в тупике - пропускает ходы
				int leftMoves = (*it)->GetMoves();
				(*it)->ChangeMoves(-leftMoves);
				++it;
			}

		}
	}
}