public override void Update(long elapsedMilliseconds) { var deers = MapObjects.GetAll <Deer>(); var wolves = MapObjects.GetAll <Wolf>(); foreach (var deer in deers) { //проверяю чтобы олени не вышли из полигона if (deer.Coordinate.X < _leftX - _barier || deer.Coordinate.Y < _downY - _barier) { deer._speed = _deerSeed; } else if (deer.Coordinate.X > _rightX - _barier || deer.Coordinate.Y > _upY - _barier) { deer._speed = -_deerSeed; } deer.MoveUpRight(); } foreach (var wolf in wolves) { var nearestDeer = deers.Aggregate((deer1, deer2) => PointExtension.Distance((Point)wolf, (Point)deer1) < PointExtension.Distance((Point)wolf, (Point)deer2) ? deer1 : deer2); wolf.MoveUpRight(new Coordinate(nearestDeer.X, nearestDeer.Y)); //Ищем ближайшего волка var minDistance = double.MaxValue; foreach (var _wolf in wolves.Where(_wolf => (PointExtension.Distance((Point)wolf, (Point)_wolf) < minDistance) && (PointExtension.Distance((Point)wolf, (Point)_wolf) > 0))) { minDistance = (PointExtension.Distance((Point)wolf, (Point)_wolf)); } if (minDistance < 250) { if (wolf._flagPack == false) { Console.WriteLine(minDistance); wolf.WolfInThePack(); wolf._flagPack = true; } } else { wolf._speed = _wolfSpeed; wolf._flagPack = false; } if (!wolf.CanEat(nearestDeer)) { continue; } MapObjects.Remove(nearestDeer); deers.Remove(nearestDeer); var newDeerCoordinate = GenerateCoordinatesAnimal(1)[0]; MapObjects.Add(new Deer(newDeerCoordinate, 10)); } }
public async Task MethodWithDelayAsync(int milliseconds) { await Task.Delay(milliseconds); endResearch = true; MapObjects.Remove(objRes); Console.WriteLine("Исследование закончилось 😎😎😎😎"); // ищем ближайщий объект int minIndex = 0; double min = 0; int i = 0; var objOnMap = MapObjects.GetAll <ObjResearch>(); foreach (var minDist in objOnMap) { if (min == 0) { min = TestModule.Distance(submarine, minDist); i++; continue; } if (min > TestModule.Distance(submarine, minDist)) { min = TestModule.Distance(submarine, minDist); minIndex = i; } i++; } objRes = objOnMap[minIndex]; }
// Этот метод вызывается регулярно, поэтому тут все действия, которые будут повторяться public override void Update(long elapsedMilliseconds) { var actors = MapObjects.GetAll <Actor>(); Console.WriteLine($"Got {actors.Count} actors\n"); // Для каждого актёра проверяем условия и назначаем новую активность если нужно foreach (var actor in actors) { // Есть ли активность bool isActivity = actor.Activity != null; // Если активность дороги домой bool goHome = isActivity ? actor.Activity is MovementActivityHome : false; // Если ли активность ожидания bool goWait = isActivity ? actor.Activity is WaitingActivityHome : false; Console.WriteLine($"Flags: {isActivity} {goHome} {goWait}"); if (!isActivity) { // Назначить актору путь до дома Console.WriteLine("Said actor go home\n"); actor.Activity = new MovementActivityHome(); } } }
// Этот метод будет вызван один раз при запуске, соответственно тут вся инициализация protected override void Initialize() { State state = new State() { Hunger = 100, // Интервал можно задать через объекты LocalTime HomeTime = new TimeInterval(new LocalTime(20, 0), new LocalTime(18, 23)), }; // Создаём акторов for (int i = 0; i < 2; i++) { Console.WriteLine($"Creating actor {i + 1}"); // Делаем для каждого точку дома и точку работы в квадрате заданного радиуса от точки спавна state.Home = new Point(x + offset, y + offset); state.Job = new Point(x + offset, y + offset); Console.WriteLine($"Home at {state.Home.X}, {state.Home.Y}; " + $"Job at {state.Job.X}, {state.Job.Y}"); // Создаём актора с заданным состоянием // Так как в конструкторе актора состояние копируется, // можно использовать один и тот же объект состояния для инициализации, // при этом каждый актор получит отдельный объект, не связанный с другими Actor actor = new Actor(x, y, state); // Добавляем актора в объекты карты MapObjects.Add(actor); var firstCoordinate = new Coordinate(x, y); var secondCoordinate = new Coordinate(state.Home.X, state.Home.Y); Console.WriteLine($"Coor {firstCoordinate} and {secondCoordinate}"); Console.WriteLine("Building path..."); MapObjects.Add(new Highlighted(new Geometry[] { PathsFinding.GetPath(firstCoordinate, secondCoordinate, "Walking").Result })); Console.WriteLine("Path was builded"); } // Получаем список акторов на карте и выводим их количество var actors = MapObjects.GetAll <Actor>(); Console.WriteLine($"Added {actors.Count} actors"); foreach (var actor in actors) { Console.WriteLine($"Actor on ({actor.Coordinate.X}, {actor.Coordinate.Y})\n" + $"\tHome at {actor.State.Home.X}, {actor.State.Home.Y}\n"); } }
protected override void Initialize() { //Добавление созданных объектов в общий список, доступный всем модулям. Объекты из данного списка отображаются на карте. MapObjects.Add(new Airport(china, 20)); MapObjects.Add(new Airport(moscow, 13)); MapObjects.Add(new Airport(iraq, 9)); MapObjects.Add(new Airport(afganistan, 7)); MapObjects.Add(new Airport(usa, 17)); allAirports = MapObjects.GetAll <Airport>(); }
//Движение самолетов в их пункты назначения-аэропорты и их удаление при достижении пункта назначения public void Fly() { foreach (var airplane in MapObjects.GetAll <Airplane>()) { int flew = airplane.MoveToAirport(); if (flew != -1) { RemoveAirplane(airplane); } } }
//Создание самолетов в аэропорте, если они там существуют public void CreateAirplanes() { foreach (var airport in allAirports) { if (airport.Count != 0) { CreateAirplane(airport.FlyOff(allAirplanes.Count, allAirports[new Random().Next(0, 5)])); allAirplanes = MapObjects.GetAll <Airplane>(); } } }
protected override void Initialize() { // добавляем регион подводной лодки и подлодку MapObjects.Add(new Region(_leftX, _rightX, _upY, _downY).polygon); MapObjects.Add(new Submarine(new Coordinate(-14000000, -7000000), 5000)); // создаем таймер на создание объектов для исследование каждые 5с Init(); //Получим объект подлодки и объекта для исследования objRes = MapObjects.GetAll <ObjResearch>()[0]; submarine = MapObjects.GetAll <Submarine>()[0]; }
/// <summary> /// Вызывается постоянно, здесь можно реализовывать логику перемещений и всего остального, требующего времени. /// </summary> /// <param name="elapsedMilliseconds">TimeNow.ElapsedMilliseconds</param> public override void Update(long elapsedMilliseconds) { // Двигаем самолет. submarine.MoveToObj(MapObjects); if (MapObjects.GetAll <Point>().Count < 10) { int x = random.Next(-6500000, -4500000); int y = random.Next(2500000, 4500000); var obj = new IntrestingObj(new Coordinate(x, y)); MapObjects.Add(obj); } }
public override void Update(long elapsedMilliseconds) { // List<Truck> trucks = MapObjects.GetAll<Truck>(); List <Provider> Providers = MapObjects.GetAll <Provider>(); List <Customer> Customers = MapObjects.GetAll <Customer>(); var truks = MapObjects.GetAll <Truck>(); if (truks.Count < 35 && Rand.MayBe(0.2)) { var weight = Rand.GenerateInRange(250, 5000); MapObjects.Add(new Truck(new Coordinate(Providers[Rand.GenerateInRange(0, 17)].Coordinate), weight, Rand.GenerateInRange(80, 130), new Coordinate(Customers[Rand.GenerateInRange(0, 32)].Coordinate))); Console.WriteLine("Машина отправлена " + weight + " кг"); } if (Rand.MayBe(0.001)) { Console.WriteLine("Машина сломалась"); MapObjects.Remove(truks[Rand.GenerateInRange(1, truks.Count - 1)]); } truks = MapObjects.GetAll <Truck>(); foreach (var truck in truks) { if (!truck.InObj()) { truck.Move(); } else if (truck.loaded) { Console.WriteLine("Машина доехала до заказчика"); truck.loaded = false; truck.goHome(); } else if (!truck.loaded) { Console.WriteLine("Машина приехала с заказа"); MapObjects.Remove(truck); } } //Console.WriteLine(MapObjects.GetAll<Truck>().Count); }
public override void Update(long elapsedMilliseconds) { Generator generator = MapObjects.Get <Generator>()[0]; DispatherStation dispatherStation = MapObjects.Get <DispatherStation>()[0]; List <Wire> wires = MapObjects.GetAll <Wire>(); List <Consumer> consumers = MapObjects.GetAll <Consumer>(); List <Electritian> electritians = MapObjects.GetAll <Electritian>(); List <Electritian> freeElectritians = electritians.Where(x => x.target == null).ToList(); foreach (var consumer in consumers) { bool consumedSuccessfully = consumer.Consume(elapsedMilliseconds); bool consumerIsPending = dispatherStation.consumersBeingProcessed.ContainsKey(consumer) && dispatherStation.consumersBeingProcessed[consumer]; if (!consumedSuccessfully && !consumerIsPending) { Console.WriteLine(String.Format("Потребитель {0} отправил запрос", consumer.getName())); dispatherStation.consumersBeingProcessed[consumer] = true; dispatherStation.pendingRequests.Add(consumer); } } while (freeElectritians.Count > 0 && dispatherStation.pendingRequests.Count > 0) { freeElectritians[0].setConsumerProcessed(dispatherStation.pendingRequests[0]); Console.WriteLine(String.Format("Электрик отправился выполнять запрос {0}", dispatherStation.pendingRequests[0].getName())); freeElectritians.RemoveAt(0); dispatherStation.pendingRequests.RemoveAt(0); } foreach (Electritian e in electritians) { e.MovePath(); } foreach (Electritian e in electritians.Where(x => x.target != null).ToList()) { if (e.Distance(e.target.getCoordinate()) < 1) { bool isFixed = false; if (e.target.isBroken()) { e.target.getFixed(); isFixed = true; Console.WriteLine(String.Format("Провод {0} починен", e.target.getName())); } else { var source = e.target.getElectriticySource(); if (source == null) { isFixed = true; } else { e.setTarget(source); } } if (isFixed) { dispatherStation.consumersBeingProcessed[e.consumerBeingProcessed] = false; e.clearConsumerProcessed(); } } } }
public override void Update(long elapsedMilliseconds) { var waterPump = MapObjects.Get <WaterPump>()[0]; var treatmentFacilities = MapObjects.Get <TreatmentFacilities>()[0]; var reservoir = MapObjects.Get <Reservoir>()[0]; var conduit = MapObjects.GetAll <Conduit>(); var users = MapObjects.GetAll <User>(); var riverWater = MapObjects.GetAll <RiverWater>(); var cleanWater = MapObjects.GetAll <CleanWater>(); // Проверяем не сломан ли насос if (!waterPump.CheckFailure()) { if (reservoir._volumeOfWaterInTheReservoir < reservoir._minVolumeOfWater && waterFromRiver < reservoir._size - reservoir._volumeOfWaterInTheReservoir - 1000) { var water = new RiverWater(new Coordinate(waterIntakeCoord), MoveValue(waterIntakeCoord, waterPumpCoord, 50)); MapObjects.Add(water); waterFromRiver += rnd.Next(800, 1000); Console.WriteLine($"Перемещение {waterFromRiver} литров воды в резервуары"); } if (riverWater != null) { if (errFlag) { Console.WriteLine("Насос в норме!"); errFlag = false; } foreach (var water in riverWater) { water.Move(); if (water.InPlace(waterPump)) { Console.WriteLine("Насос пройден"); (water._moveX, water._moveY) = MoveValue(waterPumpCoord, treatmentFacilitiesCoord, 200); } if (water.InPlace(treatmentFacilities)) { Console.WriteLine("Система очистки пройдена"); (water._moveX, water._moveY) = MoveValue(treatmentFacilitiesCoord, reservoirCoord, 50); } if (water.InPlace(reservoir)) { reservoir.GetWater(waterFromRiver); waterFromRiver = 0; MapObjects.Remove(water); Console.WriteLine($"В резервуаре {reservoir._volumeOfWaterInTheReservoir} тонн воды"); } } } if (users == null) { return; } { foreach (var user in users) { if (user.flag) { continue; } var waterToUserCoord = user.GetNearestPoint(conduit); var waterToUser = new CleanWater(waterToUserCoord, MoveValue(waterToUserCoord, user.Coordinate, rnd.Next(50, 150))); MapObjects.Add(waterToUser); user.flag = true; } if (cleanWater == null) { return; } foreach (var water in cleanWater) { foreach (var user in users.Where(user => water.InPlace(user))) { reservoir.ToGiveWaterOfUser(rnd.Next(5, 25)); MapObjects.Remove(water); MapObjects.Remove(user); var newUserCoord = GenerateCoordinatesUsers(1); MapObjects.Add(new User(newUserCoord.ElementAt(0))); } water.Move(); } } } else { Console.WriteLine("Насос сломался!"); errFlag = true; waterFromRiver = 0; foreach (var river_water in riverWater) { MapObjects.Remove(river_water); } foreach (var clean_water in cleanWater) { MapObjects.Remove(clean_water); } foreach (var user in users) { user.flag = false; } } }
protected override void Initialize() { #region создание базовых объектов // (Следует обратить внимание, что все координаты у всех геометрических объектов задаются в сферической проекции Меркатора (EPSG:3857).) // Создание координаты точки в начале координат. var pointCoordinate = new Coordinate(0, 0); // Создание стандартной точки в созданных ранее координатах. point = new Point(pointCoordinate); // Создание координат для линии. var lineCoordinates = new Coordinate[] { point.Coordinate, new Coordinate(0, -2000000), new Coordinate(-3000000, -1500000) }; // Создание стандартной кривой линии по ранее созданным координатам. line = new LineString(lineCoordinates); // Создание координат полигона. var polygonCoordinates = new Coordinate[] { new Coordinate(4000000, 5000000), new Coordinate(6000000, 0), new Coordinate(6000000, 6000000), new Coordinate(4000000, 5000000) }; // Создание стандартного полигона по ранее созданным координатам. polygon = new Polygon(new LinearRing(polygonCoordinates)); #endregion #region создание базовых объектов // Добавление созданных объектов в общий список, доступный всем модулям. Объекты из данного списка отображаются на карте. MapObjects.Add(point); MapObjects.Add(line); MapObjects.Add(polygon); #endregion #region создание кастомного объекта и добавление на карту, модификация полигона заменой точки // Координаты самолёта, сконвертированные из Lat/Lon координат. Примерно в аэропорту "Internacional de Carrasco". var airplaneCoordinate = MathExtensions.LatLonToSpherMerc(-34.831747, -56.020034); // Скорость самолета, опять же, в сферической проекции Меркатора. var airplaneSpeed = 1000; // Создание объекта класса "самолет", реализованного в рамках данного модуля. airplane = new Airplane(airplaneCoordinate, airplaneSpeed); // Добавление самолета в список объектов. MapObjects.Add(airplane); // Заменим одну из точек ранее созданного полигона только что созданным самолетом. polygonCoordinates[2] = airplaneCoordinate; #endregion #region демонстрация получения данных из коллекции MapObjects // Коллекция MapObjects нужна не только для хранения и отображения объектов, но ещё и для удобного доступа к ним. // Попробуем получить все объекты, являющиеся строго точками. var onlyPoints = MapObjects.Get <Point>(); // Будет возвращена точка, созданная в самом начале. // А теперь получим все объекты, являющиеся точками и наследующиеся от точек (а также наследников наследников). var allPoints = MapObjects.GetAll <Point>(); // Будет возвращена точка, созданная в самом начале и самолет. // А теперь получим ВСЕ объекты на карте. var allMapObjects = MapObjects.GetAll <Geometry>(); // Будут возвращены все 4 созданных нами объекта. #endregion }
public override void Update(long elapsedMilliseconds) { int check = 0; for (int i = 0; i < MapObjects.GetAll <VitalFunctions>().Count; i++) { if (ospa.generate(MapObjects.GetAll <VitalFunctions>()[i]) == -1 && checkGenOspa) { MapObjects.Add(new HumanVirus(new Coordinate(MapObjects.GetAll <VitalFunctions>()[i].X + 1, MapObjects.GetAll <VitalFunctions>()[i].Y + 1), "Оспа", "Airborne", 20, MapObjects.GetAll <VitalFunctions>()[i])); Console.WriteLine("Вирус оспы появился на карте!"); checkGenOspa = false; break; } } for (int i = 0; i < MapObjects.GetAll <VitalFunctions>().Count; i++) { if (animVirus.generate(MapObjects.GetAll <VitalFunctions>()[i]) == -1 && checkGenAnim) { MapObjects.Add(new AnimalVirus(new Coordinate(MapObjects.GetAll <VitalFunctions>()[i].X + 1, MapObjects.GetAll <VitalFunctions>()[i].Y + 1), "Вирус животного", "Airborne", 20, MapObjects.GetAll <VitalFunctions>()[i])); Console.WriteLine("Вирус животного появился на карте!"); checkGenAnim = false; break; } } for (int i = 0; i < MapObjects.GetAll <VitalFunctions>().Count; i++) { if (univ.generate(MapObjects.GetAll <VitalFunctions>()[i]) == -1 && checkGenUniv) { MapObjects.Add(new UniversalVirus(new Coordinate(MapObjects.GetAll <VitalFunctions>()[i].X + 1, MapObjects.GetAll <VitalFunctions>()[i].Y + 1), "Универсальный вирус", "Contact", 20, MapObjects.GetAll <VitalFunctions>()[i])); Console.WriteLine("Универсальный вирус появился на карте!" + MapObjects.GetAll <UniversalVirus>()[0]); checkGenUniv = false; break; } } if (checkGenOspa == false && checkGenAnim == false && checkGenUniv == false) { //пытаться заразить всех оспой foreach (var vir in MapObjects.GetAll <HumanVirus>()) { foreach (var person in MapObjects.GetAll <VitalFunctions>()) { if (vir.name == "Оспа") { if (vir.infect(person) == 2) { MapObjects.Add(new HumanVirus(new Coordinate(person.X + 1, person.Y + 1), "Оспа", "Airborne", 20, person)); Console.WriteLine("Вирус оспы добавлен на карту!"); } } } } //пытаться заразить всех животным вирусом foreach (var vir in MapObjects.GetAll <AnimalVirus>()) { foreach (var person in MapObjects.GetAll <VitalFunctions>()) { if (vir.name == "Вирус животного") { if (vir.infect(person) == 2) { MapObjects.Add(new AnimalVirus(new Coordinate(person.X + 1, person.Y + 1), "Вирус животного", "Airborne", 20, person)); Console.WriteLine("Вирус животного добавлен на карту!"); } } } } //пытаться заразить всех универсальным вирусом foreach (var vir in MapObjects.GetAll <UniversalVirus>()) { foreach (var person in MapObjects.GetAll <VitalFunctions>()) { if (vir.name == "Универсальный вирус") { if (vir.infect(person) == 2) { MapObjects.Add(new UniversalVirus(new Coordinate(person.X + 1, person.Y + 1), "Универсальный вирус", "Contact", 20, person)); Console.WriteLine("Универсальный вирус добавлен на карту!"); } } } } foreach (var person in MapObjects.GetAll <VitalFunctions>()) { if (person.infectionName == "Оспа") { Console.WriteLine("Количество человеческих вирусов на карте: " + MapObjects.GetAll <HumanVirus>().Count); if (person.convalescence(ospa, animVirus, univ, 1) == -1) { Console.WriteLine(person + " вылечился"); foreach (var vir in MapObjects.GetAll <HumanVirus>()) { if (vir.hum == person) { Console.WriteLine("Вирус оспы удален с карты!"); MapObjects.Remove(vir); } } } } else if (person.infectionName == "Вирус животного") { Console.WriteLine("Количество животных вирусов на карте: " + MapObjects.GetAll <AnimalVirus>().Count); if (person.convalescence(ospa, animVirus, univ, 2) == -1) { Console.WriteLine(person + " вылечился"); foreach (var vir in MapObjects.GetAll <AnimalVirus>()) { if (vir.animal == person) { Console.WriteLine("Вирус животного удален с карты!"); MapObjects.Remove(vir); } } } } else if (person.infectionName == "Универсальный вирус") { Console.WriteLine("Количество универсальных вирусов на карте: " + MapObjects.GetAll <UniversalVirus>().Count); if (person.convalescence(ospa, animVirus, univ, 3) == -1) { Console.WriteLine(person + " вылечился"); foreach (var vir in MapObjects.GetAll <UniversalVirus>()) { if (vir.who == person) { Console.WriteLine("Универсальный вирус удален с карты!"); MapObjects.Remove(vir); } } } } int go = person.Move(); //идём в рандомное место if (go == -1) { switch (new Random().Next(0, 4)) { case 0: person.CoordTo = new Coordinate(person.Coord.X + new Random().Next(0, 500), person.Coord.Y + new Random().Next(0, 500)); break; case 1: person.CoordTo = new Coordinate(person.Coord.X + new Random().Next(0, 500), person.Coord.Y - new Random().Next(0, 500)); break; case 2: person.CoordTo = new Coordinate(person.Coord.X - new Random().Next(0, 500), person.Coord.Y + new Random().Next(0, 500)); break; case 3: person.CoordTo = new Coordinate(person.Coord.X - new Random().Next(0, 500), person.Coord.Y - new Random().Next(0, 500)); break; } } } foreach (var vir in MapObjects.GetAll <HumanVirus>()) { vir.changeCoord(); } foreach (var vir in MapObjects.GetAll <AnimalVirus>()) { vir.changeCoord(); } foreach (var vir in MapObjects.GetAll <UniversalVirus>()) { vir.changeCoord(); } foreach (var person in MapObjects.GetAll <VitalFunctions>()) { if (person.infected) { Console.WriteLine(person + " болен " + person.infectionName + " и имеет " + person.health + " здоровья"); } } } for (int i = 0; i < MapObjects.GetAll <VitalFunctions>().Count; i++) { if (!MapObjects.GetAll <VitalFunctions>()[i].infected) { check++; } if (check == 7) { Console.WriteLine("Все вылечились!"); } } }