Esempio n. 1
0
 private void AddLocation(CCoord cell)
 {
     if (!map[cell.x, cell.y])
     {
         map[cell.x, cell.y] = true;
         List.Add(cell);
     }
 }
Esempio n. 2
0
 public static int Max(CCoord coord, int[,] arr)
 {
     int x = coord.x;
     int y = coord.y;
     int res = int.MaxValue;
     if (x > 0) res = Max(res, arr[x - 1, y]);
     if (y > 0) res = Max(res, arr[x, y - 1]);
     if (x < arr.GetUpperBound(1)) res = Max(res, arr[x + 1, y]);
     if (y < arr.GetUpperBound(2)) res = Max(res, arr[x, y + 1]);
     return res;
 }
Esempio n. 3
0
        public void SetExactLoc(CCoord coord)
        {
            if (LMap.EnemyDetected())
                if (LMap.GetEnemyCoord().EqualsXY(coord))
                    return;

            LMap.SetExactLoc(coord);
            RemapTimeouts();
        }
Esempio n. 4
0
        public void ReadMap(IAPI api)
        {
            CCoord coord = new CCoord();
            for (int x = 0; x < Width; x++)
                for (int y = 0; y < Height; y++)
                {
                    coord.Set(x, y);
                    this[x, y] = api.getTypeOfField(coord);
                }

            if (!MyCoord.EqualsXY(api.getCoordOfMe().X0, api.getCoordOfMe().Y0))
                throw new Exception("Ошибка в API. Несоответствие данных");

            CorrectEndTimeout(api.endAfterTime());
        }
Esempio n. 5
0
        public List<CCoord> GetEnemyVisibleArea(CCoord coord)
        {
            List<CCoord> result = new List<CCoord>();
            //добавим саму точку запроса:
            result.Add(coord.Clone());

            List<CCoord> list1 = GetAliedCells(coord, MaxVisibleDistance, false);
            List<CCoord> list2 = GetAliedCells(coord, MaxVisibleDistance, true);

            int[,] m = ListToArr(list1, Width, Height);

            foreach (CCoord t in list2)
                if (m[t.x, t.y] == t.d)
                    result.Add(t);
            return result;
        }
Esempio n. 6
0
        public int GetDistance(CCoord coord1, CCoord coord2)
        {
            int distance = -1;
            Queue<CCoord> q = new Queue<CCoord>();

            bool[,] isWasHere = new bool[BMap.Width, BMap.Height];

            CCoord a = new CCoord(coord1.x, coord1.y, 0);
            q.Enqueue(a);
            while (q.Count != 0)
            {
                a = q.Dequeue();
                if ((a.x >= 0) && (a.x < BMap.Width) && (a.y >= 0) && (a.y < BMap.Height))
                    if (!isWasHere[a.x, a.y] && (BMap[a.x, a.y] != TypesOfField.WALL))
                    {
                        isWasHere[a.x, a.y] = true;
                        if ((a.x == coord2.x) && (a.y == coord2.y))
                        {
                            distance = a.d;
                        } else
                        {
                            q.Enqueue(new CCoord(a.x + 1, a.y, a.d + 1));
                            q.Enqueue(new CCoord(a.x - 1, a.y, a.d + 1));
                            q.Enqueue(new CCoord(a.x, a.y + 1, a.d + 1));
                            q.Enqueue(new CCoord(a.x, a.y - 1, a.d + 1));
                        }
                    }
            }
            return distance;
        }
Esempio n. 7
0
 public void Set(Steps steptype, CCoord coord)
 {
     Coord = coord;
     Type = steptype;
 }
Esempio n. 8
0
 public bool EqualsXY(CCoord eq)
 {
     return (eq != null) && (x == eq.x) && (y == eq.y); ;
 }
Esempio n. 9
0
 //устанавливает конкретное местоположение плохого бота
 public void SetExactLoc(CCoord coord)
 {
     ClearLocation();
     AddLocation(coord.Clone());
 }
Esempio n. 10
0
        private List<CCoord> GetTrackToPoint(CCoord coord)
        {
            if (st.Map[coord.x, coord.y] == TypesOfField.WALL)
                throw new Exception("Попытка посчитать расстояние до стены");

            List<CCoord> result = new List<CCoord>();

            int d = coord.d;
            if (d == 0) d = int.MaxValue;

            List<CCoord> list = st.Map.GetAliedCells(st.MyCoord, d, true);

            int[,] arr = ListToArr(list);

            CCoord c = coord.Clone();

            //добавим самую последнюю точку маршрута
            result.Add(coord.Clone());

            while (!c.EqualsXY(st.MyCoord))
            {
                list = st.Map.GetAliedCells(c, 1, true);
                foreach (CCoord it in list) it.d = arr[it.x, it.y];
                list.Sort();
                c = list[0];
                result.Add(c);
            }
            result.Reverse();

            //удалим точку с которой начался маршрут
            result.RemoveAt(0);

            return result;
        }
Esempio n. 11
0
        List<CCoord> GetNearUpdates(CCoord coord,int MaxDistance)
        {
            List<CCoord> list = st.Map.GetAliedCells(coord, MaxDistance, true);

            List<CCoord> result = new List<CCoord>();

            foreach (CCoord it in list)
                if ((st.Map[it.x, it.y] == TypesOfField.BONUS) || (st.Map[it.x, it.y] == TypesOfField.MEDKIT))
                    result.Add(it);

            result.Sort();

            return result;
        }
Esempio n. 12
0
 private CCoord GetNearestFreeCell(CCoord coord)
 {
     CCoord res = new CCoord();
     if (st.Map[coord.x, coord.y] != TypesOfField.WALL)
         res = coord.Clone();
     else
     {
         List<CCoord> list = st.Map.GetAliedCells(coord, 15, true);
         CCoord it = list[0];
         int i = 1;
         while ((st.Map[it.x, it.y] == TypesOfField.WALL)&&(i<list.Count))
         {
             it = list[i];
             i++;
         }
         res = it;
     }
     return res;
 }
Esempio n. 13
0
        private void SetEnemyExactLoc(CCoord coord, int ExpandVal)
        {
            Map.SetExactLoc(coord);

            for (int i = 0; i < ExpandVal; i++)
                Map.ExpandLocArea();
        }
Esempio n. 14
0
 public void Set(CCoord coord)
 {
     Coord = coord;
 }
Esempio n. 15
0
        /// <summary>
        /// Вычисляет таймаут "чистоты" клетки в TMap заданной сoord и "волной" изменяет таймаут
        /// во всех граничащих с coord клетках.
        /// Вычисление таймаута в самой клетке происходит путем нахождения минимума среди 
        /// значений ее четырех соседних клеток и знаачением переданным в параметре coord.d
        /// Причем минимум не может быть меньше "-1", разве, что если такое значение содержит параметр coord.d!
        /// В принципе это должно быть очевидно так как клетка со значением  меньше "-1" либо стена, либо она в поле видимости.
        /// !!!Внимание, в данном методе не происходит автоматического удаления клеток  с LMap, так как предпологается, что они там заведомо не содержатся
        /// </summary>
        /// <param name="coord">Указывает координаты клетки(coord.x, coord.y), и некоторое начальное значение(coord.d) </param>
        private void ProcessTimeoutCell(CCoord coord)
        {
            TMap[coord.x, coord.y] = CTimeoutMap.Stable;

            Queue<CCoord> q = new Queue<CCoord>();

            int x = coord.x;
            int y = coord.y;
            int d = coord.d;

            {//если значение какой-то соседней клетки  меньшее d, то присваиваем d новое значение;
                if (x > 0) if (TMap[x - 1, y] >= -1) d = Useful.Min(TMap[x - 1, y], d);
                if (y > 0) if (TMap[x, y - 1] >= -1) d = Useful.Min(TMap[x, y - 1], d);
                if (x < TMap.Width) if (TMap[x + 1, y] >= -1) d = Useful.Min(TMap[x + 1, y], d);
                if (y < TMap.Height) if (TMap[x, y + 1] >= -1) d = Useful.Min(TMap[x, y + 1], d);
            }

            CCoord a = new CCoord(coord.x, coord.y, d);
            q.Enqueue(a);
            while (q.Count != 0)
            {
                a = q.Dequeue();
                if ((a.x >= 0) && (a.x < Width) && (a.y >= 0) && (a.y < Height))//если внутри карты
                    if (TMap[a.x, a.y] >= 0)//если клетка с  неотрицательным временем
                        if (TMap[a.x, a.y] > a.d)
                        {
                            TMap[a.x, a.y] = a.d;
                            //if (a.d >= 0) LMap.DellLocation(new CCoordEx(x, y));
                            q.Enqueue(new CCoord(a.x + 1, a.y, a.d + 1));
                            q.Enqueue(new CCoord(a.x - 1, a.y, a.d + 1));
                            q.Enqueue(new CCoord(a.x, a.y + 1, a.d + 1));
                            q.Enqueue(new CCoord(a.x, a.y - 1, a.d + 1));
                        }
            }
        }
Esempio n. 16
0
 public bool EqualsD(CCoord eq)
 {
     return (eq != null) && (d == eq.d);
 }
Esempio n. 17
0
 private void DellLocation(CCoord cell)
 {
     if (map[cell.x, cell.y])
     {
         map[cell.x, cell.y] = false;
         List.Remove(cell);
     }
 }
Esempio n. 18
0
 public void Copy(CCoord coord)
 {
     x = coord.x;
     y = coord.y;
     d = coord.d;
 }
Esempio n. 19
0
        /// <summary>
        ///      Выдает список координат клеток(а также расстояние), которые раcположены
        ///      рядом с  клетокой заданной coord, причем  расстояние до которых не более MaxDistance
        /// </summary>
        /// <param name="ConsiderWall">Учитывать ли стены при расчитывании растояния</param>
        /// <returns>"Список List с элементами координат клеток и растояний" </returns>     
        public List<CCoord> GetAliedCells(CCoord coord, int MaxDistance, bool ConsiderWall)
        {
            List<CCoord> List = new List<CCoord>();
            Queue<CCoord> q = new Queue<CCoord>();
            bool[,] isWasHere = new bool[BMap.Width, BMap.Height];

            CCoord a = new CCoord(coord.x, coord.y, 0);
            q.Enqueue(a);
            while (q.Count != 0)
            {
                a = q.Dequeue();
                if ((a.x >= 0) && (a.x < BMap.Width) && (a.y >= 0) && (a.y < BMap.Height))
                    if (!isWasHere[a.x, a.y] && (!ConsiderWall || (BMap[a.x, a.y] != TypesOfField.WALL)))
                    {
                        isWasHere[a.x, a.y] = true;
                        if (a.d <= MaxDistance)
                        {
                            List.Add(new CCoord(a.x, a.y, a.d));

                            q.Enqueue(new CCoord(a.x + 1, a.y, a.d + 1));
                            q.Enqueue(new CCoord(a.x - 1, a.y, a.d + 1));
                            q.Enqueue(new CCoord(a.x, a.y + 1, a.d + 1));
                            q.Enqueue(new CCoord(a.x, a.y - 1, a.d + 1));
                        }
                    }
            }
            //так как нужны только смежные то удаляем саму точку запроса
            List.RemoveAt(0);

            return List;
        }
Esempio n. 20
0
 public static int MinButNotLowerThan(CCoord coord, int [,] map)
 {
     //заглушка
     return 1000;
 }
Esempio n. 21
0
 public CStep()
 {
     Coord = new CCoord();
     Step = Steps.STEP;
 }