コード例 #1
0
        public void Go()
        {
            Elevator.EnterElevator();

            //variable to store chosen floor (through a method)
            int chosenFloor = chooseFloor();

            //true: agent chose the floor he is at
            bool sameFloor = true;

            Console.WriteLine($"{Name} called the elevator.");

            //while elevator and agent aren't on the same floor, move the elevator
            while (FloorOfAgent != Elevator.CFloor)
            {
                Console.WriteLine($"{Name} is on {FloorOfAgent} floor while elevator is on {Elevator.CFloor} floor.");

                //if elevator is under agent: go up
                if (FloorOfAgent > Elevator.CFloor)
                {
                    Console.WriteLine("Elevator going up.");
                    Thread.Sleep(elevatorSpeed);
                    Elevator.CFloor++;
                    Console.WriteLine($"Elevator is on {Elevator.CFloor} floor.");
                }

                //if elevator is over agent: go down
                else if (FloorOfAgent < Elevator.CFloor)
                {
                    Console.WriteLine("Elevator going down.");
                    Thread.Sleep(elevatorSpeed);
                    Elevator.CFloor--;
                    Console.WriteLine($"Elevator is on {Elevator.CFloor} floor.");
                }
            }

            //When agent and elevator are on the same floor
            Console.WriteLine($"{Name} got on elevator and chose {chosenFloor} floor, current floor: {Elevator.CFloor}.");

ReCheck:
            //If agent chooses a lower floor
            if (chosenFloor > Elevator.CFloor)
            {
                sameFloor = false; //not sameFloor
                Console.WriteLine("Elevator going up.");
                Thread.Sleep(elevatorSpeed);
                Elevator.CFloor++;
                Console.WriteLine($"Elevator is on {Elevator.CFloor} floor.");
                goto ReCheck;
            }

            //If agent chooses an upper floor
            else if (chosenFloor < Elevator.CFloor)
            {
                sameFloor = false; //not sameFloor
                Console.WriteLine("Elevator going down.");
                Thread.Sleep(elevatorSpeed);
                Elevator.CFloor--;
                Console.WriteLine($"Elevator is on {Elevator.CFloor} floor.");
                goto ReCheck;
            }


            //if elevator is on the desired floor
            else if (chosenFloor == Elevator.CFloor)
            {
                //if agent chooses the same floor he is at, leave elevator
                if (sameFloor)
                {
                    Console.WriteLine($"{Name} choose the same floor he is at and left the elevator.");
                    Elevator.LeaveElevator();
                }

                else
                {
                    Console.WriteLine($"Checking whether {Name} has needed security level for {Elevator.CFloor} floor.");

                    /*check whether particular agent is allowed at the exact floor,
                     * if so, leave elevator, else: choose another floor */
                    switch (Elevator.CFloor)
                    {
                    case 0:
                        if (SecurityLevel.Equals("Confidential") ||
                            SecurityLevel.Equals("Secret") ||
                            SecurityLevel.Equals("Top-Secret"))
                        {
                            Console.WriteLine($"{Name} left elevator on {Elevator.CFloor} floor.");
                            Elevator.LeaveElevator();
                            break;
                        }
                        else
                        {
                            Console.WriteLine($"{Name} doesn't have security level needed for {Elevator.CFloor} floor.");
                            chosenFloor = chooseFloor();
                            Console.WriteLine($"{Name} chose to go to {chosenFloor} floor.");
                            goto ReCheck;
                        }

                    case 1:
                        if (SecurityLevel.Equals("Secret") ||
                            SecurityLevel.Equals("Top-Secret"))
                        {
                            Console.WriteLine($"{Name} left elevator on {Elevator.CFloor} floor.");
                            Elevator.LeaveElevator();
                            break;
                        }
                        else
                        {
                            Console.WriteLine($"{Name} doesn't have security level needed for {Elevator.CFloor} floor.");
                            chosenFloor = chooseFloor();
                            Console.WriteLine($"{Name} chose to go to {chosenFloor} floor.");
                            goto ReCheck;
                        }

                    case 2:
                    case 3:
                        if (SecurityLevel.Equals("Top-Secret"))
                        {
                            Console.WriteLine($"{Name} left elevator on {Elevator.CFloor} floor.");
                            Elevator.LeaveElevator();
                            break;
                        }
                        else
                        {
                            Console.WriteLine($"{Name} doesn't have security level needed for {Elevator.CFloor} floor.");
                            chosenFloor = chooseFloor();
                            Console.WriteLine($"{Name} chose to go to {chosenFloor} floor.");
                            goto ReCheck;
                        }

                    default:
                        throw new ArgumentOutOfRangeException("Invalid floor: " + Elevator.CFloor.ToString());
                    }
                }
            }
            else
            {
                Console.WriteLine("Something unexpected happened.");
            }
        }