所以我对编程很新。我目前正在开发一个地形生成程序,除此之外一切都很顺利:
public static class Desert
{
public const int iChance = 15;
public static int chance = iChance;
public static int chancepoint = 0;
public const int octaves = 4;
public const int lengthMin = 60;
public const int lengthMax = 90;
public const float scaleMin = 250;
public const float scaleMax = 350;
public const float persistenceMin = 0.5f;
public const float persistenceMax = 0.9f;
public const pType ptype = pType.Lowland;
public const bTag[] tags = { bTag.desert };
}
public static class Meadow
{
public const int iChance = 45;
public static int chance = iChance;
public static int chancepoint = 0;
public const int octaves = 4;
public const int lengthMin = 45;
public const int lengthMax = 70;
public const float scaleMin = 200;
public const float scaleMax = 470;
public const float persistenceMin = 0.35f;
public const float persistenceMax = 0.70f;
public const pType ptype = pType.noAbs;
public const bTag[] tags = { bTag.lush };
}
这些是每种不同类型的'Biome'的属性。
我目前有大约7个,除了每个字段的值外,它们都完全相同。
有没有办法缩短代码?我研究了继承,但最终出现了错误,我有点困惑。 ><
如果我不得不写的话会很棒:
public static class Desert
{
iChance = 15;
chance = iChance;
chancepoint = 0;
octaves = 4;
lengthMin = 60;
lengthMax = 90;
scaleMin = 250;
scaleMax = 350;
persistenceMin = 0.5f;
persistenceMax = 0.9f;
ptype = pType.Lowland;
strongTags = { bTag.desert };
}
提前致谢。
哦,对于这个问题的小问题感到抱歉,如果你看到程序的其余部分,你可能会尖叫我的代码有多糟糕。 XD
编辑:可能明智地告诉你,除了“机会”的价值之外,我再也不会改变课堂内的东西。
答案 0 :(得分:3)
您可以使用非静态类,而不是使用静态类。
public class Biome {
// Instance fields with default values
public int iChance = 15;
public int chance = iChance;
public int chancepoint = 0;
public int octaves = 4;
public int lengthMin = 60;
public int lengthMax = 90;
public float scaleMin = 250;
public float scaleMax = 350;
public float persistenceMin = 0.5f;
public float persistenceMax = 0.9f;
public pType ptype = pType.Lowland;
public bTag[] tags = { bTag.desert };
}
这里使用构造函数进行初始化:
public Biome(int iChance, int chance, int chancepoint, int octaves, public int lengthMin, int lengthMax, float scaleMin, float scaleMax, float persistenceMin, float persistenceMax,pType ptype, bTag[] tags) {
// init fields here
}
然后调用构造函数:
Biome bimoe = new Biome(15, iChance, 0, 4, 60, 90, 250, 350, 0.5f, 0.9f, pType.Lowland, { bTag.desert });
有了这个,很难看出哪个参数属于哪个字段,但它要短得多。
如果字段必须是只读的,则可以仅使用公开get
和set
访问者来创建属性。例如:
public Chance { get { return chance; } }
在这种情况下,将字段设为私有:
private int chance = iChance;
(就个人而言,对于这种情况,我会将所有数据都放在一个文件中)
答案 1 :(得分:1)
以下内容会更短:
public const int iChance = 15, octaves = 4, lengthMin = 60, lengthMax = 90;
public const float scaleMin = 250, scaleMax = 350, persistenceMin = 0.5f,
persistenceMax = 0.9f;
public static int chance = iChance, chancepoint = 0;
但是......这些看起来不像static
字段,或者甚至可能不是const
。它们看起来应该是实例属性的东西。也许是这样的:
public class Terrain {
public int Chance {get;private set;}
public int LengthMin {get;private set;}
// ...
private Terrain(int chance, int lengthMin, ...) {
Chance = chance;
LengthMin = lengthMin;
// ...
}
private static readonly Terrain
desert = new Terrain(45, 45, ...),
meadow = new Terrain(15, 60, ...),
...;
public static Terrain Desert { get { return desert;}}
public static Terrain Meadow { get { return meadow;}}
}
答案 2 :(得分:1)
我对地形生成程序知之甚少,但您应该将数据存储在数据库中。 然后创建类以将该数据映射到您的应用程序。 我建议你查找“数据结构”,看哪一个最适合你的应用程序。
答案 3 :(得分:0)
最好只使用一个没有继承,甚至结构的类。 Desert,Meadow等逻辑上不是类,它必须是对象(可能是常量)。
答案 4 :(得分:0)
你可以做的是使用一个名为Terrain的类,并使用静态构造函数多次初始化:
public class Terrain
{
public int IChance { get; private set; }
public int Chancepoint { get; private set; }
public int Octaves { get; private set; }
public int LengthMin { get; private set; }
public int LengthMax { get; private set; }
public float ScaleMin { get; private set; }
public float ScaleMax { get; private set; }
public float PersistenceMin { get; private set; }
public float PersistenceMax { get; private set; }
public pType Ptype { get; private set; }
public bTag[] Tags { get; private set; }
public static Terrain Desert()
{
return new Terrain
{
IChance = 15,
Chancepoint = 0,
Octaves = 4,
LengthMin = 60,
LengthMax = 90,
ScaleMin = 250,
ScaleMax = 350,
PersistenceMin = 0.5f,
PersistenceMax = 0.9f,
Ptype = pType.Lowland,
Tags = new bTag[] {bTag.Desert}
};
}
}
答案 5 :(得分:0)
joe的答案很好,但是构造函数调用有太多未命名的参数 - 350是什么意思?
这是数据驱动设计的理想选择。
不是在代码中定义所有Biome类型,而是将Biome类型的所有数据放入文件中,并在运行时读取文件。 C#语言有很多东西可以帮助你做到这一点,搜索的关键词是序列化(and here's a link to MSDN about it)。
最大的好处是您可以更改数据值而无需重新编译代码。
缺点是需要更多代码来定义第一个实例,但之后,您可以轻松地创建任意数量的实例。
答案 6 :(得分:0)
你可以做一些像宣布这样的抽象类然后继承它的东西:
public abstract class Terrain
{
public int iChance;
public int chance;
public int chancepoint;
public int octaves;
public int lengthMin;
public int lengthMax;
public float scaleMin;
public float scaleMax;
public float persistenceMin;
public float persistenceMax;
public pType ptype;
public Tag[] strongTags;
}
public class Desert : Terrain
{
}
public enum pType
{
Desert = 1,
LowLand = 2
}
public enum Tag
{
desert = 1,
lush = 2
}
然后你可以实例化沙漠:
var desert = new Desert()
{
iChance = 15
,chance = 15
,chancepoint = 0
,octaves = 4
,lengthMin = 60
,lengthMax = 90
,scaleMin = 250
,scaleMax = 350
,persistenceMin = 0.5f
,persistenceMax = 0.9f
,ptype = pType.Desert
,strongTags = new Tag[]{Tag.desert}
};
答案 7 :(得分:0)
不确定您的具体要求是什么,但这不是更好的方法:
public abstract class BiomeBase
{
public int Chance { get; set; }
public int Chancepoint { get; set; }
public int Octaves { get; set; }
// you get the idea ...
}
然后您继承了Desert
和Meadow
:
public class Desert : BiomeBase
{
// everything is inherited ...
// you can also add your own properties meant for Desert only (if needed)
}
public class Meadow : BiomeBase
{
// everything is inherited ...
}
现在Desert
包含Biome
所有内容,您可以像这样使用它:
var desert = new Desert
{
Chance = 5,
Octaves = 1,
/// etc
};
答案 8 :(得分:-2)
首先,你不能继承static classes。所以你必须开始使用实例。
其次,如果要扩展对象,则可以使用继承。例如,如果你想在沙漠上添加一个新的属性“bool HasScorpions”,而不是在Meadow上。
由于您使用相同的属性但想要使用不同的值,我个人使用接口。这样,您可以在轻松设置值的同时使属性只读。
public interface Terrain
{
int iChance = {get { return 15; private set; } ..and repeat.
int chance = iChance;
int chancepoint = 0;
int octaves = 4;
int lengthMin = 60;
int lengthMax = 90;
float scaleMin = 250;
float scaleMax = 350;
float persistenceMin = 0.5f;
float persistenceMax = 0.9f;
pType ptype = pType.Lowland;
bTag[] tags = { bTag.desert };
}