From c0310d8ed63d6091bf7e102be8f6fc0becc2f64b Mon Sep 17 00:00:00 2001 From: Tobias Krause Date: Wed, 2 Feb 2022 19:02:05 +0100 Subject: [PATCH] tictactoe: hard ai uses chance to win in diagonal --- .../java/de/tims/tictactoe/ai/AIHard.java | 20 ++++++++++++++++--- .../java/de/tims/tictactoe/ai/AIHardTest.java | 11 ++++++++++ 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/main/java/de/tims/tictactoe/ai/AIHard.java b/src/main/java/de/tims/tictactoe/ai/AIHard.java index 472e918..b6a6d6e 100644 --- a/src/main/java/de/tims/tictactoe/ai/AIHard.java +++ b/src/main/java/de/tims/tictactoe/ai/AIHard.java @@ -21,6 +21,7 @@ public class AIHard implements TicTacToeAI { public void calculateNextMove() { int ownCharsInRow = 0; int ownCharsInCol = 0; + int ownCharsInDiag = 0; int charsOfOpponentInRow = 0; int charsOfOpponentInCol = 0; int charsOfOpponentInDiag = 0; @@ -32,14 +33,27 @@ public class AIHard implements TicTacToeAI { charsOfOpponentInRow = countCharsInRow(i, PLAYER_CHAR); charsOfOpponentInCol = countCharsInCol(i, PLAYER_CHAR); if (i < 2) { + ownCharsInDiag = countCharsInDiag(i, AI_CHAR); charsOfOpponentInDiag = countCharsInDiag(i, PLAYER_CHAR); } if (ownCharsInRow == BOARD_SIZE - 1 || ownCharsInCol == BOARD_SIZE - 1) { for (int j = 0; j < BOARD_SIZE; j++) { - if (board[(ownCharsInRow == BOARD_SIZE - 1) ? i : j][(ownCharsInRow == BOARD_SIZE - 1) ? j : i] == EMPTY_CHAR) { - gl.setField((ownCharsInRow == BOARD_SIZE - 1) ? i : j, (ownCharsInRow == BOARD_SIZE - 1) ? j : i, AI_CHAR); - return; + if (ownCharsInRow == BOARD_SIZE - 1) { + if (board[i][j] == EMPTY_CHAR) { + gl.setField(i, j, AI_CHAR); + return; + } + } else if (ownCharsInCol == BOARD_SIZE - 1) { + if (board[j][i] == EMPTY_CHAR) { + gl.setField(j, i, AI_CHAR); + return; + } + } else if (ownCharsInDiag == BOARD_SIZE - 1) { + if (board[j][(i == 1) ? i : BOARD_SIZE - 1 - j] == EMPTY_CHAR) { + gl.setField(j, (i == 1) ? j : BOARD_SIZE - 1 - j, AI_CHAR); + return; + } } } } diff --git a/src/test/java/de/tims/tictactoe/ai/AIHardTest.java b/src/test/java/de/tims/tictactoe/ai/AIHardTest.java index 5410f64..db84c3f 100644 --- a/src/test/java/de/tims/tictactoe/ai/AIHardTest.java +++ b/src/test/java/de/tims/tictactoe/ai/AIHardTest.java @@ -121,6 +121,17 @@ class AIHardTest { verify(gl, times(1)).setField(1, 0, realChar); } + @Test + void when2inDiagSetThird() { + char realChar = 'o'; + doReturn(new char[][] { {'o', '-', 'x'}, {'-', 'o', 'x'}, {'-', '-', '-'} }).when(gl).getBoard(); + + TicTacToeAI ai = new AIHard(gl); + ai.calculateNextMove(); + + verify(gl, times(1)).setField(2, 2, realChar); + } + @ParameterizedTest @MethodSource("testCasesForCountCharsInRow") void countCharsInRowTest(String testName, char[][] board, int rowNum, char charToCount, int expectedResult) {