Game
    - List<Player> or Map<PlayerId, Player>
    - Board
    - Deck<ICard>

Deck
    - List<ICardWithoutSuit>

    - void shuffle() //Randomizes order of cards in deck
    - void draw(Deck other) //Draws one card from deck other. Returns false if the other deck is empty
    - void draw(Deck other, int n) //Draws n cards from deck other
    - void emptyInto(Deck other) //Moves all cards in deck to deck other
    - boolean isEmpty() //Checks whether there are any cards in the deck
    - int size() //Gets number of cards in deck
    - List<ICard> getCards() //Gets copy of cards in deck in correct order

ICardWithoutSuit
    - S getValue() //Returns the value of the card
    - T getSymbol() //Returns the symbol/color of the card

ICard extends ICardWithoutSuit
    - R getSuit() //Returns the suit of the card

IGrid
    - K getElement(int x, int y)
    - setElement(int x, int y, K element)
    - int getHeight()
    - int getWidth()

Board
    - Grid x2
    - List<Robot> deadRobots;
    - List<Robot> aliveRobots;

    - removeDeadRobotFromBoard(Robot robot);

Position //Immutable
    int xCoordinate;
    int yCoordinate;
    int getXCoordinate()
    int getYCoordinate()

Direction {
    NORTH (1),
    NORTH_EAST (2),
    EAST (3),
    SOUTH_EAST (4),
    SOUTH (5),
    SOUTH_WEST (6),
    WEST (7),
    NORTH_WEST (8);
}

TileType {
    TILE (1),
    HOLE (2),
    COGWHEEL_RIGHT (3),
    COGWHEEL_LEFT (4),
    TRANSPORT_BAND_SLOW (5),
    TRANSPORT_BAND_SLOW_RIGHT (6),
    TRANSPORT_BAND_SLOW_LEFT (7),
    TRANSPORT_BAND_SLOW_SIDE_ENTRANCES (8),
    TRANSPORT_BAND_SLOW_SIDE_ENTRANCE_LEFT (9),
    TRANSPORT_BAND_SLOW_SIDE_ENTRANCE_RIGHT (10),
    TRANSPORT_BAND_FAST (11),
    TRANSPORT_BAND_FAST_RIGHT (12),
    TRANSPORT_BAND_FAST_LEFT (13),
    TRANSPORT_BAND_FAST_SIDE_ENTRANCES (14),
    TRANSPORT_BAND_FAST_SIDE_ENTRANCE_LEFT (15),
    TRANSPORT_BAND_FAST_SIDE_ENTRANCE_RIGHT (16),
    FLAG_1 (17),
    FLAG_2 (18),
    FLAG_3 (19),
    FLAG_4 (20),
    WRENCH (21),
    WRENCH_AND_HAMMER (22),
    DEATH_TILE (23)
}

WallType {
    WALL_NORMAL (1),
    WALL_CORNER (2),
    WALL_LASER_SINGLE (3),
    WALL_LASER_DOUBLE (4);
}

Tile
    TileType type
    Direction direction

FunctionalTile extends Tile
    doPhaseAction() //Information required has not been decided
    doRoundAction() //Information required has not been decided
    doStepOnAction() //Information required has not been decided. Not needed for all functional tiles

Wall
    WallType type
    Direction direction

Robot
    - int playerId
    - int currentDamage
    - boolean inPowerDown
    - int lastFlagVisited
    - Position backup

    - int getDamage()
    - setDamage(int damage)
    - Position getPosition()
    - setPosition(Position position)
    - setPowerDown(boolean value)
    - boolean isInPowerDown()

BoardLoader
    - Board loadBoard(String boardFile)

Player
    - Deck<ICard>
    - int playerId //Both ID and name?
    - string playerName
    - List<ICard> program
    - Robot robot //Might not be needed
    - boolean willTakePowerdownNextTurn

    - boolean isAlive()
    - boolean getName()
    - Robot getRobot() //Might not be needed
    - setPowerDownNextTurn(boolean willTakePowerdown)

IO
    - Game

    - List<IDrawableElement> getElementsToRender()
    - ? HandleInput(?) ???