TheBulgarianWolf

Elevator(PART 1)

Dec 3rd, 2020
617
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Threading;
  5.  
  6. namespace Area51Elevator
  7. {
  8.    
  9.     enum BaseFloors { G, S, T1, T2 };
  10.     class Elevator
  11.     {
  12.         //EVENT FOR THE END OF THE WORKDAY
  13.         ManualResetEvent eventFinishedWork = new ManualResetEvent(false);
  14.  
  15.  
  16.         const int maxPeopleInElevator = 1;
  17.  
  18.         Semaphore semaphore;
  19.  
  20.         Random rand = new Random();
  21.  
  22.         List<Agent> agentsInElevator;
  23.         Agent.AgentCurrentFloor currentFloor;
  24.         public Elevator()
  25.         {
  26.             semaphore = new Semaphore(1, maxPeopleInElevator);
  27.             agentsInElevator = new List<Agent>();
  28.         }
  29.  
  30.         static int currentFloorTime;
  31.         static int lastFloorTime = 0;
  32.  
  33.         public void EnterElevator(Agent agents)
  34.         {
  35.             semaphore.WaitOne();
  36.             lock (agentsInElevator)
  37.             {
  38.                 agentsInElevator.Add(agents);
  39.                 Console.WriteLine(agents.AgentNumber + " entered the elevator.");
  40.                 InsideElevator(agents);
  41.             }
  42.         }
  43.  
  44.         public void InsideElevator(Agent agents)
  45.         {
  46.             //1s per floor wait time
  47.             switch (agents.CurrentAgentFloor)
  48.             {
  49.                 case Agent.AgentCurrentFloor.T2:
  50.                     currentFloorTime = 3000;
  51.                     Thread.Sleep(Math.Abs(currentFloorTime - lastFloorTime));
  52.                     lastFloorTime = currentFloorTime;
  53.                     break;
  54.                 case Agent.AgentCurrentFloor.T1:
  55.                     currentFloorTime = 2000;
  56.                     Thread.Sleep(Math.Abs(currentFloorTime - lastFloorTime));
  57.                     lastFloorTime = currentFloorTime;
  58.                     break;
  59.                 case Agent.AgentCurrentFloor.S:
  60.                     currentFloorTime = 1000;
  61.                     Thread.Sleep(Math.Abs(currentFloorTime - lastFloorTime));
  62.                     lastFloorTime = currentFloorTime;
  63.                     break;
  64.                 case Agent.AgentCurrentFloor.G:
  65.                     currentFloorTime = 0;
  66.                     Thread.Sleep(Math.Abs(currentFloorTime - lastFloorTime));
  67.                     lastFloorTime = currentFloorTime;
  68.                     break;
  69.             }
  70.             bool inTheElevator = true;
  71.             var elevatorAction = agents.GetRandomFloor();
  72.             while (inTheElevator == true)
  73.             {
  74.                 int randomAction = rand.Next(1, 5);
  75.  
  76.                 switch (elevatorAction)
  77.                 {
  78.                     case BaseFloors.T2:
  79.                         currentFloorTime = 3000;
  80.                         Thread.Sleep(Math.Abs(currentFloorTime - lastFloorTime));
  81.                         lastFloorTime = currentFloorTime;
  82.                         Console.WriteLine(agents.AgentNumber + " arrived at level T2");
  83.                         if (agents.AgentLevel == "Top-Secret")
  84.                         {
  85.                             inTheElevator = false;
  86.                             agents.CurrentAgentFloor = Agent.AgentCurrentFloor.T2;
  87.                         }
  88.                         else
  89.                         {
  90.                             elevatorAction = GenerateNewFloor(randomAction-1);
  91.                         }
  92.                         break;
  93.                     case BaseFloors.T1:
  94.                         currentFloorTime = 2000;
  95.                         Thread.Sleep(Math.Abs(currentFloorTime - lastFloorTime));
  96.                         lastFloorTime = currentFloorTime;
  97.                         Console.WriteLine(agents.AgentNumber + " arrived at level T1");
  98.                         if (agents.AgentLevel == "Top-Secret")
  99.                         {
  100.                             inTheElevator = false;
  101.                             agents.CurrentAgentFloor = Agent.AgentCurrentFloor.T1;
  102.                         }
  103.                         else
  104.                         {
  105.                             elevatorAction = GenerateNewFloor(randomAction - 2);
  106.                         }
  107.                         break;
  108.                     case BaseFloors.S:
  109.                         currentFloorTime = 1000;
  110.                         Thread.Sleep(Math.Abs(currentFloorTime - lastFloorTime));
  111.                         lastFloorTime = currentFloorTime;
  112.                         Console.WriteLine(agents.AgentNumber + " arrived at level S");
  113.                         if (agents.AgentLevel == "Secret" || agents.AgentLevel == "Top-Secret")
  114.                         {
  115.                             inTheElevator = false;
  116.                             agents.CurrentAgentFloor = Agent.AgentCurrentFloor.S;
  117.                         }
  118.                         else
  119.                         {
  120.                             elevatorAction = BaseFloors.G;
  121.                         }
  122.                         break;
  123.                    
  124.                    case BaseFloors.G:
  125.                     default:
  126.                         currentFloorTime = 0;
  127.                         Thread.Sleep(Math.Abs(currentFloorTime - lastFloorTime));
  128.                         lastFloorTime = currentFloorTime;
  129.                         Console.WriteLine(agents.AgentNumber + " arrived at ground level G.");
  130.                         agents.CurrentAgentFloor = Agent.AgentCurrentFloor.G;
  131.                         inTheElevator = false;
  132.                         break;
  133.                 }
  134.                
  135.             }
  136.            
  137.             LeaveElevator(agents);
  138.             currentFloor = agents.CurrentAgentFloor;
  139.         }
  140.         public void LeaveElevator(Agent agents)
  141.         {
  142.             Console.WriteLine("The door opens and the agent gets of the elevator.");
  143.            
  144.             lock (agentsInElevator)
  145.             {
  146.                 agentsInElevator.Remove(agents);
  147.             }
  148.             semaphore.Release();
  149.  
  150.         }
  151.  
  152.         public BaseFloors GenerateNewFloor(int randNum)
  153.         {
  154.             BaseFloors elevatorAction;
  155.             switch (randNum)
  156.             {
  157.                 case 1:
  158.                     elevatorAction = BaseFloors.G;
  159.                     break;
  160.                 case 2:
  161.                     elevatorAction = BaseFloors.S;
  162.                     break;
  163.                 case 3:
  164.                     elevatorAction = BaseFloors.T1;
  165.                     break;
  166.                 case 4:
  167.                 default:
  168.                     elevatorAction = BaseFloors.T2;
  169.                     break;
  170.             }
  171.  
  172.             return elevatorAction;
  173.         }
  174.        
  175.  
  176.  
  177.     }
  178. }
RAW Paste Data