Generate a list of tiles using the given terrain and numbers options.

    terrain options supported:
    - Opt.empty -> all tiles are desert
    - Opt.random -> tiles are randomized
    - Opt.preset ->
    - Opt.debug -> alias for Opt.random

    numbers options supported:
    - Opt.empty -> no tiles have numbers
    - Opt.random -> numbers are randomized
    - Opt.preset ->
    - Opt.debug -> alias for Opt.random

    :param terrain_opts: Opt
    :param numbers_opts: Opt
    :return: list(Tile)

def _get_tiles(board=None, terrain=None, numbers=None):
    """
    Generate a list of tiles using the given terrain and numbers options.

    terrain options supported:
    - Opt.empty -> all tiles are desert
    - Opt.random -> tiles are randomized
    - Opt.preset ->
    - Opt.debug -> alias for Opt.random

    numbers options supported:
    - Opt.empty -> no tiles have numbers
    - Opt.random -> numbers are randomized
    - Opt.preset ->
    - Opt.debug -> alias for Opt.random

    :param terrain_opts: Opt
    :param numbers_opts: Opt
    :return: list(Tile)
    """
    if board is not None:
        # we have a board given, ignore the terrain and numbers opts and log warnings
        # if they were supplied
        tiles = _read_tiles_from_string(board)
    else:
        # we are being asked to generate a board
        tiles = _generate_tiles(terrain, numbers)

    return tiles