Exemplo 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;
        }
Exemplo 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;
        }