我正在Java中实现strategy AI。人工智能需要做的一件事是,观察未来可能的行动。为此,它应该能够获得当前棋盘位置的副本,在那里移动棋子(当然,不影响主板),并通过查看多个移动来选择最佳移动(使用MiniMax算法)。
然而,我有麻烦的复制板部分。我的棋盘被存储为一个二维的strategopipieces数组:
StrategoPiece board[][];
现在,战略中的一些棋子有特殊的规则。我已经为间谍,侦察兵,矿工,旗帜和炸弹创建了特殊的类,它们都继承自StrategoPiece类。
因此,棋盘包含'null'表示空方块,如果它被占用,则包含一个作为StrategoPiece子类的对象。
我想在这块黑板上抄一份,但我不知道如何抄一份合适的深拷贝。在StackOverflow和互联网上的其他地方阅读,我发现了以下信息:
- 要对(非原始)数组(在一个或多个维度)进行深度复制,需要逐一复制所有对象。
- Object.clone()不像大多数人想要的那样工作,并且正确实现它是困难的。
- 建议创建一个'Factory'或Constructor Copy方法。
我想知道的是,然而,我是如何创建这样一个工厂或构造函数复制方法,当我有多个类的对象数组(都继承自相同的基类,但有些有附加的额外逻辑)。
深度复制复杂对象是你不想自己实现的,因为它很难正确地完成,并且有很好的框架可以为你解决这个问题。
例如,你可以查看Dozer或Kryo。