Game.java 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import java.util.Random;
  2. public class Game {
  3. private PlayField field;
  4. private ConsoleReader consoleReader;
  5. private final Random move = new Random();
  6. public Game(int width, int height, ConsoleReader cr) {
  7. field = new PlayField(width, height);
  8. consoleReader = cr;
  9. }
  10. public void run() {
  11. Player[] players = new Player[] { new Player('x', false), new Player('o', true) };
  12. while(true) {
  13. for(Player player : players) {
  14. if(player.hasAI()) {
  15. if(doAITurn(player)) {
  16. return;
  17. }
  18. } else if(doTurn(player)) {
  19. return;
  20. }
  21. }
  22. }
  23. }
  24. public boolean hasEnded(Player player, int x, int y) {
  25. if(field.hasWon(player, x, y)) {
  26. printWinner(player);
  27. return true;
  28. }
  29. if(field.isDraw()) {
  30. System.out.println("Draw.");
  31. return true;
  32. }
  33. return false;
  34. }
  35. private void printWinner(Player player) {
  36. System.out.println("Player " + player.getToken() + " has won.");
  37. }
  38. public boolean doTurn(Player player) {
  39. int width = field.getWidth();
  40. String s = "Where do you want to set your meeple? (1-" + width + ")";
  41. while(true) {
  42. System.out.println(s);
  43. int x = consoleReader.readInt(s) - 1;
  44. if(x < 0 || x >= width) {
  45. continue;
  46. }
  47. int y = field.getFreeY(x);
  48. if(y != -1) {
  49. return setAndCheck(x, y, player);
  50. }
  51. }
  52. }
  53. public boolean doAITurn(Player player) {
  54. System.out.println("AI's turn:");
  55. while(true) {
  56. int x = move.nextInt(field.getWidth());
  57. int y = field.getFreeY(x);
  58. if(y != -1) {
  59. return setAndCheck(x, y, player);
  60. }
  61. }
  62. }
  63. public boolean setAndCheck(int x, int y, Player player) {
  64. field.setPos(x, y, player);
  65. field.print();
  66. return hasEnded(player, x, y);
  67. }
  68. }