C# 在c语言中使用抽象类的困惑#

C# 在c语言中使用抽象类的困惑#,c#,C#,我有一个问题,因为我是编程新手,我真的很困惑如何为下面的问题实现一个最佳实践解决方案,这是一个游戏逻辑,这里有一些可能的方法来表达观点 EnemyA 400, EnemyB 500, EnemyC 700, Coin 200, FireBall 300 意思是打硬币得到200分,射击火球得到300分& 如果你达到1000点,你将获得额外的生命,逻辑简单但实现最佳实践不是(至少对我来说)我应该使用抽象类还是字典 到目前为止,我使用了一本字典,我读取了一个给定的文件(txt)文件,该文件被写入

我有一个问题,因为我是编程新手,我真的很困惑如何为下面的问题实现一个最佳实践解决方案,这是一个游戏逻辑,这里有一些可能的方法来表达观点

EnemyA 400,
EnemyB 500,
EnemyC 700,
Coin   200,
FireBall 300
意思是打
硬币
得到200分,射击
火球
得到300分&

如果你达到1000点,你将获得额外的生命,逻辑简单但实现最佳实践不是(至少对我来说)我应该使用
抽象类
还是
字典

到目前为止,我使用了一本
字典
,我读取了一个给定的文件(txt)文件,该文件被写入(EnemyA,EnemyB,Coin,Coin,Coin,Coin),然后我计算分数:

IEnumerble<Shootable> shootableItems = GetShootableFromFile();
var score = shootableItems.Sum(s => s.Points);
public int pointCal(IEnumerable-enemyType)
{
var possiblePoints=新字典()
{
{new EnemisEntity{enemyType=“EnemyA”},400},
{new EnemisEntity{enemyType=“EnemyB”},500},
{new EnemisEntity{enemyType=“EnemyC”},700},
{new EnemisEntity{enemyType=“Fireball”},300},
{new EnemisEntity{enemyType=“Coin”},200},
};
int z=0;
List myPoints=新列表();
foreach(enemyType中的var项)
{
z=possiblePoints.FirstOrDefault(f=>f.Key.enemyType.Equals(item)).Value;
添加(z);
}
int finalPonts=g.Sum(s=>Convert.ToInt32(s));
返回最终内容;
}
敌方实体类别:
公营经济
{
公共字符串enemyType{get;set;}
}

视情况而定。敌人是否有不同类型的物体(具有不同的属性等)

然后创建一个抽象类和子类可能是有意义的

public abstract class Shootable {
    public int points;
}

public class EnemyA: Shootable {
}

public class EnemyB: Shootable {
}

public class Coin: Shootable {
}

// etc
如果你所有的物品都只有一个描述就可以射击,那么

public class Shootable {
    public int points { get; set; }
    public string enemyType { get; set; }
    public Shootable(int points, string enemyType ){
        this.points = points;
        this.enemyType = enemyType;
    }
}

// then create like
var coin = new Shootable(500, "coin");
如果所有敌人都可以在同一个类中建模,那么你只需要射击类

然后得到要点:

IEnumerble<Shootable> shootableItems = GetShootableFromFile();
var score = shootableItems.Sum(s => s.Points);

对我来说,这是一个设计问题。当敌人之间的唯一区别只是点的值以及它们的名称时,定义类层次结构不是一个好主意。
EnemyA
EnemyB
类之间唯一不同的是每个类中包含的值。因此,您可以使用单个公共类来保存每个敌人的信息并处理这些点

下面是我可以编写的实现此设计的最简单的工作原型。它依赖于两个类。持有敌人类型及其点数的
EnemyEntity
类,以及
游戏
类,该类包含得分背后的逻辑,并记录所有可能的敌人

public class EnemyEntity
{
    public EnemyEntity(string type, int points)
    {
        Type=type;
        Points=points;
    }

    public string Type { get; }
    public int Points { get; }
}

public class Game
{
    public Game(params (string type, int points)[] values)
    {
        this.Enemies = new List<EnemyEntity>();
        foreach (var (type, points) in values)
        {
            Enemies.Add(new EnemyEntity(type, points));
        }
    }

    public List<EnemyEntity> Enemies { get; }

    public int CalculatePoints(IEnumerable<string> targets)
    {
        int points = 0;
        foreach (var item in targets)
        {
            var target = Enemies.FirstOrDefault((enemy) => enemy.Type.Equals(item));
            if (target!=null)
            {
                points+= target.Points;
            }
        }
        return points;
    }

}


class Program
{
    static void Main(string[] args)
    {
        var game = new Game(
            ("EnemyA", 400),
            ("EnemyB", 500),
            ("EnemyC", 700),
            ("Coin", 200),
            ("FireBall", 300));

        var input = "EnemyA,EnemyB,Coin,Coin,Coin,Coin";
        var targets = input.Split(',');
        var points = game.CalculatePoints(targets);

        Console.WriteLine(points);
        // 1700
    }
}

类层次结构不应用于实现游戏规则。类层次结构表示一种“是”关系,“敌人”和“硬币”不共享任何“是”关系,而不是“琐碎的”是“游戏实体”类型的关系,这是bunk。在您的例子中,这是作业类型的材料。为了学习目的,任何方法都有效。如果我是你的话,我会尽我所能地灵活变通,尝试不同的事情。可能有两个文件,一个是您读取可能的项目及其值,另一个文件包含评估分数的值列表。还要注意询问做某事的“最佳方式”。这很容易产生本网站不允许的固执己见的答案。@Dai你能解释更多吗?我所做的还可以吗?本例中类和对象的使用非常奇怪。你建造敌人只是为了给分。之后,他们又走了。有人可能会问,当敌人只生活在积分计算方法中时,游戏是如何运作的。@ThomasWeller为所有敌人提供单独的类?这正是我的意思。当您可以通过实例化可射击对象来构造硬币时,coin类是无用的。因为当前的实现依赖于字符串来定义目标,所以在我看来,拥有一个包含所有所需信息的类(如您的第二个选项)是合乎逻辑的。的确如此!看来这是该走的路了。如果EnemyA是一种
AnimalEnemy
,EnemyB是一种
humanbye
类型,成员不同,那么有一个基类是有意义的。关于添加所有这些后的第二个选项,我应该使用循环或字典进行查找?哪种是最好的方法?检查更新的答案。在
IEnumerable
collection.mai上使用linq询问为什么方法的名称与类名相同?Game(params(string type,int points)[]值)以及为什么不编写Game(string type,int point)什么是params和[]值?这是类的构造函数。这是您指定使用值初始化游戏的方式。在主程序中,您可以调用构造函数作为
var-game=new-game(…)
public class Game
{
    public Game(params (string type, int points)[] values)
    {
        this.Enemies = new Dictionary<string, EnemyEntity>();
        foreach (var (type, points) in values)
        {
            Enemies[type] = new EnemyEntity(type, points);
        }
    }

    public Dictionary<string, EnemyEntity> Enemies { get; }

    public int CalculatePoints(IEnumerable<string> targets)
    {
        int points = 0;
        foreach (var item in targets)
        {
            var target = Enemies[item];
            if (target!=null)
            {
                points+= target.Points;
            }
        }
        return points;
    }

}