The previous posters are correct. I'd add from being a failed programmer, this:
Start with manageable things. Having a huge goal is great (Look at DF), but figuring out individual systems in do-able chunks is how you achieve that goal.
Learning by doing is great, to a point. Learning while working on a big project that forces you to constantly re-evaluate the noob mistakes you made when you were just getting started, is not. Start with smaller projects that incorporate one idea, so that perfecting that idea gives you a victory rush, and you're eager to apply that to what comes next. Working towards a huge goal first will do the opposite, as each new victory forces you to re-evaluate what you didn't get just right before. This is why code debugging and maintenance are pains in the ass.
COMMENT YOUR CODE AS YOU WRITE IT! No matter how elementary it seems, in a month you won't have any idea what int cleverintname was supposed to do, should you need to modify it later.
Also, C can give you a syntactic grounding for C++, but once you've gotten small things going, it will be much easier long-term if you switch to learning C++ or C# as soon as you're comfortable doing so. Procedural languages have their place, but object-oriented is mandatory for the scope you're hoping for.
If I may ask, how comfortable are you with data structures and manipulation, file I/O functionality, and graphical conventions? There's a HUGE gap between "hello, world!" and compiling an alphabetically sorted list of all the items in crate #84572 of SeaLab's cargo bay. And that's just a crate.