private static int evaluateForPattern(State state, int patternSize) { int size = State.BORAD_SIZE; int value = 0; int i, j; Pattern pattern1 = new Pattern(patternSize); Pattern pattern2 = new Pattern(patternSize); for (i = 0; i < size; i++) { pattern1.reset(); pattern2.reset(); for (j = 0; j < patternSize; j++) { pattern1.put(state.board[j][i]); pattern2.put(state.board[i][j]); } j--; do { // System.out.println("i:" + i + " j:" + j); value += pattern1.matches(); value += pattern2.matches(); j++; if (j == size) break; // pattern1 -= state.board[j - patternSize][i]; pattern1.put(state.board[j][i]); // pattern1 += state.board[j][i]; // pattern2 -= state.board[i][j - patternSize]; pattern2.put(state.board[i][j]); // pattern2 += state.board[i][j]; } while (true); } // (k1-k2: 45 degree, k1-k3 : 135 degree) int k1, k2, k3; for (i = -(size - patternSize); i <= size - patternSize; i++) { if (i < 0) { k1 = -i; k2 = 0; k3 = size - 1; } else { k1 = 0; k2 = i; k3 = size - i - 1; } pattern1.reset(); pattern2.reset(); for (j = 0; j < patternSize; j++) { pattern1.put(state.board[k1 + j][k2 + j]); pattern2.put(state.board[k1 + j][k3 - j]); } j--; do { value += pattern1.matches(); value += pattern2.matches(); j++; // 2 patterns are symmetric, so detection for 1 is enough if (k1 + j == size || k2 + j == size) break; // pattern1 -= state.board[k1 + j - patternSize][k2 + j - patternSize]; pattern1.put(state.board[k1 + j][k2 + j]); // pattern1 += state.board[k1 + j][k2 + j]; // pattern2 -= state.board[k1 + j - patternSize][k3 - j + patternSize]; pattern2.put(state.board[k1 + j][k3 - j]); // pattern2 += state.board[k1 + j][k3 - j]; } while (true); } return value; }