/// <summary> /// de constructor van de call /// </summary> /// <param name="guest">De gast die de call maakt</param> /// <param name="start">de floor waar de gast staat</param> /// <param name="destination">de floor waar de gast naar toe moet</param> public ElevatorCallTemplate(AbstractHuman guest, ElevatorShaft start, ElevatorShaft destination) { //zet de juiste input in de juiste properties this.guest = guest; this.startFloor = start; this.destinationFloor = destination; }
/// <summary> /// deze functie roep je aan als je omlaag moet /// </summary> private void GoDown() { //kijk in de buren van de huidige elevator shaft. neem dan de buur waar de Y positie -1 is van de huidige positie ElevatorShaft temp = (ElevatorShaft)currentPosition.Neighbours.FirstOrDefault(x => x.Key.PositionY == (currentPosition.PositionY - 1)).Key; //roep de move funvtie aan MoveElevator(temp); }
/// <summary> /// roep deze functie aan as je de lift wilt laten bewegen /// </summary> /// <param name="nextFloor">geef de verdieping mee waar de lift de uiteindelijk moet uitkomen</param> private void GoToFloor(ElevatorShaft nextFloor) { //als de Y positie van de bestemming groter is dan de huidige Y positie ga dan naar boven if (currentPosition.PositionY < nextFloor.PositionY) { GoUp(); } //als de Y positie avnde bestemming kleiner is dan de huideige Y positie ga dan naar beneden else if (currentPosition.PositionY < nextFloor.PositionY) { GoDown(); } //als het geen van beide is dan betekend dat dat beide Y posities gelijk zijn verander dan de status naar "getOut" else { _status = State.getOut; } }
/// <summary> /// een private function om de lift echt the laten bewegen /// </summary> /// <param name="nextFloor">geef de elevatorshaft mee die de volgende elevatorshaft is waar de lift langs komt</param> private void MoveElevator(ElevatorShaft nextFloor) { //zet in de current position vande lift de nieuwe shaft this.currentPosition = nextFloor; //verander de y positie van de lift zodat je de juiste positie kan tekenen this.PositionY = nextFloor.PositionY; //als er gasten zijn in de lift if (guestInElevator.Count > 0) { //voor elke gast in de lift foreach (AbstractHuman guest in guestInElevator) { //zet de current position van de gast naar de volgende verdieping guest.CurrentPosition = nextFloor; //haal een stap van de path af van de gast guest.Path.Remove(guest.Path.First()); } } }
/// <summary> /// Deze functie roep je aan als je het object wilt laten bewegen /// </summary> public void Move() { //als zijn huideige positie niet zijn bestemming is moet hij bewegen if (CurrentPosition != Destination) { //als hij nu bij een elevetarshaft staat en zijn volgende stap ook een elevator shaft is en hij staat nog niet in de lift if (CurrentPosition.AreaType == "Elevatorshaft" && Path.First().AreaType == "Elevatorshaft" && inElevator == false) { //en hij is nog niet aan het wachten of de lift if (waiting == false) { //maak een tijdelijke elevatorshaft object van de huidige positie ElevatorShaft temp = (ElevatorShaft)CurrentPosition; //voeg jezelf to aan de wacht rij van de elevatorshaft temp.guestWaiting.Add(this); //roep een functie aan om een call doortegeven aan de elevator temp.CallElevator(new ElevatorCallTemplate(this, temp, (ElevatorShaft)Path.Find(x => x.AreaType == "Elevatorshaft" && x.PositionY == Destination.PositionY))); //en geef aan dat hij nu moet wachten waiting = true; } } //anders moet hij zelf bewegen else { //als hij nit in de lift staat if (inElevator == false) { //verandrd de huidige positie CurrentPosition = Path.First(); //en haal de stap uit de path list Path.Remove(Path.First()); } } } }