When you program, you should always try to program at the highest level. "This level provides the abstractive power to work with a problem on its own terms. Your code at this level should be somewhat readable by someone who's not a computer-science whiz. At this level your code depends more on the tools you've built than on the capabilities of the language you're using." 
Basically your goal is layer computer-science data structures until you can use language similar to the problem domain. If your problem domain is Magic: The Gathering hopefully you have methods like startGame() and drawCard(player). These methods are "high level" because they can be understood by a Magic player who isn't a computer programmer.
Thankfully MTG Forge has a number of high level methods and objects. In the beginning I didn't have drawCard() and I would just duplicate the code. Needless to say this isn't the best solution, so I created drawCard() out of convenience.
Not all methods and object can be defined by the Magic glossary. Paying the mana cost involves a number of "artificial steps" that the computer has to do which are trivial in a real world game such as checking to see if the mana is necessary as well as untapping lands when the user cancels and doesn't pay for the spell. Combat also involves many artificial steps that the computer needs in order to make combat work correctly such as assigning damage and triggering combat abilities like Hypnotic Specter.
In closing, write high level code because it will save you time and frustration in the long run.
 - Code Complete by Steve McConnell. This is a great programming book that is one of my major influences. This book is better than all of the books that I had to read for my computer degree, bachelor's in information science. I suggest that you try to find it at your local library.
The book has both a first and second edition. I still have the first edition but the second edition has probably 10% new and updated material. If you are cheap buy a used copy of the first edition.