这听起来像是一个非常愚蠢的问题,但我的游戏中有一个简单的数据结构:
public class MG_GameData
{
public List<SceneObject> SceneList = new List<SceneObject>();
public RPG_Data rpg_Data = new RPG_Data ();
}
public class SceneObject
{
public string SceneName;
public List<VarObject> VarList = new List<VarObject> ();
public List<O_Object> O_ObjectList = new List<O_Object>();
}
public class VarObject
{
public enum VarType { Bool, String, Number }
public VarType varType;
public string VarName;
public object VarValue;
}
public class O_Object
{
public string O_Object_gameObjectName;
public Vector3 storedPosition;
public Vector3 storedRotation;
public int interpreterCurIndex;
public O_Lists.O_Lists_Base o_Lists_Base;
public O_Base.Control control;
}
当我创建对象时,我使用MG_GameData mg_GameData = new MG_GameData();
现在,在我的程序中,我可以这样访问它:
MG_Data.mg_GameData.SceneList[curSceneIndex].VarList[curVarValueIndex].VarValue = 5; //for example.
这可能听起来很无趣,但我不知道如何在我的方法中创建对VarList的正确引用,所以我的方法开始看起来完全混乱。
VarList varList = MG_Data.mg_GameData.SceneList[curSceneIndex.VarList; ??
但是当我使用varList更改数据时,它会更改MG_Data.mg_GameData.SceneList[curSceneIndex.VarList
中的数据吗?
答案 0 :(得分:2)
您还没有解释您的代码应该做什么,而且名称相当含糊。这些都是问题,但您的代码中已经有几张黄牌:
MG_GameData mg_GameData = new MG_GameData();
什么是“MG_GameData”应该是什么意思?您将它用于类和实例名称,因此它不能用于描述。 “MG”应该是缩写吗?您应该使用名称空间。
我将其创建为静态对象
你为什么这样做?这将使你的班级测试变得非常困难。除非绝对必须,否则不应该使用静态实例。
public class VarObject
{
public enum VarType { Bool, String, Number }
public VarType varType;
public string VarName;
public object VarValue;
}
哦,这看起来像Inner-Platform反模式,你尝试复制内部语言功能,如继承和重载内部类,而不是使用语言来完成它们。什么是VarObject
?它做了什么?您应该实现仅包含并执行所需操作的类。
您的所有类都受到Primitive Obsession反模式的影响,您可以在其中创建一个原始类型的包,如字符串和整数,并期望您的类的使用者执行所有低级别的摆弄以表示状态更改和行为。这条道路上只有疯狂。您应该创建类来描述模型和行为,而不是将原始类型公开给您的每个类消费者。
MG_Data.mg_GameData.SceneList[curSceneIndex].VarList[curVarValueIndex].VarValue = 5; //for example
这违反了Law of Demeter,它基本上说你班级的消费者不知道如何实现类属性。 mg_GameData
的消费者不仅必须知道SceneList
被实现为List<VarObject>
,而且消费者必须对每个类的每个属性进行所有创建,更新和管理。您的任何类都不会强制执行任何约束或实现任何行为;他们都没用了!
@Jinal是对的;您需要将数据抽象为实现游戏行为的类,并仅通过类方法更改状态。您的代码看起来应该更像这样:
var playerWorld = new GameWorld( new Scene[]
{ new SceneMountain(), new SceneMountain(), ...
new SceneMountain(), new SceneGrassland(new Monster("Grue", CR: 1, HP:15, AC: 5, THAC0:10, Damage: new DamagerInnate(dice:1))), ...
...
});
var player = new Hero("Hiro", CR: 1, HP: 6, AC:2, THAC0: 9,
Damage: new DamagerWeapon("longsword", dice: 2, SpecialRules: Rule.Edged | Rule.ColdSteel));
playerWorld.Place(player, new Location(4, 5));
foreach (var monster in playerWorld.Monsters)
monster.MoveToward(player.Location);