Привет, ребята, поэтому я в основном в следующей задаче:
У меня есть минимальный алгоритм для моей шахматной игры (расчет функциональности движения ИИ).
Теперь мне нужен способ отправить текущее состояние игры без изменения состояния при расчете ходов ИИ. (Каким-то образом ссылки все еще находятся в скопированном объекте из исходного.)
По сути, свойство board имеет два вызываемых списка, свойства в arrayList будут каким-то образом изменяться из скопированного объекта, а также измените исходный объект:
public class Board {
private ArrayList<Piece> whitePieces;
private ArrayList<Piece> blackPieces;
}
Итак, что я пробовал до сих пор:
Создайте копию игрового объекта, используя интерфейс Clonable в JAVA. затем создайте вторую переменную и сохраните текущий объект игрового класса в этот объект и отправьте его в ИИ.
Создайте новый класс (GameState) с необходимыми свойствами, необходимыми для расчета ИИ, сохраните текущий игровые свойства в этом и отправить его в AI.
Проблема в том, что всякий раз, когда я создаю второй объект, ссылки на переменные внутри переменной Board Board (список черно-белых фигур) являются ссылками на оригинальный объект.
Это в основном означает, что всякий раз, когда я отправляю игровое состояние в минимаксный алгоритм. минимакс пытается / устанавливает ходы, но при выполнении этих ходов он будет влиять на исходный объект, а также на созданную «копию» объекта
Попытка 1:
public class GameState
{
private Player whitePlayer;
private Player currentTurn;
private Player blackPlayer;
private Board board;
private GameStatus gameStatus;
}
public void computerMove() {
var tempGameState = new GameState(whitePlayer, currentTurn, blackPlayer, board, gameStatus);
var bestMove = moveStrategy.execute(tempGameState, 2);
var piece = bestMove.getSelectedPiece()
piece.setPosition(bestMove.getDesPos());
}
попытка 2:
public void computerMove() throws CloneNotSupportedException {
var cloneGame = clone();
var bestMove = moveStrategy.execute(cloneGame, 3);
var piece = bestMove.getSelectedPiece();
piece.setPosition(bestMove.getDesPos());
}
@Override
public ChessGame clone() throws CloneNotSupportedException {
return (ChessGame)super.clone();
}