I don't do much game development in my free time nowadays, but I've got many other programming related projects going on, and my process is roughly the same. My philosophy is to try to remove or defer as much complexity as possible and get a "complete enough" version of the software as soon as possible.
Usually, my personal projects follow these four stages:
(1) I have a cool idea that I would like to realise, I spend an evening working on it. Many, not to say most, of my projects get abandoned after this stage. Maybe I'm not that interested, they weren't as fun as I expected or I simply don't have the time to keep working on them at the moment. In any case, I accept this as part of the normal process. I've got way more ideas than I'll ever be able to realise.
(2) If I keep working on a project after the first evening, I try to reduce the project to the bare minimum set of core features required to cover the principal idea or use case. Even if I have a lot of cool ideas, I try to push as many as I can to further stages, and have a minimum game/project that I can finish in a few weeks of intermittent work. I know that I will abandon many projects after this stage, so I try to set goals that I can accomplish and have a feeling of completition even if my interest/free time plummets.
(3) Now I have a working version of the game, but it probably feels more like a demo than a complete version. It's time to focus on the features that I need to make it feel like a finished product. Again, I try to focus on the features that are strictly required to make the game feel like a complete working version, and that I can hopefully finish in a few more weeks of work.
(4) At this stage, I consider that my project is "complete" and I add all the features that I wanted to have but weren't important enough to implement in previous stages. Usually, I will have collected a list of them during the previous stages. I keep working on that set of features, one at a time, until I lose interest in the project. It doesn't matter how far I get, because at this point I have something that already feels complete and deliverable.
As somebody once said, "software is never completed, only abandoned", and since chances are that I will abandon it sooner than later, I try to have something that feels complete enough as soon as possible. That doesn't mean that I defer all the cool and interesting features to the end of the project. However, most of the times I can identify one or two interesting ideas that are the core of what I want to do, and defer the rest to later stages.