fp-elevators

Reading and Writing

User Input: Moves

The Move class represents an action the user wishes to take while they are playing the game. There are 4 types of Moves:

  1. Pass Move: Do nothing this turn.
  2. Service Move: Send an elevator to a particular floor
  3. Pickup Move: Tell an elevator to pick up people from the floor that it is on.
  4. Game Move: Save or quit the game.

Pass Move

A user enters a pass move using the empty string "".

Service Move

A service move directs an empty elevator to go to a floor. They are input by the user in the following format:

char int char int
‘e’ elevatorId ‘f’ floorNum

For example, this is a service move requesting elevator 1 to move to floor 4:

string serviceMove = "e1f4";

Pickup Move

A pickup move directs an empty elevator to pick up people on the floor it is currently on then initiate travel to the farthest floor that those people wish to go. Not all the people waiting on the current floor need to be picked up, so the user will be given the chance to select which people will be picked up after they enter a pickup move.

pickup moves can be expressed with the following string:

char int char
‘e’ elevatorId ‘p’

For example, this will direct elevator 1 to pick up some people on its current floor then begin to move to the farthest floor those people wish to go:

string pickupMove = "e1p";

Game Move

Moves that affect the status of the game are Game moves. The two Game moves are save and quit, which are represented by either an uppercase or lowercase S or Q respectively.

File Input/Output: Saved Games

The game has a save game format which is used when starting new games or resuming saved games. The file format has 4 sections:

  1. The current score of the player
  2. The last tick completed by the game
  3. The current state of the elevators
  4. The ticks and locations where people will spawn

Here is an example of a saved game file (the comments are not part of the file):

0           // 1. The current score of the player (5 lines)
0
0
0
0
0           // 2. The last tick completed by the game
0w          // 3. The current state of the elevators
0w
0w
0f1t9a1     // 4. The ticks and locations where people will spawn
1f0t8a0
2f0t9a0

1. Current score

The current score is stored in an instance of SatisfactionIndex, which has overloaded operator>> and operator<< to read and write to streams. The provided Game::initGame() function can help with reading the score.

2. Last tick completed

For new games, this will be 0. For saved games, this is an integer representing the last completed tick number.

3. Elevator state

The next lines describe what the elevators are currently doing. We have provided all the code for reading and writing Elevator states. Game::initGame() will handle reading elevator state from a stream. Elevator::print() can be used to write to a file.

Waiting

waiting elevators can be expressed with the following string:

int char
floorNum ‘w’
string waitingElevator = "0w";

This elevator is waiting on floor 0.

When we save elevators to a file, we save them in index-order:

elevator[0]
elevator[1]
...
elevator[NUM_ELEVATORS - 1]

Because of this, we do not need to save the elevatorId. We assume that the first elevator state read in belongs to an elevator at index 0, the second elevator state read in at index 1, and so on.

Servicing

servicing elevators can be expressed with the following string:

int char int
floorNum ’s’ targetFloorNum
string servicingElevator = "1s4";

This elevator is currently on floor 1, servicing to floor 4.

4. The ticks and locations where people will spawn

The game will spawn people at the times listed. You will implement the Person::Person(string) constructor which parses input strings into Person objects, and the Person::print(ostream &) member function for output.

int char int char int char int
tick ‘f’ floorNum ‘t’ targetFloorNum ‘a’ angerLevel
string input_string = "7f4t8a3";

On tick 7, a person will appear on floor 4 wanting to go to floor 8. They have an anger level of 3.

When saving games, all Person objects that have already spawned must have the tick field set to 0, even if the game is currently at a later tick.