Here is the link to my whole Chequers Java code.
我正在用MiniMax算法编写一个跳棋游戏作为AI。一切正常,因为我手动移动棋子(玩家与玩家),但每当我调用MiniMax方法时,我都会遇到空指针错误。
这是因为当我调用'MultiJump'时,它会尝试移动一个不再存在的Checker。代码尝试从[2] [2]移动Checker,在创建子节点时,Checker已经递归移动。我找不到它在哪里或为什么这样做 - 因为我在调试过程中进行了正确的多跳运动,但是当它在正确的位置退出时,抛出了这个空指针错误。
如果有人可以查看我的代码并让我知道他们是否可以找到算法试图移动它已经移动的东西,那将是很棒的。
如果有任何我可以提供的帮助,或者我能回答的任何问题可以帮助我,请随时告诉我们。)
下面我将复制&粘贴MiniMax方法& MultiJump方法。再次,请查看我的整个代码的帖子顶部。
我的MiniMax控制方法是:
public double miniMax(String side, int depth, PlaySpace board)
{
this.board = board;
this.side = side;
this.depth = depth;
double a = 0;
if(depth==0){
a = evaluateState(board);
return a;
}
if (side.equals("A")){
a = Double.MIN_VALUE;
for(ChequersMove move : board.getLegalMoves(side)){
PlaySpace child = new PlaySpace(board.returnState());
child.setState(board.returnState());
for(int x=0;x<move.multiJumpCount(board,move,side,0);x++){
child.moveChequer(move.multiJump(board,move,side,0)[x].returnCurrentX(),move.multiJump(board,move,side,0)[x].returnCurrentY(),move.multiJump(board,move,side,0)[x].returnDestX(),move.multiJump(board,move,side,0)[x].returnDestY());
}
Tree tree = new Tree();
double eval = tree.miniMax("B",depth-1,child);
if(eval > a){
System.out.println(eval);
a = eval;
}
}
return a;
}
if(side.equals("B")){
a = Double.MAX_VALUE;
for(ChequersMove move : board.getLegalMoves(side)){ through all of the possible resulting moves
PlaySpace child = new PlaySpace(board.returnState());
child.setState(board.returnState());
for(int x=0;x<move.multiJumpCount(board,move,side,0);x++){
child.moveChequer(move.multiJump(board,move,side,0)[x].returnCurrentX(),move.multiJump(board,move,side,0)[x].returnCurrentY(),move.multiJump(board,move,side,0)[x].returnDestX(),move.multiJump(board,move,side,0)[x].returnDestY());
}
Tree tree = new Tree();
double eval = tree.miniMax("A",depth-1,child);
if(eval > a){
a = eval;
}
}
return a;
}
return a;
}
我的MultiJump方法是:
ChequersMove[] multiJump(PlaySpace board, ChequersMove move, String side, int jumpCount)
{
jumpPath.addElement(move);
if(move.isJump()==true){
PlaySpace child = new PlaySpace(board.returnState());
child.setState(board.returnState());
child.moveChequer(move.returnCurrentX(),move.returnCurrentY(),move.returnDestX(),move.returnDestY());
jumpCount++;
if(child.getLegalMoves(side)!=null){
for(ChequersMove path : child.getLegalMoves(side)){
if(path.returnCurrentX() == move.returnDestX() && path.returnCurrentY() == move.returnDestY() && path.isJump() == true){
multiJump(child,path,side,jumpCount);
}
}
}
}
multiJump = new ChequersMove[jumpPath.size()];
System.out.println("MultiJump length = " + multiJump.length);
for(int i = 0; i < jumpPath.size(); i++){
System.out.println(i);
multiJump[i] = (ChequersMove)jumpPath.elementAt(i);
}
return multiJump;
}
提前致谢!