You first need to think carefully and thoroughly about the problem you are trying to solve. Myself, I find that UML modelling techniques are useful, especially for more complex problems. For general system overview, use-case diagrams help constrain the problem domain. For structural issues, how things are connected/related, class diagrams work well. For behavioral issues, finite-state machines and sequence diagrams rule. If you are serious about getting into professional software development and engineering, these sort of tools are indespensible.
I agree with rubberman.
Start with UML uses cases -> class diagrams -> sequence diagrams. Once you've done that you have the basic structure of your code (classes / important variables / public methods) all planned out. See the first few sections of this
Personally I'm no fan of state diagrams because these never seem to translate into actual code in any obvious way (others may disagree).