docs: def _get_pieces(tiles, ports, players_opts, pieces_opts):
      """
      Generate a dictionary of pieces using the given options.
  
      pieces options supported:
      - Opt.empty -> no locations have pieces
      - Opt.random ->
      - Opt.preset -> robber is placed on the first desert found
      - Opt.debug -> a variety of pieces are placed around the board
  
      :param tiles: list of tiles from _generate_tiles
      :param ports: list of ports from _generate_ports
      :param players_opts: Opt
      :param pieces_opts: Opt
      :return: dictionary mapping (hexgrid.TYPE, coord:int) -> Piece
      """
      if pieces_opts == Opt.empty:
          return dict()
      elif pieces_opts == Opt.debug:
          players = catan.game.Game.get_debug_players()
          return {
              (hexgrid.NODE, 0x23): catan.pieces.Piece(catan.pieces.PieceType.settlement, players[0]),
              (hexgrid.EDGE, 0x22): catan.pieces.Piece(catan.pieces.PieceType.road, players[0]),
              (hexgrid.NODE, 0x67): catan.pieces.Piece(catan.pieces.PieceType.settlement, players[1]),
              (hexgrid.EDGE, 0x98): catan.pieces.Piece(catan.pieces.PieceType.road, players[1]),
              (hexgrid.NODE, 0x87): catan.pieces.Piece(catan.pieces.PieceType.settlement, players[2]),
              (hexgrid.EDGE, 0x89): catan.pieces.Piece(catan.pieces.PieceType.road, players[2]),
              (hexgrid.EDGE, 0xA9): catan.pieces.Piece(catan.pieces.PieceType.road, players[3]),
              (hexgrid.TILE, 0x77): catan.pieces.Piece(catan.pieces.PieceType.robber, None),
          }
      elif pieces_opts in (Opt.preset, ):
          deserts = filter(lambda tile: tile.terrain == catan.board.Terrain.desert, tiles)
          coord = hexgrid.tile_id_to_coord(list(deserts)[0].tile_id)
          return {
              (hexgrid.TILE, coord): catan.pieces.Piece(catan.pieces.PieceType.robber, None)
          }
      elif pieces_opts in (Opt.random, ):
          logging.warning('{} option not yet implemented'.format(pieces_opts))