private resultFindMax FindMax(int level, TKind me, TKind opponent) {
        int min, score, tnb, tnw;
        TKind[][] TempBoard = new TKind[8][8];
        int[] TempCounter = new int[2];
        resultFindMax res = new resultFindMax();
        level--;
        res.nb = counter[0];
        res.nw = counter[1];
        for (int i = 0; i < 8; i++) {
            System.arraycopy(board[i], 0, TempBoard[i], 0, 8);
        }
        System.arraycopy(counter, 0, TempCounter, 0, 2);
        min = 10000;  // high value

        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 8; j++) {
                if ((board[i][j] == TKind.o) && (checkBoard(new Move(i, j), me) != 0)) {
                    if (level != 0) {
                        resultFindMax tres = FindMax(level, opponent, me);
                        tnb = tres.nb;
                        tnw = tres.nw;
                        score = tres.max;
                    } else {
                        tnb = counter[0];
                        tnw = counter[1];
                        score = counter[opponent.ordinal() - 1] - counter[me.ordinal() - 1] + strategy(me, opponent);
                    }
                    if (min > score) {
                        min = score;
                        res.nb = tnb;
                        res.nw = tnw;
                    }
                    for (int k = 0; k < 8; k++) {
                        System.arraycopy(TempBoard[k], 0, board[k], 0, 8);
                    }
                    System.arraycopy(TempCounter, 0, counter, 0, 2);
                }
            }
        }
        res.max = -min;
        return res;
    }