我正在努力生成游戏树。
我输入的问题是,当我将一个对象复制到新对象,然后在新对象中进行更改时,旧对象也会更改其值。
所以这似乎是一个参考问题。
但如何使新对象成为一个独立的实例。
创建从父对象复制的子对象后,然后更改子对象中的值,父对象也会更改,并且在方法结束时它将打印对象相等。
private void generateSubTree(State parent, int depth) {
if (depth == 0) {
System.out.println("End of leaf..!");
return;
}
ArrayList<State> listOfStates = GameEngine.legalMoves(parent);
for (State s: listOfStates) {
Board tempBoard = new Board(parent.getBoard().getBoard());
BoardPiece pieceRef = new BoardPiece();
State child = new State(parent);
if(parent.getTurn() == 0) {
pieceRef = GameEngine.checkForPiece(child.getPlayer1(), s.getMove().getFromX(), s.getMove().getFromY());
pieceRef.updatePosition(s.getMove().getToX(), s.getMove().getToY());
tempBoard.updateBoard(child.getPlayer1(), s.getMove(), false);
} else {
pieceRef = GameEngine.checkForPiece(child.getPlayer2(), s.getMove().getFromX(), s.getMove().getFromY());
pieceRef.updatePosition(s.getMove().getToX(), s.getMove().getToY());
tempBoard.updateBoard(child.getPlayer2(), s.getMove(), false);
}
child.setBoard(tempBoard);
parent.addChild(child);
System.out.println("Is parent equal to child: " + child.equals(parent));
i++;
System.out.println("States generated: " + i);
generateSubTree(child,depth-1);
}
}
public class State{
private Board board;
private int turn;
private Move move;
private ArrayList<Move> legalMoves;
private int depth;
private int utilityVal;
private Player player1;
private Player player2;
private State parent;
private ArrayList<State> children;
public State() {
children = new ArrayList<>();
}
// Copy constructor
public State(State state) {
this.parent = state.parent;
this.depth = state.depth;
this.board = state.board;
this.children = state.children;
this.turn = 1 - state.turn;
this.player1 = state.player1;
this.player2 = state.player2;
// shallow copy
// this.subjects = student.subjects;
// deep copy - create new instance of HashSet
// this.subjects = new HashSet<>(state.subjects);
}
预期的结果是我可以更改对象 Child 而不更改 Parent
但如何使新对象成为一个独立的实例。
去除static
关键字使对象内部的字段独立于其他对象。
如果字段/变量是static
它与该类的所有实例共享其值。如果更改其中之一,则会更改所有实例的值。
我认为主要问题是你的复制State
对象。您实际上并没有复制任何内容,只是将引用传递给另一个实例。
你需要一个deepCopy
方法还复制本身必须复制自身的所有字段的实例。
必须在属于新对象的所有字段中进行深度复制。这里你必须复制Board
, the Player
, the Move
等等。对于原始数据类型,您的副本确实可以按原样工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)