我有一个跳棋游戏的基类,我想对其进行子类化以实现不同的树搜索算法、minmax、alphabeta 等。
所以我有类似的东西
public class Checkers {
....
public void findBestMove(Board b, int depth) {
for(mv:b.possibleMoves()) {
...
score = evalNode(b.domove(mv), depth + 1)
...
}
}
int evalNode(Board b, depth) {<insert recursive node eval algorithm here>}
}
适用于 minmax。 对于 alphabeta,我需要更多参数:
public void findBestMove(Board b, int depth) {
for(mv:b.possibleMoves()) {
...
score = evalNode(b.domove(mv), depth + 1, -9999999, -maxval)
maxval = max(score, maxval)
...
}
}
int evalNode(Board b, depth, alpha, beta) {<insert recursive node eval algorithm here>}
虽然 findBestMove 的基本逻辑对于所有树搜索方法都是相同的(生成所有可能的移动,尝试每个移动并将其传递给 eval 函数,返回最佳移动......),唯一的区别是调用到评估函数,这需要特定于算法的参数。
你能想出任何方法来构造 findBestMove 方法,以便我可以在所有子类中使用它的基本逻辑(移动循环),但有不同的 evalNode 调用吗?在每个子类中重写这个似乎是一种浪费。是我缺乏想象力还是这根本不可能?
最佳答案
一种方法是引入一个接口(interface):
interface NodeEvaluator {
int evalNode(Board b, depth);
}
并给它两个实现,其中第二个实现将接受额外的参数:
class MinMaxNodeEvaluator implements NodeEvaluator {
public int evalNode(Board b, depth) {
// evaluate node using min/max appproach
}
}
class AlphaBetaNodeEvaluator implements NodeEvaluator {
private int maxVal;
public AlphaBetaNodeEvaluator()
{
this.maxVal = Integer.MAX_VALUE;
}
public int evalNode(Board b, depth) {
int currentScore = evalNode(b, depth, Integer.MIN_VALUE, -this.maxval);
this.maxVal = max(currentScore , this.maxVal);
return currentScore;
}
private int evalNode(Board b, int depth, int alpha, int beta) {
//...
}
}
并且特定节点评估器的实例应该适本地注入(inject)到您的 Checkers
类中。
关于java - 具有不同参数列表的继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20582788/