       iex> {:ok, pid} = LexibombServer.Board.start_link
       iex> is_pid(pid)
       true
+
+  ## Options
+
+  Same as `new/1`.
   """
   @spec start_link :: Agent.on_start
-  def start_link do
-    start_link(new)
-  end
-
-  @doc """
-  Starts an agent linked to the current process, storing the state of the given
-  `board`.
-  """
-  @spec start_link(t) :: Agent.on_start
-  def start_link(%LexibombServer.Board{} = board) do
-    Agent.start_link(fn -> board end)
-  end
-
-  @doc """
-  Creates a board of the given `size`.
-
-  A unique seed for the PRNG is generated and stored with the board.
-  """
-  @spec new(pos_integer) :: t
-  def new(size \\ @default_size) do
-    new(size, Utils.unique_seed)
-  end
-
-  @doc """
-  Creates a board of the given `size` with a specific PRNG `seed`.
-  """
-  @spec new(pos_integer, seed) :: t
-  def new(size, seed) do
-    %LexibombServer.Board{
-      grid: Grid.init(size),
-      seed: seed,
-    }
+  def start_link(opts \\ []) do
+    Agent.start_link(fn -> new(opts) end)
+  end
+
+  @doc """
+  Creates a new game board with the given options.
+
+  ## Options
+
+  The accepted options are:
+
+    * `:size` - create a board of the given size; the default is #{@default_size}
+    * `:seed` - a seed for the PRNG; the default is a uniquely generated seed
+    * `:bomb_count` - the number of bombs to randomly place on the board;
+       the default is #{@default_bomb_count}
+  """
+  @spec new(board_options) :: t
+  def new(opts \\ []) do
+    size = opts |> Keyword.get(:size, @default_size)
+    seed = opts |> Keyword.get(:seed, Utils.unique_seed)
+    bomb_count = opts |> Keyword.get(:bomb_count, @default_bomb_count)
+
+    %LexibombServer.Board{grid: Grid.init(size), seed: seed}
+    |> place_random_bombs(bomb_count)
   end
 
   @doc """


  The board's PRNG seed is used to make this operation idempotent.
  """
  @spec place_random_bombs(pid, pos_integer) :: :ok
  def place_random_bombs(pid, count \\ @bomb_count) do
    board = get(pid)
    _ = Utils.seed_the_prng(board.seed)

    board.grid
    |> Grid.active_squares
    |> Map.keys
    |> Enum.take_random(count)
    |> do_place_bombs(pid)
  end

  @doc """


  @type coord :: Grid.coord | {non_neg_integer, String.t} | String.t
  @type seed :: {integer, integer, integer}
  @type board_options :: [size: pos_integer, seed: seed, bomb_count: pos_integer]
  @type t :: %{grid: Grid.t, seed: seed}

  @default_size 15
  @default_bomb_count 22

  @doc """
  Starts an agent linked to the current process, storing the state of a new
