【发布时间】:2017-02-23 04:04:57
【问题描述】:
我的主类中有一个我的 Game.java 类的对象游戏。我需要创建一个游戏对象的副本(game_copy),这样当我对 game_copy 板进行更改时,游戏板不会被更改。我将这个 game_copy 对象设为:
Game game_copy = new Game() ;
game_copy = game.clone() ;
但是,当我对 game_copy 的棋盘进行更改时,棋盘也会发生变化,因为它们仍然共享一个参考。我该如何解决这个问题? 这是我正在使用的 Game 和 rplayer 类:
class Game implements Cloneable{
int n;
ArrayList<ArrayList<String>> board;
rplayer [] players;
int a ;
public Game(int n){
this.n=n;
players = new rplayer[2] ;
players[0]=new rplayer(this.a);
players[1]=new rplayer(this.a);
board= new ArrayList<ArrayList<String>>();
for(int p= 0 ; p < n*n ; p++){
ArrayList<String> r = new ArrayList<String>() ;
board.add(r) ;
}
}
public Game clone(){
Game gm ;
try {
gm = (Game) super.clone();
}
catch (CloneNotSupportedException e) {
System.out.println (" Cloning not allowed. " );
return null;
}
return gm
}
}
class rplayer{
int a;
public rplayer(int a){
this.a=a;
}
}
这是我在尝试使用 .clone() 方法之前尝试过的,但是创建复制构造函数的想法也不起作用。这两个对象总是相关的。
public Game(Game g){
this.n=g.n;
this.players = new rplayer[2] ;
rplayer[] temp_players = new rplayer[2] ;
temp_players = g.players;
this.players = temp_players ;
this.board= new ArrayList<ArrayList<String>>();
ArrayList<ArrayList<String>> temp_board = new ArrayList<ArrayList<String>>() ;
for(int p= 0 ; p < n*n ; p++){
ArrayList<String> r = new ArrayList<String>() ;
board.add(r) ;
temp_board.add(r) ;
}
temp_board = g.board ;
board= temp_board;
}
【问题讨论】:
-
有深拷贝和浅拷贝的概念。您似乎想要进行深层复制并创建一个新对象。我建议您编写自定义代码来创建一个新游戏对象并遍历旧游戏对象并将您想要持久保存到新游戏对象中的所有状态变量一一复制。是的,这需要更多的工作和代码,但这是获得您想要的东西的最佳方式。
-
@mba12 我已经添加了我在登陆克隆方法之前使用的复制构造函数。那也没用。
-
为什么你需要克隆一个
Game? -
我正在为游戏制作人工智能。所以我必须在板上使用极小极大搜索。为了实现这一点,我需要一个重复的游戏板,这样我现在的状态板就不会改变。