/// <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")); }
/// <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); }
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); } }
/// <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")); }
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")); }
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)); } }
/// <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); }
/// <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")); }
/// <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")); }