Ejemplo n.º 1
0
        // Find best elevator in the chosen column
        public Elevator ElevatorInTheChosenColumn(Column columnFinded, int requestedFloor, String direction, int userCurrentFloor)
        {
            var      bestNearestElevatorGap = 10000000;
            Elevator bestElevator           = null;
            var      bestCase = 0;

            foreach (Elevator elevator in columnFinded.listElevInColumn)
            {
                // Condition 1
                if (userCurrentFloor == elevator.position)
                {
                    // BestCase 1

                    if (bestCase == 0 || bestCase > 1)
                    {
                        bestCase     = 1;
                        bestElevator = elevator;

                        // if user is at floor 1
                    }
                    else if (bestCase == 1 && requestedFloor > 1)
                    {
                        var gap = Math.Abs(elevator.position - 1);
                        if (bestNearestElevatorGap >= gap)
                        {
                            bestElevator           = elevator;
                            bestNearestElevatorGap = gap;
                        }
                    }  // if user is not at floor 1
                    else if (bestCase == 1 && requestedFloor != 1)
                    {
                        var gap = Math.Abs(elevator.position - requestedFloor);
                        if (bestNearestElevatorGap >= gap)
                        {
                            bestElevator           = elevator;
                            bestNearestElevatorGap = gap;
                        }
                    }
                }


                // condition 2
                else if (elevator.position > userCurrentFloor && requestedFloor == 1)
                {
                    // BestCase 2
                    if (bestCase == 0 || bestCase > 2)
                    {
                        bestCase     = 2;
                        bestElevator = elevator;
                    }// if user is at floor 1
                    else if (bestCase == 2 && requestedFloor > 2)
                    {
                        var gap = Math.Abs(elevator.position - 1);
                        if (bestNearestElevatorGap >= gap)
                        {
                            bestElevator           = elevator;
                            bestNearestElevatorGap = gap;
                        }
                        // if user is not at floor 1
                    }
                    else if (bestCase == 2 && requestedFloor != 1)
                    {
                        var gap = Math.Abs(elevator.position - requestedFloor);
                        if (bestNearestElevatorGap >= gap)
                        {
                            bestElevator           = elevator;
                            bestNearestElevatorGap = gap;
                        }
                    }
                }


                else if (elevator.position > 1 && direction == "down" && elevator.direction == "down")
                {
                    // BestCase 3
                    if (bestCase == 0 || bestCase > 3)
                    {
                        bestCase     = 3;
                        bestElevator = elevator;
                    }// if user is at floor 1
                    else if (bestCase == 3 && requestedFloor > 1)
                    {
                        var gap = Math.Abs(elevator.position - 1);
                        if (bestNearestElevatorGap >= gap)
                        {
                            bestElevator           = elevator;
                            bestNearestElevatorGap = gap;
                        }
                        // if user is not at floor 1
                    }
                    else if (bestCase == 3 && requestedFloor != 1)
                    {
                        var gap = Math.Abs(elevator.position - requestedFloor);
                        if (bestNearestElevatorGap >= gap)
                        {
                            bestElevator           = elevator;
                            bestNearestElevatorGap = gap;
                        }
                    }
                }

                // Condition 3
                else if (elevator.position > 1 && direction == "up" && elevator.direction == "down")
                {
                    // BestCase 3
                    if (bestCase == 0 || bestCase > 4)
                    {
                        bestCase     = 4;
                        bestElevator = elevator;
                    }// if user is at floor 1
                    else if (bestCase == 4 && requestedFloor > 1)
                    {
                        var gap = Math.Abs(elevator.position - 1);
                        if (bestNearestElevatorGap >= gap)
                        {
                            bestElevator           = elevator;
                            bestNearestElevatorGap = gap;
                        }
                        // if user is not at floor 1
                    }
                    else if (bestCase == 4 && requestedFloor != 1)
                    {
                        var gap = Math.Abs(elevator.position - requestedFloor);
                        if (bestNearestElevatorGap >= gap)
                        {
                            bestElevator           = elevator;
                            bestNearestElevatorGap = gap;
                        }
                    }
                }
                // Condition 4
                else if (elevator.direction == "idle")
                {
                    // BestCase 4
                    if (bestCase == 0 || bestCase > 4)
                    {
                        bestCase     = 4;
                        bestElevator = elevator;
                    }
                    // if user is at floor 1
                    else if (bestCase == 4 && requestedFloor > 1)
                    {
                        var gap = Math.Abs(elevator.position - 1);
                        if (bestNearestElevatorGap >= gap)
                        {
                            bestElevator           = elevator;
                            bestNearestElevatorGap = gap;
                        }
                    } // if user is not at floor 1
                    else if (bestCase == 4 && requestedFloor != 1)
                    {
                        var gap = Math.Abs(elevator.position - requestedFloor);
                        if (bestNearestElevatorGap >= gap)
                        {
                            bestElevator           = elevator;
                            bestNearestElevatorGap = gap;
                        }
                    }
                }
            }
            bestElevator.moveToUserCurrentFloor(userCurrentFloor);
            bestElevator.moveToRequestedFloor(requestedFloor);

            return(bestElevator);
        }