注意:我有点像C#的初学者。
我正在开发一款有很多不同级别的小游戏。每个级别都有自己的类,其中包含变量(以及其他不相关的代码)。因为我需要将这些值传递给主类(我的表单),所以我将它们全部转换为返回我想要的值的方法(因为我无法提出更好的解决方案)。例如:
class Level01
{
public int Boxes() { return 3; }
public int MaxPoints() { return 46; }
public int Health() { return 63; }
public int[,] SolidBoxes()
{
int[,] position = new int[Boxes(), Boxes()];
position[1, 1] = 1;
return position;
}
}
当我从表单类中访问这些值时,我会这样做
int boxes;
int maxPoints;
int health;
int[,] solidBoxes;
void readLevelData() //Starts each new level
{
//Reads the correct level
switch (levelNo)
{
case 1:
setValues(Lvl01.Boxes(), Lvl01.MaxPoints(), Lvl01.Health(), Lvl01.SolidBoxes());
break;
//The same case 2:, 3: for Level02,03..
}
}
void setValues(int getBoxes, int getMaxPoints, int getHealth, int[,] getSolidBoxes)
{
boxes = getBoxes;
maxPoints = getMaxPoints;
health = getHealth;
solidBoxes = getSolidBoxes;
}
我知道我的代码中可能有一百万件事可以做得更好,如果你有任何建议我很乐意听,但我想问的是:
如何使用一个名称获取每个类的所有值?防爆。而不是像现在这样做,有没有办法让我可以做类似的事情:
case 1:
setValues(Lvl01.Values);
break;
这里的问题是在setValues方法中,有些级别有很多我希望使用的设置,但是我怀疑这个方法是否需要采用15个参数,我不知道该怎么做当某些级别没有使用其他级别使用的设置时。
我应该如何更改代码,以便不必将每个值都用作参数?
答案 0 :(得分:3)
您可以使用Dictionary<int, Level>
查找代表每个级别的对象。而不是开关/案例,你会做类似
Level level = myLevelDictionary[currentLevel];
这要求您将类更改为每个级别一个类,以及代表任何级别的一个类,例如:
class Level
{
public int Boxes { get; set; }
public int MaxPoints { get; set; }
public int Health { get; set; }
public int[,] SolidBoxes()
{
int[,] position = new int[boardSize, boardSize];
position[1, 1] = 1;
return position;
}
}
然后你会填写你的字典
Dictionary<int, Level> myLevelDictionary = new Dictionary<int, Level>()
{
{ 1, new Level() { Boxes = 3, MaxPoints = 46, Health = 63 } },
// etc.
};
更新
关于抽象类的说明
您在评论中提到抽象类。如果所有级别都有一些共同的行为,它们就很有用,但有些行为也有专门的行为。它们通常会在游戏中用于可以在游戏中移动的东西,例如
之类的东西abstract class Character
{
// Something everyone has
public int HitPoints { get; set; }
// Something everyone does, but does differently
public abstract void Attack(Character target);
}
public class Fighter : Character
{
public int SwordDamage { get; set; }
public void Attack(Character target)
{
target.Damage(this.SwordDamage - target.PhysicalDamageResistance);
}
}
public class Mage : Character
{
public int MagicFireDamage { get; set; }
public int MagicColdDamage { get; set; }
public void Attack(Character target)
{
if (UseFireDamage()) // e.g. roll random chance that the mage uses a fire spell
{
target.Damage(this.SwordDamage - target.FireDamageResistance);
}
else
{
target.Damage(this.SwordDamage - target.ColdDamageResistance);
}
}
}
答案 1 :(得分:1)
一种方式可能是使用字典。
class Level01
{
Dictionary<string,int> values;
public level01()
{
values.Add("Boxes",3);
values.Add("MaxPoints",3);
values.Add("Health",3);
}
//indexer
public int this[string s] {get{return values[s];} set {values[s] = value;}}
}
并使用如:
Level01 lv = new Level01();
somemethod(lv["Boxes"]); //passes 3 to some method
虽然你真的想要使用Dictionary<string,object>
并添加一些类型检查和其他东西以使其顺利运行但希望你可以开始使用