package nim; import java.util.Random; public class Game { private int[] rows = new int[3]; private Player player1; private Player player2; public Game(Player player1, Player player2, int top, int middle, int bottom) { this.player1 = player1; this.player2 = player2; rows[0] = top; rows[1] = middle; rows[2] = bottom; } public Player playGame(boolean output) { Random random = new Random(); Player currentPlayer; if(random.nextBoolean()) currentPlayer = player1; else currentPlayer = player2; do { try { Move move = currentPlayer.makeMove(rows[0], rows[1], rows[2]); if(isLegal(move)) { rows[move.row.ordinal()] -= move.count; if(output) System.out.println("Player " + currentPlayer.getName() + " removed " + move.count + (move.count == 1 ? " object" : " objects") + " from the " + move.row.getName() + " row."); } else { if(output) System.out.println("Player " + currentPlayer.getName() + " made an illegal move."); break; } } catch(Exception e) { // In case player causes exception if(output) System.out.println("Player " + currentPlayer.getName() + " raised an exception."); break; } finally { if(currentPlayer == player1) currentPlayer = player2; else currentPlayer = player1; } } while(rows[0] + rows[1] + rows[2] > 0); if(output) System.out.println("Player " + currentPlayer.getName() + " wins!"); return currentPlayer; } private boolean isLegal(Move move) { int row = move.row.ordinal(); int count = move.count; return count >= 1 && count <= rows[row]; } }