我有一個GameState
對象。它包含諸如玩家,玩家手中和牌中的牌,玩家資源的狀態和位置等等。幾乎所有東西都至少與另一件事有關 - 卡片知道他們在哪手牌,資源知道他們屬於哪個球員,等等。如何正確複製一組對象而無需參考原件或複製多次引用的對象?
我想創建一個系統告訴玩家兩個GameState
s之間的區別。它會比較各州並回來「如果你做了這個動作,這些事情就會改變」。最簡單的做法似乎是複製GameState
並將動作應用於副本,然後將副本與原始副本進行比較。
我已經環顧了一些淺層和深層複製的實現,但我可以快速預見一個對象屬於兩個不同對象的問題。一個例子是一些玩家令牌;玩家有一個所有令牌的列表(例如,玩家可以盤點他們所在的位置),而令牌所在的空間上有所有令牌的列表(例如,如果空間受到影響所有令牌的東西的影響)。如果我進行深層複製,則玩家和空間將指同一令牌的兩個不同副本;如果我做一個淺拷貝,那麼所有的東西都會指向原始的GameState
中存在的對象。我不能選擇一邊總是淺的,另一邊總是很深,因爲也許令牌將被從板上移開並且沒有空間,或者令牌將與玩家分離並且隨後被另一個拾起。在使用時甚至可能會有卡片針對玩家,所以如果它瞄準用戶,那將是一個循環引用。
基本上,我想做這三個圖中的第一個,但我無法弄清楚如何避免第二和第三種情況。
我懷疑有沒有簡單的方法一般要做到這一點,但我想我還不如問。
我在Unity3D中使用C#,萬一這很重要。
好像你必須自己定義克隆邏輯。另一個想法是創建兩個方法來讀取和寫入一個GameState對象到一個Stream。然後你可以編寫如下代碼:MemoryStream ms = ...;寫入(GateState,ms); GameState clone = Read(ms);如果你打算將GameState保存到磁盤,這些也會有用。 – Loathing