Yeah, if you don’t want to use much or any procedural generation then spawning a simple hex map is pretty easy.
Your problem is manageable. You probably just need to take it in bitesized chunks.
First thing you need to do is create a data structure that holds your tile vectors. If you look in my threads at the vector field generator, as I do the math for the tile vectors I am specifically filling an array in a way that is manageable to my brain. You can also look at the spreadsheet I posted to see how those indexes line up to form the map. Indexes 0 through 9 are the first row, 10 through 19 the second, etc. Index 0 is the lower right hand corner. Index 199 is the upper left corner.
You really only need a 1d array to hold your data structure, but you could make a struct with an array inside, and then make an array of that struct. My data structure has been built entirely on top of a 1d array and I am fine with that. I use 2d arays for other special needs such as holding an array of water bodies, rivers, etc.
In the early days I spawned invisible hex collision volumes so when you clicked the map it would hit one and get the index for the underlying tile. This is an easy solution if you don’t want to get into the math. The only reason I use a single collision sphere now is because I have projected the map into a sphere and can’t use individual collision tiles.
Once you have your data structure and know how to interact with it, how much more complicated you make generation is up to you. But at some point you are going to have to deal with pathfinding and AI, and those topics can be extremely complicated. Even those are manageable though if you take it one step at a time.