The peices are 3d, correct? If they are 3d then you dont need to know the relationship between the world and the screen, just position them in 3d.
dbObjectWidth() and dbObjectLength() (i think its length) will give you the size of your peices, but what you really want to know is the size of a square on the board. This can easilly be obtained by getting the width of your board object (its one solid 3d object yes?) using the dbObjectWidth() command and then divide its width by the number of squares along the boards width. That will give you the width of one square, then do the same for the length of the board. Output those values to the screen so you can write them down for easy remembering.
Now, if you want to fill the entire board with peices that are all the same, use the tile method I mentioned in the first post. If however some peices need to start in certain places/theres different peices/etc then if you know which square of the board a peice needs to be on then you can position it using
dbPositionObject(nPeiceObjectNumber, BoardSquareX * SquareWidth, BoardSquareZ * SquareHeight);
SquareWidth/Height being the width and height of one board square you calculated earlier.
If you are using 2d sprites for your peices.. well getting them positioned and rotated exactally right is a pain. I wont even attempt to explain in full incase you arnt needing them, but if i remember correctly then off the top of my head you would need to get the 3d coordinate of where you would position the peice if it was 3d then do something like
screenx = peicex / peicez;
screeny = peicey / peicez;
theres other methods.
Right, for selecting a 3d object with your mouse you want to look at the dbPickObject() command. It will return the object id of an object from a screen position. There first two parameters are the x/y screen location to start from - in your case you would want to pass dbMouseX() and dbMouseY() as the first two parameters respectivly. The last two parameters are the object start and end which specifys a range of object id's to scan for a collision with.
Now, the more objects it has to scan the slower it is obviously so you want to limit this to only objects that you ever need to select. In this case, you dont want to be able to select the board (right?) only the peices. What I like to do is in my games I define a set of constants (or occasionally enumerations depending on the situation) which define offsets for my object loading. For example I might define something like
#define PLAYER_MODELS 100
#define WORLD_ENTITIES 200
and when I load objects like for the players I would say dbLoadObject(PLAYER_MODELS + nPlayerIndex, blah blah etc)
not only does this make it easier to see whats what because you can for example see there that any object id between 100 and 199 belongs to a player, but it gives you an easy range for doing checks like this. Back to your problem, if you do as I did there you could make the last two parameters of the function PEICE_MODELS and PEICE_MODELS + nTotalPeices so the function would end up like:
int nResult = dbPickObject(dbMouseX(), dbMouseY(), PEICE_MODELS, PEICE_MODELS + nTotalPeices);
with nTotalPeices obviously being the total amount of peice objects on the board. That limits the range nicely to only the things you want to select, did all that make sense? Im afraid I tend to go on a bit when I should be summarising
dbPickObject will return the object id that it collides with, if any, within the range you specify. So if you have an array already storing peices on the board then just add the objectid into that array when you first generate it then when someone clicks and dbPickObject returns an object id you can scan the array for a matching object id and you will know exactally which was clicked on, ya?
Hope that helped
#####################EDIT#####################
Oh I forgot to mention, if your board is CENTERED at 0, 0, 0 so half of it is in the negitive side of world co-ordinates then you cant just directly do
dbPositionObject(nPeiceObjectNumber, BoardSquareX * SquareWidth, BoardSquareZ * SquareHeight);
it will have to become
dbPositionObject(nPeiceObjectNumber, (BoardSquareX * SquareWidth) - (BoardWidth / 2), (BoardSquareZ * SquareHeight) - (BoardHeight / 2));
get the width and height of the board the same way you would anything else, dbObjectWidth() etc.
Also for clarfication, alot of the time I appear to be saying Height when in all honesty I should be saying Length - im talking about the z plane. Too much 2d work for me has left me with a habbit of saying height :o