Browse Source

code review with kajetan

Marvin Löschenkohl 3 years ago
parent
commit
f6d822cbba
4 changed files with 136 additions and 183 deletions
  1. 76 0
      src/Game.java
  2. 5 51
      src/Main.java
  3. 48 96
      src/PlayField.java
  4. 7 36
      src/Player.java

+ 76 - 0
src/Game.java

@@ -0,0 +1,76 @@
+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);
+    }
+}

+ 5 - 51
src/Main.java

@@ -1,64 +1,18 @@
 public class Main {
-
     public static void main(String[] args) {
-        PlayField field = new PlayField(6, 7);
-
         try(ConsoleReader cr = new ConsoleReader()) {
             do {
-                doGame(cr, field);
-            } while(askPlayAgain(cr, field));
-        }
-    }
-
-    public static void doGame(ConsoleReader cr, PlayField field) {
-        Player me = new Player(1, "x", false);
-        Player opp = new Player(2, "o", true);
-
-        Player[] players = new Player[2];
-        players[0] = me;
-        players[1] = opp;
-
-        while(true) {
-            for(Player player : players) {
-                int column;
-                if(player.hasKi()) {
-                    column = player.getKiTurn(field);
-                } else {
-                    column = player.getTurn(cr, field);
-                }
-                int row = field.getFreeRow(column);
-
-                field.setPos(row, column, player);
-                field.print();
-                if(hasGameEnded(field, player, row, column)) {
-                    break;
-                }
-            }
-        }
-    }
-
-    public static boolean hasGameEnded(PlayField field, Player player, int row, int column) {
-        if(field.hasWon(player, row, column)) {
-            printWinner(player);
-            return true;
-        }
-        if(field.isDraw()) {
-            System.out.println("Draw.");
-            return true;
+                Game game = new Game(7, 6, cr);
+                game.run();
+            } while(askPlayAgain(cr));
         }
-        return false;
-    }
-
-    public static void printWinner(Player player) {
-        System.out.println("Player " + player.getToken() + " has won.");
     }
 
-    private static boolean askPlayAgain(ConsoleReader cr, PlayField field) {
+    private static boolean askPlayAgain(ConsoleReader cr) {
         while(true) {
             System.out.println("New game? Y/N");
             String s = cr.readLine();
             if(s.equals("Y")) {
-                field.reset();
                 return true;
             } else if(s.equals("N")) {
                 System.out.println("Game closed.");
@@ -66,4 +20,4 @@ public class Main {
             }
         }
     }
-}
+}

+ 48 - 96
src/PlayField.java

@@ -1,140 +1,92 @@
 public class PlayField {
-    private int rows;
-    private int columns;
-    private final int[][] fields;
+    private int width;
+    private int height;
+    private final char[][] fields;
 
-    public PlayField(int rows, int columns) {
-        this.rows = rows;
-        this.columns = columns;
-        fields = new int[rows][columns];
+    public PlayField(int width, int height) {
+        this.width = width;
+        this.height = height;
+        fields = new char[width][height];
+        reset();
     }
 
-    public final void setPos(int row, int column, Player player) {
-        fields[row][column] = player.getIndex();
+    public final void setPos(int x, int y, Player player) {
+        fields[x][y] = player.getToken();
     }
 
-    public int getRows() {
-        return rows;
+    public int getWidth() {
+        return width;
     }
 
-    public int getColumns() {
-        return columns;
+    public int getHeight() {
+        return height;
     }
 
     public void print() {
-        for(int i = 1; i <= getColumns(); i++) {
+        for(int i = 1; i <= width; i++) {
             System.out.print("[" + i + "]");
         }
         System.out.println();
-        for(int[] row : fields) {
-            for(int column : row) {
-                if(column == 0) {
-                    printSlot(" ");
-                } else if(column == 1) {
-                    printSlot("x");
-                } else {
-                    printSlot("o");
-                }
+        for(int y = 0; y < height; y++) {
+            for(int x = 0; x < width; x++) {
+                System.out.print("[" + fields[x][y] + "]");
             }
             System.out.println();
         }
     }
 
-    public void printSlot(String value) {
-        System.out.print("[" + value + "]");
-    }
-
     public void reset() {
-        for(int row = 0; row < getRows(); row++) {
-            for(int column = 0; column < getColumns(); column++) {
-                fields[row][column] = 0;
+        for(int x = 0; x < width; x++) {
+            for(int y = 0; y < height; y++) {
+                fields[x][y] = ' ';
             }
         }
     }
 
-    public int getFreeRow(int column) {
-        for(int row = getRows() - 1; row >= 0; row--) {
-            if(fields[row][column] == 0) {
-                return row;
+    public int getFreeY(int x) {
+        for(int y = height - 1; y >= 0; y--) {
+            if(fields[x][y] == ' ') {
+                return y;
             }
         }
         return -1;
     }
 
-    public boolean hasFreeRow(int column) {
-        for(int row = getRows() - 1; row >= 0; row--) {
-            if(fields[row][column] == 0) {
-                return true;
-            }
-        }
-        return false;
-    }
-
     public boolean isDraw() {
-        for(int row = 0; row < getRows(); row++) {
-            for(int column = 0; column < getColumns(); column++) {
-                if(fields[row][column] == 0) {
-                    return false;
-                }
+        for(int x = 0; x < width; x++) {
+            if(getFreeY(x) != 1) {
+                return false;
             }
         }
         return true;
+
     }
 
-    public boolean hasWon(Player player, int r, int c) {
-        // Horizontal left
-        if(checkDirection(player, r, c, "left", "")) {
-            return true;
-        }
-        // Horizontal right
-        if(checkDirection(player, r, c, "right", "")) {
-            return true;
-        }
-        // Vertical (only down)
-        if(checkDirection(player, r, c, "", "down")) {
-            return true;
-        }
-        // Diagonal left up
-        if(checkDirection(player, r, c, "left", "up")) {
-            return true;
-        }
-        // Diagonal left down
-        if(checkDirection(player, r, c, "left", "down")) {
-            return true;
-        }
-        // Diagonal right up
-        if(checkDirection(player, r, c, "right", "up")) {
-            return true;
-        }
-        // Diagonal right down
-        if(checkDirection(player, r, c, "right", "down")) {
-            return true;
+    public boolean hasWon(Player player, int y, int x) {
+        for(int dir_x = -1; dir_x <= 1; dir_x++) {
+            for(int dir_y = -1; dir_y <= 1; dir_y++) {
+                if(dir_x == 0 && dir_y == 0) {
+                    continue;
+                }
+                if(checkDirection(player, y, x, dir_y, dir_x)) {
+                    return true;
+                }
+            }
         }
         return false;
     }
 
-    public boolean checkDirection(Player player, int r, int c, String horizontal, String vertical) {
-        int index = player.getIndex();
-        int h = 0;
-        int v = 0;
-        if(horizontal == "left") {
-            h = -1;
-        } else if(horizontal == "right") {
-            h = 1;
-        }
-        if(vertical == "up") {
-            v = -1;
-        } else if(vertical == "down") {
-            v = 1;
-        }
-        try {
-            if(fields[r][c] == index && fields[r + v][c + h] == index && fields[r + 2 * v][c + 2 * h] == index && fields[r + 3 * v][c + 3 * h] == index) {
-                return true;
+    private boolean checkDirection(Player player, int x, int y, int dir_x, int dir_y) {
+        char t = player.getToken();
+        for(int i = 1; i < 4; i++) {
+            int new_x = x + i * dir_y;
+            int new_y = y + i * dir_x;
+            if(new_x < 0 || new_x >= width || new_y < 0 || new_y >= height
+                    || fields[new_x][new_y] != t) {
+                return false;
             }
-        } catch(ArrayIndexOutOfBoundsException e) {
-
         }
-        return false;
+        return true;
     }
 
 }

+ 7 - 36
src/Player.java

@@ -1,46 +1,17 @@
-import java.util.Random;
-
 public class Player {
-    private int index;
-    private String token;
-    private boolean ki;
-    private final Random move = new Random();
+    private char token;
+    private boolean ai;
 
-    public Player(int index, String token, boolean ki) {
-        this.index = index;
+    public Player(char token, boolean ai) {
         this.token = token;
-        this.ki = ki;
-    }
-
-    public int getIndex() {
-        return index;
+        this.ai = ai;
     }
 
-    public String getToken() {
+    public char getToken() {
         return token;
     }
 
-    public boolean hasKi() {
-        return ki;
-    }
-
-    public int getTurn(ConsoleReader cr, PlayField field) {
-        int columns = field.getColumns();
-        String s = "Where do you want to set your meeple? (1-" + columns + ")";
-        while(true) {
-            System.out.println(s);
-            int column = cr.readInt(s) - 1;
-            if(column >= 0 && column < columns && field.hasFreeRow(column)) {
-                return column;
-            }
-        }
-    }
-
-    public int getKiTurn(PlayField field) {
-        int column;
-        do {
-            column = move.nextInt(field.getColumns());
-        } while(!field.hasFreeRow(column));
-        return column;
+    public boolean hasAI() {
+        return ai;
     }
 }