diff --git a/P/Sd1/TicTacToe/V4/src/main/java/de/hdm_stuttgart/mi/sd1/tictactoe/Board.java b/P/Sd1/TicTacToe/V4/src/main/java/de/hdm_stuttgart/mi/sd1/tictactoe/Board.java index 7d198206549faf0454a78420f34ebeeb2e9a3e83..f7023e55ce4262fa4203c50fe3c441cbef6adaf2 100644 --- a/P/Sd1/TicTacToe/V4/src/main/java/de/hdm_stuttgart/mi/sd1/tictactoe/Board.java +++ b/P/Sd1/TicTacToe/V4/src/main/java/de/hdm_stuttgart/mi/sd1/tictactoe/Board.java @@ -47,8 +47,7 @@ public class Board { Helper.excludeIndex(freeFields, i)); if (currentActivePlayer.score == score) { - currentActivePlayer = currentActivePlayer.getOtherPlayer(); - numberOfMoves++; + completeMove(); return; // Leave current field occupied by active player. } else { if (0 == score) { @@ -58,12 +57,15 @@ public class Board { board[freeFieldIndex] = null; // Reset field to empty state, continue searching. } board[drawOrLooseIndex] = currentActivePlayer; + completeMove(); + } + + private void completeMove() { // To be called after setting a field. numberOfMoves++; currentActivePlayer = currentActivePlayer.getOtherPlayer(); } - - public int[] getFreeFields() { + private int[] getFreeFields() { final int[] freeFields = new int[numberOfFields - numberOfMoves]; int index = 0; @@ -81,7 +83,6 @@ public class Board { } private int getScore(final Player[] evalBoard, final Player activePlayer, final int[] freeFields) { - { final Player winner = getWinner(evalBoard); @@ -92,7 +93,9 @@ public class Board { } } - boolean drawChildExists = false; + int drawOrLooseScore = // Initial value: Opponent is winning + activePlayer.getOtherPlayer().score; + for(int i = 0; i < freeFields.length; i++) { final int freeFieldIndex = freeFields[i]; @@ -105,15 +108,10 @@ public class Board { if (activePlayer.score == score) { // Maximum or minimum (with respect to active player) has been reached. return activePlayer.score; } else if (0 == score) { - drawChildExists = true; // Continue searching for better (maximal or minimal) score. + drawOrLooseScore = 0; // We found a draw. } } - - if (drawChildExists) { - return 0; // There is at least one "draw" child to choose from. - } else { - return activePlayer.getOtherPlayer().score; // All board children score to the active player's enemy - } + return drawOrLooseScore; } public Player evaluateWinner(){ @@ -128,32 +126,32 @@ public class Board { static public Player getWinner(Player[] evalBoard) { if (null != evalBoard[4] && ( // Check both diagonals - (evalBoard[4] == evalBoard[0] && evalBoard[4] == evalBoard[8]) || // - (evalBoard[4] == evalBoard[6] && evalBoard[4] == evalBoard[2]))) { // x x - return evalBoard[4]; // x - } // x x - - for (int i = 0; i < fieldSize; i++) { // Check all three columns - if (null != evalBoard[i] && // +-= - evalBoard[i] == evalBoard[i + fieldSize] && - evalBoard[i] == evalBoard[i + 2* fieldSize]) { // +-= - return evalBoard[i]; // +-= + (evalBoard[4] == evalBoard[0] && evalBoard[4] == evalBoard[8]) || // + (evalBoard[4] == evalBoard[6] && evalBoard[4] == evalBoard[2]))) { // \ / + return evalBoard[4]; // X + } // / \ + + for (int i = 0; i < fieldSize; i++) { // Check all three columns + if (null != evalBoard[i] && // | | | + evalBoard[i] == evalBoard[i + fieldSize] && // | | | + evalBoard[i] == evalBoard[i + 2* fieldSize]) { // | | | + return evalBoard[i]; } } - for (int i = 0; i < 2 * fieldSize + 1; i += fieldSize) { // Check all three rows - if (null != evalBoard[i] && // +++ - evalBoard[i] == evalBoard[i + 1] && evalBoard[i] == evalBoard[i + 2]) { // --- - return evalBoard[i]; // === + for (int i = 0; i < 2 * fieldSize + 1; i += fieldSize) { // Check all three rows + if (null != evalBoard[i] && // --- + evalBoard[i] == evalBoard[i + 1] && evalBoard[i] == evalBoard[i + 2]) { // --- + return evalBoard[i]; // --- } } - return null; + return null; // No winner found. } /** * Occupy the next field by player {@link #getCurrentActivePlayer()}. * - * Fields are being numbered by: + * Fields are being numbered as: * * 1|2|3 * -+-+- @@ -161,7 +159,7 @@ public class Board { * -+-+- * 7|8|9 * - * @param field The field in question + * @param field The field in question using user perspective numbering (1,...,9) * * @return An error message indication either an occupied field or an index violation. * null if everything is o.K. @@ -176,8 +174,7 @@ public class Board { final Player current = board[fieldIndex]; if (current == null) { board[fieldIndex] = currentActivePlayer; - currentActivePlayer = currentActivePlayer.getOtherPlayer(); - numberOfMoves++; + completeMove(); return null; } else { return "Field already occupied by " + current.nickname; @@ -185,21 +182,6 @@ public class Board { } } - static public void printNumberingHint() { - System.out.println("Numbering scheme:\n"); - for (int y = 0; y < 3; y++) { - for (int x = 0; x < 3; x++) { - System.out.print((char)('1' + x + y * fieldSize)); - if (x < fieldSize - 1) { - System.out.print('|'); - } - } - if (y < fieldSize - 1) { - System.out.println("\n-+-+-"); - } - } - } - /** * Get the player instance which will do the next move. See {@link #nextMove(short)} * diff --git a/P/Sd1/TicTacToe/V4/src/test/java/de/hdm_stuttgart/mi/sd1/connectfour/ScoreTest.java b/P/Sd1/TicTacToe/V4/src/test/java/de/hdm_stuttgart/mi/sd1/connectfour/ScoreTest.java index 4cf14dfe924d0b8d6ef21b6341de6a4f793c2146..cf69f974120966c7116cce29525ab1215323c435 100644 --- a/P/Sd1/TicTacToe/V4/src/test/java/de/hdm_stuttgart/mi/sd1/connectfour/ScoreTest.java +++ b/P/Sd1/TicTacToe/V4/src/test/java/de/hdm_stuttgart/mi/sd1/connectfour/ScoreTest.java @@ -49,7 +49,7 @@ public class ScoreTest { public void testDraw1() { final Board board = new Board( - COM, // active player. + COM, // active player X. new Player[] { null, null, null, // | | @@ -58,7 +58,7 @@ public class ScoreTest { // -+-+- YOU, null, COM}); // O| |X - Assert.assertEquals(YOU.score, board.getScore()); + Assert.assertEquals(0, board.getScore()); }