private float evaluate(Board board) { BoardValue bvalue = new BoardValue(); for (Location dir : DIRECTIONS) { for (int i = 0; i < board.getSize(); i++) { RowValue rowval = new RowValue(); for (int r = (dir.getCol() == 0) ? i : 0, col = (dir.getRow() == 0) ? i : 0; r < board.getSize() && col < board.getSize(); r += dir.getCol(), col += dir.getRow()) { int row = (dir.getCol() == -1) ? board.getSize() + r - 1 : r; rowval.add(board.brickAt(row, col)); } if (rowval != null && rowval.length() == board.getSize()) bvalue.addRowValue(rowval); if (dir.getRow() != 0 && dir.getCol() != 0) break; } } return bvalue.getValue(me); } // BoardValue public float getValue(Brick player) { float value = 0; for (RowValue rowval : rows) { value += rowval.value(player); } return value; } //RowValue public float value(Brick player) { if ((noughts > 0 && crosses > 0) || length == empty) return 0; int players = (player == Brick.CROSS ? crosses : noughts); if (players == length) return Float.POSITIVE_INFINITY; if (players + empty == length) return players / (float) empty; if (players == 0 && empty == 0) return Float.NEGATIVE_INFINITY; return - (length - empty) / empty; }