使用克隆进行Alpha-beta修剪在Java中不起作用
我想在我的奥赛罗游戏中模拟我的AI的下一步,但它不只是返回下一步,而是在原始棋盘上进行所有动作,而不是在克隆人上进行模拟,游戏结束使用克隆进行Alpha-beta修剪在Java中不起作用,java,algorithm,alpha-beta-pruning,Java,Algorithm,Alpha Beta Pruning,我想在我的奥赛罗游戏中模拟我的AI的下一步,但它不只是返回下一步,而是在原始棋盘上进行所有动作,而不是在克隆人上进行模拟,游戏结束 public class GameState implements Cloneable{ private Node[][] board; // Game board private int scorePlayer, scoreAI; // Player scores ( will start at 0 ) private
public class GameState implements Cloneable{
private Node[][] board; // Game board
private int scorePlayer, scoreAI; // Player scores ( will start at 0 )
private ArrayList<Node> validNodes; // List holding all nodes possible to add pieces to
/**
* Creates the game state
*/
public GameState(){
// create size x size board
this.board = new Node[Setting.BOARD_SIZE][Setting.BOARD_SIZE];
validNodes = new ArrayList<>();
scorePlayer = 0;
scoreAI = 0;
protected GameState clone() {
return new GameState(this);
}------------------------ CLONE METHOD----------------
public int search(GameState board, Player player, int alpha, int beta, int depth, ScoreEval function) {
int record = Integer.MIN_VALUE;
Node maxMove = null;
int result;
GameState subBoard = board.clone();
if (depth <= 0 || board.getValidMoves().size()==0) {
record = function.evaluate(board, player);
} else {
ArrayList<Node> possibleMoves = board.getValidMoves();
if (!possibleMoves.isEmpty()) {
for (int i =0; i<possibleMoves.size();i++) {
Node nod = possibleMoves.get(i);
subBoard = board.clone();
subBoard.setPiece(nod.x,nod.y, player.type);
if(player.type==Setting.TILE_AI){
result = -search(subBoard, aiAss1.Controller.pHum, alpha, beta, depth - 1, function);
}
else{
result = -search(subBoard, aiAss1.Controller.pAI, alpha, beta, depth - 1, function);
}
if (result > record) {
record = result;
maxMove = nod;
}
}
} else {
record = -search(subBoard, player, alpha, beta, depth - 1, function);
}
}
bestMove = maxMove;
return record;
}
公共类游戏状态实现可克隆{
专用节点[][]板;//游戏板
private int scorePlayer,scoreAI;//玩家分数(将从0开始)
private ArrayList validNodes;//包含所有可能向其中添加片段的节点的列表
/**
*创建游戏状态
*/
公共游戏状态(){
//创建尺寸为x的板
this.board=新节点[Setting.board_SIZE][Setting.board_SIZE];
validNodes=新的ArrayList();
记分员=0;
得分ai=0;
受保护的游戏状态克隆(){
返回新的游戏状态(此);
}------------------------克隆法----------------
公共整数搜索(游戏状态板、玩家、整数alpha、整数beta、整数深度、计分功能){
int记录=Integer.MIN\u值;
节点maxMove=null;
int结果;
游戏状态子板=board.clone();
如果(depth尝试将您的逻辑分解为多个部分,将每个部分放在一个单独的方法中。然后为每个部分编写一个单元测试,并检查每个部分是否符合您的要求
这是您编写软件的方式。您确定要复制电路板的内部状态吗?(所有可变对象)您的克隆()
方法看起来失败了。你很可能正在创建一个浅拷贝。为GameState
@Kayaman添加你的clone
实现可能是正确的。但是你真的需要克隆整个棋盘吗?反向移动不是会更有效吗?尝试了----protectedgamestate clone()抛出CloneNotSupportedException{GameState=(GameState)super.clone();return state;}但是dint work eit我只是分享一些与我的问题相关的代码,问题似乎是克隆只返回一个浅拷贝,克隆的语义不清楚,最好避免。如果你想要一个深度克隆,请编写一个deepClone()方法。