I would suggest TDD (Test Driven Development), that advocates writing test before writing the code. I did a similar project a few years back, and the test saved my ass more than once.
It is an iterative process, which advocates making small steps and gradually building the end application.
1) Start with writing the requirements for some subset of the problems, such as moves.
2) Make some test cases such as 'unit should be able to move three blocks' or 'unit should not be able to move, when it is the other players turn'. Remember to keep focus, which means keep changing the same problem domain until it works.
3) Fake it till you make it, i.e. fake the tests to return true or false or some other passing value.
4) Make a small change, see the tests fail and then implement the given problem correctly.
5) repeat
The main deal is to keep it simple and take small steps.
As for the design of the code, consider the FACADE pattern, and of course the other more trivial ones as State, Strategy and AbstractFactory.