C#:从已知数量的构造函数中调用随机构造函数的聪明方法是什么?
在我的游戏中,我有不同的敌人。当我创建一个地牢时,我希望游戏随机决定从玩家的角度放置哪个敌人。每个敌人都有自己的构造器,例如:C#:从已知数量的构造函数中调用随机构造函数的聪明方法是什么?,c#,constructor,C#,Constructor,在我的游戏中,我有不同的敌人。当我创建一个地牢时,我希望游戏随机决定从玩家的角度放置哪个敌人。每个敌人都有自己的构造器,例如: Ogre Ogre1 = new Ogre(level 1); 我用我在别处定义的方法称之为与敌人的战斗 fight(enemy); 现在我知道我可以通过如下方式调用随机构造函数: int i = new Random.Next(1,5) 然后这个: if (i= 1) {Ogre Ogre1 = new Ogre(level 1); Fight(Ogre1);
Ogre Ogre1 = new Ogre(level 1);
我用我在别处定义的方法称之为与敌人的战斗
fight(enemy);
现在我知道我可以通过如下方式调用随机构造函数:
int i = new Random.Next(1,5)
然后这个:
if (i= 1)
{Ogre Ogre1 = new Ogre(level 1);
Fight(Ogre1);
}
else if (i=2)
{ Skeleton Skeleton 1 = new Skeleton (level 1);
....
但是,假设我最终会有相当多的敌人,这看起来相当乏味。
有没有更聪明的方法可以做到这一点,例如,我可以将可能的敌人存储在列表中,然后从列表中调用构造函数
编辑:下面的答案似乎正是我所需要的!奇怪的是,只有当我输入lambda表达式时,如果我尝试直接实现解决方案,它才会起作用:
static Func<int, Enemy>[] EnemyFactory = new[]
{
(level) => (Enemy) new Ogre(level),
(level) => (Enemy) new Skeleton(level)
};
static Func[]EnemyFactory=new[]
{
(等级)=>(敌人)新食人魔(等级),
(关卡)=>(敌人)新骨架(关卡)
};
我得到错误代码CS0826,隐式类型数组找不到最佳类型
但是如果我输入lambda函数,它会突然起作用
static Func<int, Enemy>[] EnemyFactory = new Func<int, Enemy>[]
{
(level) => (Enemy) new Ogre(level),
(level) => (Enemy) new Skeleton(level)
};
static Func[]EnemyFactory=new Func[]
{
(等级)=>(敌人)新食人魔(等级),
(关卡)=>(敌人)新骨架(关卡)
};
制作一个Func
类型的“敌方工厂”数组,并从该数组中随机选取一个工厂
以下是一个潜在实现的框架:
interface IEnemy ...
class Ogre : IEnemy ...
class Skeleton : IEnemy ...
static Func<IEnemy>[] EnemyFactory = new Func<IEnemy>[] {
() => (IEnemy)new Ogre()
, () => (IEnemy)new Skeleton()
, ...
};
一般来说,你想要一个工厂来制造你的敌人,从那以后,你可以根据需要将其复杂化。听起来像是一个x-y问题。谢谢你的回复,谢尔盖!奇怪的是,只有当我按编辑中所示键入lambda函数时,它才对我有效。你能看看这个,告诉我我的第一个实现有什么问题吗?@Max我猜C#编译器不够严格,无法从函数定义派生出公共类型。它需要将类型从
EnemyFactory
的声明传播到它的成员定义中,而C#标准不允许这样做,至少目前是这样。
static Func<Level,IEnemy>[] EnemyFactory = new Func<Level,IEnemy>[] {
(level) => (IEnemy)new Ogre(level)
, (level) => (IEnemy)new Skeleton(level)
, ...
};