Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "SimpleStrategy.h"
- #include "BattleField.h"
- void SimpleStrategy::Move(Unit::UnitInfo &unitInfo, const SimpleStrategy::Direction &direction)
- {
- switch (direction)
- {
- case Right:
- unitInfo.second.Right();
- break;
- case Left:
- unitInfo.second.Left();
- break;
- case Up:
- unitInfo.second.Up();
- break;
- case Down:
- unitInfo.second.Down();
- break;
- }
- }
- void SimpleStrategy::MoveTo(Unit::UnitInfo &unitInfo, const SimpleStrategy::Direction &direction)
- {
- BattleField::getInstance().FreePosition(unitInfo.second);
- Move(unitInfo, direction);
- BattleField::getInstance().TakePosition(unitInfo.second);
- }
- void SimpleStrategy::MakeStep(const Hero &heroFrom, const Hero &heroTo)
- {
- Unit::Collection unitsFrom;
- heroFrom.GetUnits(unitsFrom);
- Unit::Collection unitsTo;
- heroTo.GetUnits(unitsTo);
- std::vector<Direction> Directions = {Right, Left, Up, Down};
- //суммарное расстоние от текущего юнита до всех противников
- //ходить будет тот юнит, у которого оно менбше всего
- int MinDistance = -1;
- //собственно юнит, котого будем двигать
- Unit::UnitInfo UnitToMove; //добавить: надо создать юнита по умолчанию
- //каким способом мы попали в нужное место
- Direction WayToMove;
- //перебираем всех юнитов из команды, чей сейчас ход
- for (auto unitFrom : unitsFrom)
- {
- Unit::UnitInfo CurrentUnit = unitFrom;
- //перебираем все направления, куда можем сходить им
- for(auto direction : Directions)
- {
- Move(CurrentUnit, direction);
- //если эта позиция свободна
- if (BattleField::getInstance().IsFreePosition(CurrentUnit.second))
- {
- int CurrentDistance = 0;
- //ищем это суммарное расстояние
- for (auto unitTo : unitsTo)
- {
- //если нашелся юнит из команды противника, то наносим удар
- if (AreNeighbours(CurrentUnit.second, unitTo.second))
- {
- Attack(unitFrom, unitTo);
- return;
- }
- CurrentDistance += GetDistance(CurrentUnit.second, unitTo.second);
- }
- if (MinDistance == -1 || CurrentDistance < MinDistance)
- {
- MinDistance = CurrentDistance;
- UnitToMove = UnitToMove;
- WayToMove = direction;
- }
- }
- }
- }
- //если нашелся юнит, который может передвинуться
- if (UnitToMove) //надо сделать нормальную проверку
- {
- MoveTo(UnitToMove, WayToMove);
- }
- //иначе надо обработать искоючение
- }
- void SimpleStrategy::Attack(Unit::UnitInfo &unitInfo, Unit::UnitInfo &unitInfoTo)
- {
- unitInfoTo.first->DecreaseUnitsOfLfe(unitInfo.first->GetPower());
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement