I would suggest trying to get a "@ moving around the screen" demo before attempting combat. It's harder than you would think.
And some practical advice (I'm assuming you are using C++):
* Don't be afraid to dump (but archive) your first attempt.
* Tiles:
The most painful part methinks is deciding how to handle tiles. The most obvious way is to have the tiles point at the things they contain. This way, with a reference to a tile, you can learn what is within. However, the things within do not know where they are, which can result in a problem later.
What about the opposite? You can give the things pointers to your tiles instead. This means that the tiles can be very simple, even just an array of ints. However, given a reference to a tile, you cannot find out the things within.
There's no right way out of this paradox. However, one way is to create a GameObject class which both the tile class and the classes of the things desecend from. Now you can give everybody a GameObject* pointer, and have it both ways!
* When you get to it, here is the greatest A* pathfinding tutorial ever.
* There's little advantage in having multiple files for a small project. And the jump is rather large. You should only take it if you think you are ready.
And that's all I can think of at the moment. I do know some arcana about static variables, the new keyword, and linked lists, so if you have questions about them, feel free to ask.
[ January 17, 2008: Message edited by: Gigalith ]