Ejemplo n.º 1
0
        /// <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;
        }
Ejemplo n.º 2
0
        /// <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;
        }
Ejemplo n.º 3
0
 //-----------------------------------------------
 /// <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() );
         }
     }
 }
Ejemplo n.º 4
0
        ///// <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);
        }
Ejemplo n.º 5
0
 /// <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;
 }