code: def start(self, players):
          
          from .boardbuilder import Opt
          self.reset()
          if self.board.opts.get('players') == Opt.debug:
              players = Game.get_debug_players()
          self.set_players(players)
          if self.options.get('pregame') is None or self.options.get('pregame') == 'on':
              logging.debug('Entering pregame, game options={}'.format(self.options))
              self.set_state(catan.states.GameStatePreGamePlacingPiece(self, catan.pieces.PieceType.settlement))
          elif self.options.get('pregame') == 'off':
              logging.debug('Skipping pregame, game options={}'.format(self.options))
              self.set_state(catan.states.GameStateBeginTurn(self))
  
          terrain = list()
          numbers = list()
          for tile in self.board.tiles:
              terrain.append(tile.terrain)
              numbers.append(tile.number)
  
          for (_, coord), piece in self.board.pieces.items():
              if piece.type == catan.pieces.PieceType.robber:
                  self.robber_tile = hexgrid.tile_id_from_coord(coord)
                  logging.debug('Found robber at coord={}, set robber_tile={}'.format(coord, self.robber_tile))
  
          self.catanlog.log_game_start(self.players, terrain, numbers, self.board.ports)
          self.notify_observers()
docs: Start the game.
  
          The value of option 'pregame' determines whether the pregame will occur or not.
  
          - Resets the board
          - Sets the players
          - Sets the game state to the appropriate first turn of the game
          - Finds the robber on the board, sets the robber_tile appropriately
          - Logs the catanlog header
  
          :param players: players to start the game with