void ICP::DcGS(void) const { // Go search NoParameters(); if (IsGameOver()) ReportGameOver(); else { Move move; FindMove(move); PrintFSL(fsLbMove); move.Print(stateptr->FetchSearchFEnv()); PrintNL(); }; }
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; } } } }