So you have the basics down, which is to create and spawn the grid, and then adding your tiles to an Array.
Everything you want to do with your grid can be done by referencing a large set of arrays that all have mirrored indexing.
If every map is 0-255, then every array that has anything to do with your entire map is also 0-255. If Index 0 is Vector X/Y, then affecting any of your arrays at index 0 should affect/reference the tile at Vector X/Y. I use dozens of arrays for my map generator, and they are all indexed in a similar fashion to your grid. Here is what that looks like on a spreadsheet:
I put the formulas for neighbor checking using indexes on that spreadsheet, which should give you an idea of what you need to do to create similar formulas that match your index.
For my work, I first create a Vector Array because I use the distance between vectors to determine what Seed is closest to the current tile I am setting. If a Water Seed is closer than a Land Seed, then the tile is set to Water. (I wrote an article about this here: http://www.epicallytech.com/articles/sculpting-believable-world-maps-and-other-uses-for-voronoi-diagrams.32/)
You are probably going to want the vectors of each tile stored in an array because you are going to want some kind of reference telling you where each tile is. If you want to move a unit to Tile 4, you get the Vector of Tile 4 from your Vector Array, and set the unit on it’s way.
Other notes:
If you stick to 16x16, then using static meshes is fine. If you want to do anything significantly bigger, such as 50x50 or bigger, then you are definitely going to want to switch to InstancedStaticMeshes. For examples of why/how, see my first Map Generator thread in my sig.
Accounting for World Wrap can be a major pain, if you use it. I suggest working out an efficient way of handling that as one of the first things you do.
Really work out solid Neighbor Checking functions early on. It will save you a lot of time later on. Here is a pic of one of mine:
Basically, you are going to be doing something on a tile and you are going to want to know what is happening in nearby tiles, and getting that tile’s index is how you do that. Notice how I am taking into account Offset, Edges, and World Wrap using the same function. Work that out now because it is key. I had 3-5 clunky, buggy systems before I finally nailed that down.
If you choose to use Axial coordinates, here is how you could fill your array with matching Axial Coordinates:
I made this generator but never needed to use it. If you can get good neighbor checking functions down, that take into account your Offset grid and other needs, then you don’t need axial. Especially on a small 16x16 grid. I might move to Axial later for performance reasons, but only maybe.
Anyway, that is all I have for now. There is a lot of information in my Map Generator threads and some of it is extremely complicated, but I pretty much worked through all the issues you are about to face and I outlined a lot of that starting in my first Map Generator thread. Let me know if you have any more specific questions.