Я думаю, вы могли бы попробовать что-то вроде этого (я не проверял код Java):
private Node Extreme(State node, int depth, double a, double b, Player player, boolean which) {
if(node.searchLimitReached() || node.over || depth <= 0)
return new Node(node, heuristic(node, player));
double value = which ? Double.NEGATIVE_INFINITY : Double.POSITIVE_INFINITY;
Node nextNode = new Node();
Node bestNode = new Node();
Iterator<State> iterator = node.next().iterator();
while(!node.searchLimitReached() && iterator.hasNext()) {
nextNode = Extreme(iterator.next(), depth-1, a, b, player, !which);
if(which && nextNode.value > value || !which && nextNode.value < value) {
value = nextNode.value;
bestNode = nextNode;
}
if(which && value >= b || !which && value <= a)
return bestNode;
if (which) a = Math.max(a, value);
else b = Math.min(b, value);
}
return bestNode;
}
Обратите внимание на переменную which
; если это true
, минимум возвращается, а максимум - иначе.
Однако я бы посоветовал вам никогда не звонить Extreme
напрямую (так как это было бы неестественно), а скорее переопределять данные данные. функционирует следующим образом:
private Node Min(State node, int depth, double max, double beta, Player player) {
return Extreme(node, depth, max, beta, player, true);
}
private Node Max(State node, int depth, double alpha, double min, Player player) {
return Extreme(node, depth, alpha, min, player, false);
}
и вызывает их.