现在我正在做一个需要怪物的游戏。我制作了一个MonsterBase
类,其他怪物都会继承这个类。这是一个控制台游戏,所以我给每个LowLevelMonster
实例不同的坐标。在另一种方法中,我想检查玩家是否与其中一个怪物实例在同一坐标上。现在我只能使用CCD_ 3语句来请求PositionX
&每个怪物实例的PositionY
。如果我遇到5个以上的怪物,这个比例会非常大。
我的问题:由于其他怪物实例继承自MonsterBase
,是否可以检查PositionX
&MonsterBase
的PositionY
调用它的每个固有实例的?
类似于:
if(Player.PositionX == MonsterBase.PositionX)
{
Console.WriteLine("the names of the Monsters instances that have the same X Coordinates");
}
这些是我目前的课程:
public class MonsterBase
{
int PositionX = 0;
int PositionY = 0;
}
public class LowLevelMonster : MonsterBase
{
string name = "monster";
int HP = 5;
}
不,继承不是这样工作的,从基类的实例到子实例没有隐含的链接。
你必须在一个集合中记录你所有的怪物,比如List<MonsterBase>
或Collection<MonsterBase>
,然后你可以过滤列表。
listOfMonsters.Where(monster => monster.PositionX == Player.PositionX)
什么是lambda表达式
将lambda表达式视为编写方法的简写方式。
将表达式monster => monster.PositionX == Player.PositionX
移动到变量将获得
Expression<Func<MonsterBase, bool>> lambda =
monster => monster.PositionX == Player.PositionX;
listOfMonsters.Where(lambda);
这更容易看出发生了什么。listOfMonsters.Where()
需要一个类型为Expression<Func<MonsterBase, bool>>
的参数,其中lambda本质上是一个方法委托,它接受一个参数(名为monster
(并返回一个布尔值。
这也可能是
public class Player() {
public int PositionX { get; set; }
public bool ComparePosition(MonsterBase monster){
return monster.PositionX == Player.PositionX;
}
}
// then later in the code
listOfMonsters.Where(Player.ComparePosition);
这是Where
的另一个过载,它采用了与.基本相同的方法组
listOfMonsters.Where(monster => Player.ComparePosition(monster));