示例#1
0
        /// <summary>
        /// Triggered when someone has pressed the down button at a floor.
        /// Note that passengers will press the button again if they fail to enter an elevator.
        /// Maybe tell an elevator to go to this floor?
        /// </summary>
        /// <param name="skyscraperDto"></param>
        /// <returns></returns>
        public ContentResult DownButtonPressed(SkyscraperDto skyscraperDto)
        {
            var skyscraper = SyncSkyscraper(skyscraperDto);
            var floor      = skyscraper.Floors[skyscraperDto.EventRaisedFloorNumber];
            var elevators  = skyscraper.Elevators;

            foreach (var elevator in elevators)
            {
                // We use these two queues to keep track of new destinations so that we can create elevator commands
                elevator.NewDestinations.Clear();
                elevator.JumpQueueDestinations.Clear();
            }

            // This invokes the delegate from IPlayer
            ElevatorCommands elevatorCommands;

            try
            {
                floor.OnDownButtonPressed(elevators.ToArray());
                elevatorCommands = CreateElevatorCommands(skyscraperDto, skyscraper);
            }
            catch (System.Exception e)
            {
                elevatorCommands = new ElevatorCommands {
                    Message = e.Message
                };
            }

            var json = JsonConvert.SerializeObject(elevatorCommands);

            return(Content(json, "application/json"));
        }
示例#2
0
        /// <summary>
        /// Transfer all required data from client.
        /// </summary>
        /// <param name="skyscraperDto"></param>
        /// <returns></returns>
        internal static Skyscraper SyncSkyscraper(SkyscraperDto skyscraperDto)
        {
            var skyscraper = LoadSkyscraper();

            for (var i = 0; i < skyscraperDto.Elevators.Count; i++)
            {
                skyscraper.Elevators[i].PressedFloors        = skyscraperDto.Elevators[i].PressedFloors;
                skyscraper.Elevators[i].LoadFactor           = skyscraperDto.Elevators[i].LoadFactor;
                skyscraper.Elevators[i].GoingDownIndicator   = skyscraperDto.Elevators[i].GoingDownIndicator;
                skyscraper.Elevators[i].GoingUpIndicator     = skyscraperDto.Elevators[i].GoingUpIndicator;
                skyscraper.Elevators[i].CurrentFloor         = skyscraperDto.Elevators[i].CurrentFloor;
                skyscraper.Elevators[i].DestinationDirection = skyscraperDto.Elevators[i].DestinationDirection;

                skyscraper.Elevators[i].DestinationQueue.Clear();
                if (skyscraperDto.Elevators[i].DestinationQueue == null)
                {
                    continue;
                }
                foreach (var floor in skyscraperDto.Elevators[i].DestinationQueue)
                {
                    skyscraper.Elevators[i].DestinationQueue.Enqueue(floor);
                }
            }

            return(skyscraper);
        }
示例#3
0
        static void Main(string[] args)
        {
            foreach (Level level in Levels.GetLevels())
            {
                SkyscraperDto skyscraperDto = new SkyscraperDto
                {
                    Floors    = new List <FloorDto> (),
                    Elevators = new List <ElevatorDto> ()
                };

                for (int i = 0; i < level.FloorCount; i++)
                {
                    skyscraperDto.Floors.Add(new FloorDto {
                        FloorNumber = i
                    });
                }

                for (int i = 0; i < level.ElevatorCount; i++)
                {
                    skyscraperDto.Elevators.Add(new ElevatorDto {
                        CurrentFloor = 0, MaxPassengerCount = level.MaxPassengerCount
                    });
                }

                var skyscraper = new Skyscraper(skyscraperDto);
                var player     = new Dev2Player();
                skyscraper.LoadPlayer(player);

                InitialiseGame(skyscraper, level);
            }
        }
示例#4
0
        /// <summary>
        /// Triggered slightly before the elevator will pass a floor.
        /// A good time to decide whether to stop at that floor.
        /// Note that this event is not triggered for the destination floor.
        /// Direction is either "up" or "down".
        /// </summary>
        /// <param name="skyscraperDto"></param>
        /// <returns></returns>
        public ContentResult PassingFloor(SkyscraperDto skyscraperDto)
        {
            var skyscraper = SyncSkyscraper(skyscraperDto);

            // This invokes the delegate from IPlayer
            ElevatorCommands elevatorCommands;

            try
            {
                var eventRaisedElevatorIndex = skyscraperDto.EventRaisedElevatorIndex;
                var passingFloorNumber       = skyscraperDto.Elevators[eventRaisedElevatorIndex].PassingFloorNumber;
                var direction = skyscraperDto.Elevators[eventRaisedElevatorIndex].Direction;
                var eventArgs = new PassingFloorEventArgs
                {
                    PassingFloorNumber = passingFloorNumber,
                    Direction          = direction
                };
                skyscraper.Elevators[eventRaisedElevatorIndex].OnPassingFloor(eventArgs);
                elevatorCommands = CreateElevatorCommands(skyscraperDto, skyscraper);
            }
            catch (System.Exception e)
            {
                elevatorCommands = new ElevatorCommands {
                    Message = e.Message
                };
            }

            var json = JsonConvert.SerializeObject(elevatorCommands);

            return(Content(json, "application/json"));
        }
示例#5
0
 private static void AddGoToFloorCommands(SkyscraperDto skyscraperDto, Queue <int> queue, ElevatorCommands elevatorCommands, bool jumpQueue)
 {
     if (queue.Count > 0)
     {
         var destination      = queue.Dequeue();
         var goToFloorCommand = new GoToFloorCommand(skyscraperDto.EventRaisedElevatorIndex, destination, jumpQueue);
         elevatorCommands.GoToFloors.Enqueue(goToFloorCommand);
     }
 }
        public ContentResult New(SkyscraperDto skyscraperDto)
        {
            var skyscraper = new Skyscraper(skyscraperDto);
            var player     = LoadPlayer();

            skyscraper.LoadPlayer(player); // This calls the Init method on Player and hooks up events
            SaveSkyscraper(skyscraper);

            var json = JsonConvert.SerializeObject("Ready."); // TODO: Not needed, unless you want to pass some UI message back.

            return(Content(json, "application/json"));
        }
示例#7
0
        internal Skyscraper(SkyscraperDto skyscraperDto)
        {
            Elevators = new List <Elevator>();
            foreach (var elevatorDto in skyscraperDto.Elevators)
            {
                var elevator = new Elevator(elevatorDto.ElevatorIndex, elevatorDto.MaxPassengerCount);
                Elevators.Add(elevator);
            }

            Floors = new List <Floor>();
            for (var i = 0; i < skyscraperDto.Floors.Count; i++)
            {
                Floors.Add(new Floor(i));
            }
        }
示例#8
0
        /// <summary>
        /// Use ElevatorCommands for sending back to client.
        /// </summary>
        /// <param name="skyscraperDto"></param>
        /// <param name="skyscraper"></param>
        /// <returns></returns>
        internal static ElevatorCommands CreateElevatorCommands(SkyscraperDto skyscraperDto, Skyscraper skyscraper)
        {
            var elevatorCommands      = new ElevatorCommands();
            var jumpQueueDestinations = skyscraper.Elevators[skyscraperDto.EventRaisedElevatorIndex].JumpQueueDestinations;
            var newDestinations       = skyscraper.Elevators[skyscraperDto.EventRaisedElevatorIndex].NewDestinations;



            while (jumpQueueDestinations.Count > 0)
            {
                AddGoToFloorCommands(skyscraperDto, jumpQueueDestinations, elevatorCommands, true);
            }

            while (newDestinations.Count > 0)
            {
                AddGoToFloorCommands(skyscraperDto, newDestinations, elevatorCommands, false);
            }

            foreach (var elevator in skyscraper.Elevators)
            {
                if (elevator.StopElevator)
                {
                    elevatorCommands.StopElevators.Add(new StopElevator(elevator.Index));
                    elevator.StopElevator = false; // This is not synced so must be reset here
                }
                elevatorCommands.SetUpIndicators.Add(new SetIndicatorCommand(elevator.Index, elevator.GoingUpIndicator));
                elevatorCommands.SetDownIndicators.Add(new SetIndicatorCommand(elevator.Index, elevator.GoingDownIndicator));

                if (elevator.IsDestinationQueueModified)
                {
                    elevatorCommands.DestinationQueueCommands.Add(new DestinationQueueCommand
                    {
                        ElevatorIndex    = elevator.Index,
                        DestinationQueue = elevator.DestinationQueue
                    });
                }
            }

            return(elevatorCommands);
        }
示例#9
0
        /// <summary>
        /// Triggered when a passenger has pressed a button inside the elevator.
        /// This tells us which floor the passenger wants to go to.
        /// Maybe tell the elevator to go to that floor?
        /// </summary>
        /// <param name="skyscraperDto"></param>
        /// <returns></returns>
        public ContentResult FloorButtonPressed(SkyscraperDto skyscraperDto)
        {
            var skyscraper = SyncSkyscraper(skyscraperDto);

            // This invokes the delegate from IPlayer
            ElevatorCommands elevatorCommands;

            try
            {
                var eventRaisedElevatorIndex = skyscraperDto.EventRaisedElevatorIndex;
                var floorNumberPressed       = skyscraperDto.Elevators[eventRaisedElevatorIndex].FloorNumberPressed;
                skyscraper.Elevators[eventRaisedElevatorIndex].OnFloorButtonPressed(floorNumberPressed);
                elevatorCommands = CreateElevatorCommands(skyscraperDto, skyscraper);
            }
            catch (System.Exception e)
            {
                elevatorCommands = new ElevatorCommands {
                    Message = e.Message
                };
            }
            var json = JsonConvert.SerializeObject(elevatorCommands);

            return(Content(json, "application/json"));
        }
示例#10
0
        /// <summary>
        /// Triggered when the elevator has completed all its tasks and is not doing anything.
        /// </summary>
        /// <param name="skyscraperDto"></param>
        /// <returns></returns>
        public ContentResult Idle(SkyscraperDto skyscraperDto)
        {
            var skyscraper = SyncSkyscraper(skyscraperDto);

            // This invokes the delegate from IPlayer
            ElevatorCommands elevatorCommands;

            try
            {
                skyscraper.Elevators[skyscraperDto.EventRaisedElevatorIndex].OnIdle();
                elevatorCommands = CreateElevatorCommands(skyscraperDto, skyscraper);
            }
            catch (System.Exception e)
            {
                elevatorCommands = new ElevatorCommands {
                    Message = e.Message
                };
            }


            var json = JsonConvert.SerializeObject(elevatorCommands);

            return(Content(json, "application/json"));
        }