Как мне скопировать объекты в java, не имея ссылок на исходный объект? - PullRequest
0 голосов
/ 18 января 2020

Привет, ребята, поэтому я в основном в следующей задаче:

У меня есть минимальный алгоритм для моей шахматной игры (расчет функциональности движения ИИ).

Теперь мне нужен способ отправить текущее состояние игры без изменения состояния при расчете ходов ИИ. (Каким-то образом ссылки все еще находятся в скопированном объекте из исходного.)

По сути, свойство 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();
}
...