The game is (eventually) intended to be playable over a network. Therefore it is feasible to set the project up so this can be achieved. Therefore the code is divided in a client and a server side. Both can run on the same machine (even the same VM) or can be used in a game server (these approaches are not yet decided). Although there are some game engines for Java around, some pose a problem with the license type, but mainly this project is about learning how such a thing works and that is best done by just implementing the thing. The game engine has some tasks to full fill:
The communication between client and server happens through messages. This allows efficient handling if all the code runs in the same VM and is easy to realize with a network layer in between. As the game is not turn based each player is represented by its own thread, to start with. In the first few versions of the game this will be the thread for the human player which incidentally is their GUI, and several threads for the AI. Here we must find improvements to reduce the AI Player threads. When moving the the networked level, there are the threads for the AI players, that compute and then send out their results, and the thread for all the players, which listens for updates and notifies all the other participants.