Exemple #1
0
Building& Building::step(int numRiders) // moves elevators and riders each second. numRiders = riders to randomly add to floors
{
  int count = 0; // screen counter for pausing.


  //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  //@@@@@@@@@@@@@@@@@@@@@@                 Riders                @@@@@@@@@@@@@@@@@@@@@@@@@@@
  //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

  for (int i=0; i < numRiders; i++) // add riders on random floors
  {
    int randomStartFloor = rand() % buildingFloors.size(); // random number from 0 to buildingFloors max
    int randomDestinationFloor = rand() % buildingFloors.size(); // random number from 0 to buildingFloors max

    if (randomStartFloor == 0) // Basement case - no down
    {
      randomDestinationFloor = rand() % (buildingFloors.size()-1) + 1; // random number from 1 to (buildingFloors max -1)
    }
    else if (randomStartFloor == buildingFloors.size()) // Top case - no up
    {
      randomDestinationFloor = rand() % (buildingFloors.size()-1); // random number from 0 to (buildingFloors max -1)
    }
    else
    {
      while (randomDestinationFloor == randomStartFloor) // make sure starting != destination floor
      {
        randomDestinationFloor = rand() % buildingFloors.size();
      }
    }
    buildingFloors[randomStartFloor]->addNewRider(Rider(*buildingFloors[randomDestinationFloor])); // add rider on rand floor w/ rand dest.
  } // end for (adding riders to random floors)


  //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  //@@@@@@@@@@@@@@@@@@@@@@                Elevator               @@@@@@@@@@@@@@@@@@@@@@@@@@@
  //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

  for (int i = 0; i<buildingElevators.size(); i++) // checking all elevators one by one [3]
  {
    if (buildingElevators[i]->isDoorOpen() == false) // if doors are closed [3]
    {
      if (!buildingElevators[i]->isNearDestination()) // executed if elevator is not near destination [3]
      {
        if (buildingElevators[i]->isDirectionUp()) buildingElevators[i]->moveUp(); // move up [3]
        else if (buildingElevators[i]->isDirectionDown()) buildingElevators[i]->moveDown(); // move down [3]
      } // end 'if not near destination' loop

      else if (buildingElevators[i]->isNearDestination()) // if elevator is near to destination [4]
      {
        buildingElevators[i]->moveToDestinationFloor(); // [4]
        buildingElevators[i]->openDoor(); // [4]
        {
          buildingElevators[i]->removeRidersForDestinationFloor();// remove riders; ignore returned vector of removed riders [4]
        } // "{}" & cout are temp

        Floor* elevatorsCurrentFloor = const_cast<Floor*>(&(buildingElevators[i]->getDestination())); // [5]

        if (buildingElevators[i]->hasRiders() == false) // if elevator is empty [5]
        {
          if (elevatorsCurrentFloor->isPreferredDirectionUp() == true) // if floor direction = up [5]
          {
            buildingElevators[i]->setDirectionUp();
          }
          else // if floor direction != up [5]
          {
            buildingElevators[i]->setDirectionDown();
          }
        } // end if elevator = empty

        if (buildingElevators[i]->getAvailableSpace()!=0) // if space in elevator, board riders [6]
        {
          if (buildingElevators[i]->isDirectionUp() == true) // if the elevator is going up
          {
            if (elevatorsCurrentFloor->hasUpRiders() == true) // if there are up riders on the floor
            {
              buildingElevators[i]->addRiders(elevatorsCurrentFloor->removeUpRiders(buildingElevators[i]->getAvailableSpace())); // board up-riders [6]
            } // end if (has up riders)
          } // end if elevator direction == up
          else // for down elevators
          {
            if (elevatorsCurrentFloor->hasDownRiders() == true) // if there are down riders on the floor
            {
              buildingElevators[i]->addRiders(elevatorsCurrentFloor->removeDownRiders(buildingElevators[i]->getAvailableSpace()));// board down-riders [6]
            } // end if (has down riders)
          } // end else (for down riders)
        } // end if space in elevator

        buildingElevators[i]->setDestinationBasedOnRiders(); //reassess elevator's destination based on riders [8]
      } // end if 'near destination' loop
    } // end 'if elevator doors are closed' loop


    else // "isDoorOpen() == true" (it already let off riders, or is in its initial state) [7]
    {
      if (buildingElevators[i]->hasRiders() == true) // has riders [7]
      {
        buildingElevators[i]->closeDoor(); // close door [7]
      } // end if has riders
      else // if no riders
      {
        buildingElevators[i]->setIdle(); // go idle [7]
      }
    } // else (for already let off riders or is in initial state.
  } // end for loop checking all elevators


  //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  //@@@@@@@@@@@@@@@@@@@@@@                 Floor                 @@@@@@@@@@@@@@@@@@@@@@@@@@@
  //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

  for (int i = 0; i<buildingFloors.size(); i++) // check each floor (for waiting riders) [2]
  {
    if (buildingFloors[i]->hasRidersWaiting() == true) // if there are no riders waiting on this floor, continue with next floor [2]
    {
      for (int j = 0; j<buildingElevators.size(); j++) // look at each elevator to see if it needs to be sent here [2]
      {
        int relativeLocation = ((buildingElevators[j]->getLocation()) - (buildingFloors[i]->getLocation())); // get elevator's relative location (negative if elevator is below floor) [2]

        if (buildingElevators[j]->isIdle() == true) // if this elevator's idle... [2]
        {
          if (relativeLocation > 0) // if elevator is above the floor... [2]
          {
            buildingElevators[j]->setDirectionDown(); // ... set elevator direction to down [2]
          } // end if (elevator > floor)
          else if (relativeLocation < 0) // otherwise if it's below... [2]
          {
            buildingElevators[j]->setDirectionUp(); // ...set elevator direction to up [2]
          }
          buildingElevators[j]->setDestination(buildingFloors[i]); // set elevator's destination to this floor [2]
          buildingElevators[j]->closeDoor(); // tell elevator to close its door [2]
        } // end if elevator.isIdle()

        else if (buildingFloors[i]->hasUpRiders() == true && buildingElevators[j]->isDirectionUp() == true) //there are riders on this floor waiting to go up, and the elevator is going up... [10]
        {
          // distance from elevator's destination floor to this floor (positive if elevator destination is above this floor) [10]
          int elevatorDistance = ( (buildingElevators[j]->getDestination().getLocation()) - (buildingFloors[i]->getLocation()) );

          if ( (relativeLocation < 0) && (elevatorDistance > 0)) //elevator is below floor and elevator destination is above this floor [10]
          {
            buildingElevators[j]->setDestination(buildingFloors[i]); //set elevator's destination to this floor [10]
          } // end if (elevator is moving up past this floor)
        } // end else (riders on floor going up AND elevator going up)

        else if ( (buildingFloors[i]->hasDownRiders() == true) && (buildingElevators[j]->isDirectionDown() == true)) //there are riders on this floor waiting to go down, and the elevator is going down... [10]
        {
          // distance from elevator's destination floor to this floor (negative if elevator destination is below this floor) [10]
          int elevatorDistance = ( (buildingElevators[j]->getDestination().getLocation()) - (buildingFloors[i]->getLocation()) );

          if ( (relativeLocation > 0) && (elevatorDistance < 0)) //elevator is above floor and elevator destination is below this floor [10]
          {
            buildingElevators[j]->setDestination(buildingFloors[i]); //set elevator's destination to this floor [10]
          } // end if (elevator is moving down past this floor)
        } // end else (riders on floor going down AND elevator going down)
      } // end for loop checking all elevators
    } // end if Floor has riders waiting loop
  } // end for loop for checking all Floors

  simulationTime ++;
  return *this; // should return a reference to itself.
}