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;
                }
            }
        }
Beispiel #2
0
        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();
                    }
                }
            }
        }
Beispiel #3
0
        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
        }