Object-oriented programming allows for a lot of flexibility, but if it's used incorrectly, it can also cause a lot of confusion, since it's easy to develop very complex systems when much simpler solutions would suffice.
You should start a small working system before evolving it into more complex ones. Also, realize that most real-world designs are over-constrained, and you will not be able to please everyone, so you must decide on the priorities for your system.
Each part of your system should focus on a single thing, and doing that thing well. When in doubt, make shorter things. Make shorter classes and shorter methods. Doing so will force your objects to focus on a single responsibility, which will in turn improve your design and will allow you to reuse code more easily.
Make your objects as private as possible...