So, you want to complete your projects, but it sounds like your disincentive from frustration exceeds whatever incentive you have to finish.
Frustration is something that's always an issue in software development. If you always knew how to solve every problem, the time from start to completion would be the time it takes you to type the code. Part of the process of becoming a good programmer (or problem solver more generally) is learning to deal with frustration. Sometimes that means knowing how to step back and look at the problem in a different way, sometimes it means knowing when to step away altogether, and sometimes it means knowing how to get back on the horse that threw you and give it another try.
It'll also help to develop strategies to avoid becoming stuck or frustrated in the first place. Good design helps avoid problems before they occur. Good methodology -- keeping track of tasks and bugs, documenting what you're doing, unit testing, etc. -- help catch problems early and makes sure that you stay on track.
If the first thing you do when you decide to work on a new project is to start typing code, you should start thinking about your development process. Go back and look at your directory full of unfinished projects. Take a few minutes to look at each project so that you remember what you were trying to do and why you stopped, and then write that down in a few paragraphs. When you're done, you'll have a catalog of all your projects and the reasons why you stopped working. You'll probably notice some patterns, like: "I stopped development on this project because I ran into [a major issue], and I couldn't get past that without rewriting a lot of the project." Was that major issue something that you could have predicted if you'd done a better analysis and design before you started coding? Was it something that you could have detected with a quick proof of concept? Nobody here can tell you exactly why your projects are failing, but you've got all the data there waiting for you -- just take an honest look at what you've done so far.
Adding more steps to your development process, like writing a design document, adding unit testing, etc., might not seem like something you want to do when you're just programming for fun. But you're obviously not happy with the kind of progress you're making, and it's a LOT more fun to program when you can eliminate the sources of your frustration and help keep your development going smoothly. It's also a lot more fun to have a list of completed projects than a list of aborted attempts.
It's always easy to start projects, but usually not so easy to finish them. The devil is in the details.