c# - 在某个时候保存对象变量并完全按照保存的方式重用它们?
问题描述
假设我有一个 Player 类型的对象,它具有健康、位置和颜色变量。
游戏经历了几个阶段,所有变量都在这个阶段发生变化。例如:
Stage1 玩家有 80 生命值,50.3f 位置和绿色。
Stage2 玩家有 50 生命值、90f 位置和蓝色。
在第 3 阶段,我想选择完全相同的 Stage1 或 Stage2 变量副本(随机)。
我可以做到这一点的一种方法是,在每个阶段,我将这些变量分配给另一个 Player 对象,例如
stage1PlayerSaved.health = 80;
stage1PlayerSaved.position = 50.3f;
stage1PlayerSaved.color = Color.Green;
我会为 Stage2 做同样的事情,然后在 Stage3 中重用这些对象之一。但是如果我有很多变量要保存怎么办?例如,除了这 3 个之外,我还有 20、30 个以上。保存每个变量的过程很丑陋。
是否有任何其他(更简单)的方法来保存然后在某些阶段重用我需要的变量?例如,在确切的阶段保存对象的副本,然后在需要时重用其变量?
解决方案
要复制对象,您可以使用复制构造函数的概念,也可以使用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
}
推荐阅读
- node.js - 在回调函数中更改全局变量值
- css - 在 TYPO3 中使用自己的自定义 css
- android - 如果 Oreo 上的屏幕关闭,我的 WebView 不会呈现 HTML 页面
- python - Pytorch 张量 - 如何通过特定张量获取索引
- node.js - 在 NodeJS 中启用 CORS
- php - 网络服务图片公共网址
- javascript - 保存到引擎 camunda(7.9 版)变量类型“日期”
- node.js - 回调函数 - Auth0 和 Passport.js
- typo3 - TYPO3 - tx_news - 在详细信息页面上显示除当前文章之外的相关文章
- python - pip 安装包在 conda 环境中不可见