首页 > 解决方案 > 在某个时候保存对象变量并完全按照保存的方式重用它们?

问题描述

假设我有一个 Player 类型的对象,它具有健康、位置和颜色变量。

游戏经历了几个阶段,所有变量都在这个阶段发生变化。例如:

在第 3 阶段,我想选择完全相同的 Stage1 或 Stage2 变量副本(随机)。

我可以做到这一点的一种方法是,在每个阶段,我将这些变量分配给另一个 Player 对象,例如

stage1PlayerSaved.health = 80;
stage1PlayerSaved.position = 50.3f;
stage1PlayerSaved.color = Color.Green;

我会为 Stage2 做同样的事情,然后在 Stage3 中重用这些对象之一。但是如果我有很多变量要保存怎么办?例如,除了这 3 个之外,我还有 20、30 个以上。保存每个变量的过程很丑陋。

是否有任何其他(更简单)的方法来保存然后在某些阶段重用我需要的变量?例如,在确切的阶段保存对象的副本,然后在需要时重用其变量?

标签: c#

解决方案


要复制对象,您可以使用复制构造函数的概念,也可以使用Cloning

但是正如您在问题中提到的玩家数量可能会很高,我建议您仅存储那些将在阶段更改的信息(不包括不更改保存的信息)

你的代码看起来应该和这个有点相似,

假设你有Player课,那么你也应该有PlayerInfo课,例如

public class Player
{
public int PId;     //This will not change
public string Name; //This will not change
public int Energy;  //This may change over stanges

//you should have a method which returns PlayerInfo object
public PlayerInfo GetPlayerInfoToBeStored()
{
    return new PlayerInfo(this.Energy);
}
}

//this class will have only those information which can change
public class PlayerInfo
{
public int Energy;

public PlayerInfo(int playerEnergey)
{
    Energy = playerEnergey;
}
}

而实际使用可能是这样的,

你可以有一个 gloable Dictionary

public Dictionary<int, Dictionary<int, PlayerInfo>> StoredPlayerState = 
    new Dictionary<int, Dictionary<int, PlayerInfo>>();

以及在其中添加信息的方法。

public void SavePlayerInfo(int stageNum, List<Player> playerList)
{
    Dictionary<int, PlayerInfo> playerInfoTable = new Dictionary<int, PlayerInfo>();
    foreach(Player player in playerList)
    {
        playerInfoTable.Add( player.PId, player.GetPlayerInfoToBeStored());
        StoredPlayerState.Add(stageNum, playerInfoTable);
    }
}

以及一种使用先前设置的值设置当前播放器的方法

public void ResetPlayerWithOldValues(int stageNum, List<Player> originalPlayerList)
{
    if (StoredPlayerState.ContainsKey(stageNum))
    {
        foreach(Player originalPlayer in originalPlayerList)
        {
            if (StoredPlayerState[stageNum].ContainsKey(originalPlayer.PId))
            {
                PlayerInfo playerInfo = StoredPlayerState[stageNum][originalPlayer.PId];
                originalPlayer.Energy = playerInfo.Energy;
            }
        }
    }
}

现在使用这个流程太容易了,

public void MainMethod()
{
    List<Player> playerList = new List<Player>();
    //add players in this list

    //after stage 1
    SavePlayerInfo(1, playerList);

    //after stage 2
    SavePlayerInfo(2, playerList);

    //At stage 3 :setting current players with any of those two state's values
    ResetPlayerWithOldValues(randomStageNum, playerList);

    //and simply keep using playerList
}

推荐阅读