C# 我怎样才能正确地复制一组对象而不引用原件或多次复制引用的对象?

C# 我怎样才能正确地复制一组对象而不引用原件或多次复制引用的对象?,c#,unity3d,deep-copy,shallow-copy,C#,Unity3d,Deep Copy,Shallow Copy,我有一个游戏状态对象。它包含诸如玩家、玩家的手和手中的牌、玩家资源的状态和位置等内容。几乎所有的东西都与至少一件事有关——牌知道他们在哪一手,资源知道他们属于哪一个玩家,等等 我想创建一个系统,告诉玩家两种游戏状态之间的区别。它会比较各个州,如果你做了这个动作,这些事情就会改变。最简单的方法似乎是复制游戏状态并将动作应用到副本上,然后将副本与原始副本进行比较 我已经研究了一些浅层和深层复制的实现,但是我可以很快看到一个对象属于两个不同对象的问题。一个例子是一些玩家代币;玩家有一个所有令牌的列表,

我有一个游戏状态对象。它包含诸如玩家、玩家的手和手中的牌、玩家资源的状态和位置等内容。几乎所有的东西都与至少一件事有关——牌知道他们在哪一手,资源知道他们属于哪一个玩家,等等

我想创建一个系统,告诉玩家两种游戏状态之间的区别。它会比较各个州,如果你做了这个动作,这些事情就会改变。最简单的方法似乎是复制游戏状态并将动作应用到副本上,然后将副本与原始副本进行比较

我已经研究了一些浅层和深层复制的实现,但是我可以很快看到一个对象属于两个不同对象的问题。一个例子是一些玩家代币;玩家有一个所有令牌的列表,例如玩家可以评估它们的位置,并且令牌所在的空间有一个所有令牌的列表,例如,如果空间受到某个事物的影响,它可以影响其上的所有令牌。如果我做了一个深度复制,那么玩家和空间将引用同一令牌的两个不同副本;如果我做一个浅层复制,那么所有的东西都会引用原始游戏状态中存在的对象。我不能选择一边总是浅的,另一边总是深的,因为可能令牌将从棋盘上移除,并且没有空间,或者令牌将与玩家分离,然后由另一个玩家拾取。甚至可能有一些牌在使用时以玩家为目标,所以如果它是以用户为目标的,那将是一个循环引用

基本上,我想做这三个图中的第一个,但我不知道如何避免第二个和第三个情况

我想总的来说没有简单的方法可以做到这一点,但我想我还是问问吧


我在Unity3D中使用C,以防万一这很重要。

作为克隆的捷径,您可能会从序列化中获得一些好处。我经常使用JSON.NET NewtonSoft来执行类似的操作,只要对象不太复杂,通常可以先进行基本的序列化,然后进行反序列化过程。顺便说一下,JSON.NET可以很好地处理循环引用等


我认为你更大的挑战是向用户展示将要发生什么的信息。

几个月前,我为奥赛罗国际象棋游戏编写了一个简单的AI。我需要将每一步的不同游戏状态传递给我的评估函数。我所做的只是克隆计算所需的基本数据,并将克隆的数据传递给其他函数。在函数中,我做的事情或多或少与您建议的相同,即模拟每个状态下每个移动的结果


我认为自己定义克隆策略是不可避免的。但是,您只能从原始GameState实例中提取有用的数据。玩家的名字当然不重要,对吧?

看起来你必须自己定义克隆逻辑。另一种想法是创建两种方法,将游戏状态对象读写到流中。然后您可以编写如下代码:MemoryStream ms=。。。;李家庄,ms ;;配子状态克隆=Readms;如果你打算将游戏状态保存到磁盘上,这些也会很有用。