/// <summary> /// расчет пути к клетке с заданным типом, на удалении не более чем /// </summary> /// <param name="stm">тип поиска</param> /// <param name="roadlen">длинна допустимого маршрута</param> /// <param name="gunTime">заряд оружия противника</param> /// <returns>Тип и координаты хода</returns> internal IStep wayOfEvil(TypesOfField stm,int roadlen,int gunTime) { int distance = 1; //int goForFar = 0; bool found = false; int interationNum = 0; IStep s = StepsAndCoord.StepsBuilder ( EpsilonBot.api.getCoordOfMe (),Steps.STEP ); Queue<Ways> q1 = new Queue<Ways> (); // основная очередь Queue<Ways> q2 = new Queue<Ways> (); // Вспомогательная Ways temp = new Ways ( EpsilonBot.api.getCoordOfMe (),0,0,0,mind.He.gun ().getTimerVal,EpsilonBot.api.getCoordOfMe () ); List<Ways> allObjects = new List<Ways> (); // все сектора с необходимого типа List<Ways> unUsableSector = new List<Ways> (); List<Ways> unUseHelthSector = new List<Ways> (); q1.Enqueue ( temp.Clone () ); while (interationNum <-1 && !found) { while ((q1.Count > 0 || q2.Count > 0) && distance <= roadlen) { q2 = new Queue<Ways> (); // Вспомогательная while (q1.Count > 0) { temp = q1.Dequeue (); // достали вершину из очереди, пора узнать что в ней изменилось temp.gun ().decTimer (); temp.len = distance; //--1------------------ if (EpsilonBot.api.isNorm ( temp.xy )) { //--4----------------- // if (temp.gun ().getTimerVal > Gun.cminSaflyTime && mind.) { //--2------------------ if (EpsilonBot.api.getTypeOfField ( temp.xy ) == stm) { allObjects.Add ( temp ); // все сектора на допустимой длинне } else { //--3------------------- if (temp.gun ().getTimerVal > Gun.cminSaflyTime && EpsilonBot.api.getTypeOfField ( temp.xy ) != TypesOfField.NOTHING) { temp.getAllUsableSectors ( unUsableSector,q2 ); //всех соседей данной вершины графа в очередь unUsableSector.Add ( temp ); if (EpsilonBot.api.getTypeOfField ( temp.xy ) == TypesOfField.MEDKIT && TypesOfField.MEDKIT != stm) { unUseHelthSector.Add ( temp ); } }//--3--------------------- }//--2---------------------- //}//--4----------------------- }//--1----------------------- distance++; q1 = q2; } } //Ways w = null; //w = new Ways (); //w.xy.setX ( 1 ); //w.xy.setY ( 4 ); //allObjects.Add ( w ); //w = new Ways (); //w.xy.setX ( 4 ); //w.xy.setY ( 1 ); //allObjects.Add ( w ); if (allObjects.Count != 0) { //bool f=false; IStep st; if (!(allObjects[0].gun ().getTimerVal > Gun.cminSaflyTime)) { st = lookAround ( allObjects,unUseHelthSector,4 );/// если маршрут выгоднее то пойти по нему } // если не выполн то запомнить ближ вершину и продолжить искать // просмотреть окрестность <=4 такую, что есть аптечка // если нашли то записали в список, и проверили остальные ячейки на данной волне удов пред услов, и выбрали лучш // если не нашли то увеличить волну q1 = q2; goForFar++ если стало >2 то идем к самой удаленной точке // distance++; } else { interationNum++; } } return goToFar ();// s; }
/// <summary> ////движение к наиболее удаленной точке от бота /// </summary> /// <returns></returns> private IStep goToFar() { int distance = 0; bool found = false; IStep s = StepsAndCoord.StepsBuilder(EpsilonBot.api.getCoordOfMe(),Steps.STEP); Queue<Ways> q1 = new Queue<Ways> (); // основная очередь Queue<Ways> q2 = new Queue<Ways> (); // Вспомогательная Ways temp = new Ways ( EpsilonBot.api.getCoordOfMe (),0,0,0,mind.He.gun ().getTimerVal,EpsilonBot.api.getCoordOfMe () ); //mind.veryFar int maxLen = EpsilonBot.api.endAfterTime (); int j = 0; List<Ways> unUsableSector = new List<Ways> ();// список использованных вершин q1.Enqueue ( temp.Clone() ); while ((q1.Count > 0 || q2.Count > 0) && !found && maxLen>=distance) { q2 = new Queue<Ways> (); // Вспомогательная while ((q1.Count > 0)&&(!found)) { j++; temp = q1.Dequeue (); // достали вершину из очереди, пора узнать что в ней изменилось temp.gun ().decTimer (); temp.len = distance; //--1------------------ if (EpsilonBot.api.isNorm ( temp.xy )) { found = StepsAndCoord.isEcualCoord(temp.xy,mind.veryFar); //--2--------------------------- if(!found){ //unUsableSector.Add ( temp ); temp.getAllUsableSectors ( unUsableSector,q2 ); //всех соседей данной вершины графа в очередь }//--2------------------------ }//--1-------------------------- } q1 = q2; distance++; } if (found || maxLen == distance) { s = comeBack ( temp,unUsableSector );//StepsAndCoord.StepsBuilder ( temp.back,Steps.STEP ); } return s; }
//----------------------------------------------- /// <summary> /// </summary> /// <param name="x">отклоннения от родительской вершины</param> /// <param name="y">отклоннения от родительской вершины</param> /// <param name="result">список выходных значений</param> /// <param name="unUseNode">вершины побывавшие в очереди</param> /// <param name="parent">родительская вершина</param> internal void getUsableSector(int x,int y,List<Ways> result,List<Ways> unUseNode,Ways parent) { Ways temp = new Ways ( parent.xy, parent.money, parent.health, parent.len, parent.gun().getTimerVal, StepsAndCoord.Coordinates ( x,y ) ); temp.xy = StepsAndCoord.Coordinates ( x,y ); if (EpsilonBot.api.isNorm ( temp.xy )) { // если внутри поля // если не стена и еще не посещена if (( EpsilonBot.api.getTypeOfField ( temp.xy ) != TypesOfField.WALL) && !isFound(temp.xy,unUseNode) ) { result.Add ( temp.Clone() ); // помещаем в очередь для дальнейшей обработки unUseNode.Add ( temp.Clone() ); } } }
///// <summary>выяснить в каком направлении двигаться из начальной позиции ///// </summary> private IStep comeBack(Ways sector,List<Ways> unUsableSector) { int i; IStep s = StepsAndCoord.StepsBuilder (EpsilonBot.api.getCoordOfMe (),Steps.STEP ); while (!StepsAndCoord.isEcualCoord ( sector.back, EpsilonBot.api.getCoordOfMe () )) { i = sector.getIndexIn ( sector.back, unUsableSector ); sector = unUsableSector[i].Clone (); } return StepsAndCoord.StepsBuilder(sector.xy,Steps.STEP); }
/// <summary> возврат копии сектора /// </summary> /// <param name="w"></param> /// <returns></returns> //internal void q212copyWays(Ways w) { // back.Copy ( w.back ); // money = w.money; // health = w.health; // len = w.len; // gun ().TurnOnTimer ( w.gun().getTimerVal ); // xy = new CCoordinates (); // xy.Copy ( w.xy ); //} internal Ways Clone() { Ways x = new Ways (); x.back.Copy(back); x.money = money; x.health = health; x.len = len; x.gun().TurnOnTimer ( gun ().getTimerVal ); CCoordinates XY = new CCoordinates (); XY.Copy( this.xy ); x.xy = XY; return x; }