import java.util.Random; public class Game { private PlayField field; private ConsoleReader consoleReader; private final Random move = new Random(); public Game(int width, int height, ConsoleReader cr) { field = new PlayField(width, height); consoleReader = cr; } public void run() { Player[] players = new Player[] { new Player('x', false), new Player('o', true) }; while(true) { for(Player player : players) { if(player.hasAI()) { if(doAITurn(player)) { return; } } else if(doTurn(player)) { return; } } } } public boolean hasEnded(Player player, int x, int y) { if(field.hasWon(player, x, y)) { printWinner(player); return true; } if(field.isDraw()) { System.out.println("Draw."); return true; } return false; } private void printWinner(Player player) { System.out.println("Player " + player.getToken() + " has won."); } public boolean doTurn(Player player) { int width = field.getWidth(); String s = "Where do you want to set your meeple? (1-" + width + ")"; while(true) { System.out.println(s); int x = consoleReader.readInt(s) - 1; if(x < 0 || x >= width) { continue; } int y = field.getFreeY(x); if(y != -1) { return setAndCheck(x, y, player); } } } public boolean doAITurn(Player player) { System.out.println("AI's turn:"); while(true) { int x = move.nextInt(field.getWidth()); int y = field.getFreeY(x); if(y != -1) { return setAndCheck(x, y, player); } } } public boolean setAndCheck(int x, int y, Player player) { field.setPos(x, y, player); field.print(); return hasEnded(player, x, y); } }