Browse Source

tictactoe: hard ai uses chance to win in diagonal

tictactoe
Tobias Krause 3 years ago
committed by Lorenz Hohmann
parent
commit
c0310d8ed6
  1. 18
      src/main/java/de/tims/tictactoe/ai/AIHard.java
  2. 11
      src/test/java/de/tims/tictactoe/ai/AIHardTest.java

18
src/main/java/de/tims/tictactoe/ai/AIHard.java

@ -21,6 +21,7 @@ public class AIHard implements TicTacToeAI {
public void calculateNextMove() { public void calculateNextMove() {
int ownCharsInRow = 0; int ownCharsInRow = 0;
int ownCharsInCol = 0; int ownCharsInCol = 0;
int ownCharsInDiag = 0;
int charsOfOpponentInRow = 0; int charsOfOpponentInRow = 0;
int charsOfOpponentInCol = 0; int charsOfOpponentInCol = 0;
int charsOfOpponentInDiag = 0; int charsOfOpponentInDiag = 0;
@ -32,15 +33,28 @@ public class AIHard implements TicTacToeAI {
charsOfOpponentInRow = countCharsInRow(i, PLAYER_CHAR); charsOfOpponentInRow = countCharsInRow(i, PLAYER_CHAR);
charsOfOpponentInCol = countCharsInCol(i, PLAYER_CHAR); charsOfOpponentInCol = countCharsInCol(i, PLAYER_CHAR);
if (i < 2) { if (i < 2) {
ownCharsInDiag = countCharsInDiag(i, AI_CHAR);
charsOfOpponentInDiag = countCharsInDiag(i, PLAYER_CHAR); charsOfOpponentInDiag = countCharsInDiag(i, PLAYER_CHAR);
} }
if (ownCharsInRow == BOARD_SIZE - 1 || ownCharsInCol == BOARD_SIZE - 1) { if (ownCharsInRow == BOARD_SIZE - 1 || ownCharsInCol == BOARD_SIZE - 1) {
for (int j = 0; j < BOARD_SIZE; j++) { 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);
if (ownCharsInRow == BOARD_SIZE - 1) {
if (board[i][j] == EMPTY_CHAR) {
gl.setField(i, j, AI_CHAR);
return; 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;
}
}
} }
} }

11
src/test/java/de/tims/tictactoe/ai/AIHardTest.java

@ -121,6 +121,17 @@ class AIHardTest {
verify(gl, times(1)).setField(1, 0, realChar); 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 @ParameterizedTest
@MethodSource("testCasesForCountCharsInRow") @MethodSource("testCasesForCountCharsInRow")
void countCharsInRowTest(String testName, char[][] board, int rowNum, char charToCount, int expectedResult) { void countCharsInRowTest(String testName, char[][] board, int rowNum, char charToCount, int expectedResult) {

Loading…
Cancel
Save