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;
}
}