private void AddLocation(CCoord cell) { if (!map[cell.x, cell.y]) { map[cell.x, cell.y] = true; List.Add(cell); } }
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; }
public void SetExactLoc(CCoord coord) { if (LMap.EnemyDetected()) if (LMap.GetEnemyCoord().EqualsXY(coord)) return; LMap.SetExactLoc(coord); RemapTimeouts(); }
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()); }
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; }
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; }
public void Set(Steps steptype, CCoord coord) { Coord = coord; Type = steptype; }
public bool EqualsXY(CCoord eq) { return (eq != null) && (x == eq.x) && (y == eq.y); ; }
//устанавливает конкретное местоположение плохого бота public void SetExactLoc(CCoord coord) { ClearLocation(); AddLocation(coord.Clone()); }
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; }
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; }
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; }
private void SetEnemyExactLoc(CCoord coord, int ExpandVal) { Map.SetExactLoc(coord); for (int i = 0; i < ExpandVal; i++) Map.ExpandLocArea(); }
public void Set(CCoord coord) { Coord = coord; }
/// <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)); } } }
public bool EqualsD(CCoord eq) { return (eq != null) && (d == eq.d); }
private void DellLocation(CCoord cell) { if (map[cell.x, cell.y]) { map[cell.x, cell.y] = false; List.Remove(cell); } }
public void Copy(CCoord coord) { x = coord.x; y = coord.y; d = coord.d; }
/// <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; }
public static int MinButNotLowerThan(CCoord coord, int [,] map) { //заглушка return 1000; }
public CStep() { Coord = new CCoord(); Step = Steps.STEP; }