如何最好地递增枚举?

8

嗨,各位。我希望有人能帮助我弄清如何增加枚举值。我有一个游戏,用枚举来获取杀死敌人的分数,我想每次杀死一个敌人时,该敌人分数的值增加10。这是我用于枚举的代码:

  public enum gamescore// Enumeration to hold the score values of the enemies

  {

  Martian = 10,

  Vesuvian = 20,

  Mercurian = 30,

  Meteor = 50,

  MotherShip = 100,

  Destroyer = 200

  }

当敌人死亡时,从另一个类中调用得分方法的方式:

    public int GetScore()// The method that utilieses the enumeration to get the score for the enemy killed
    {

        if (this is Martian)
        {
            return (int)gamescore.Martian;
        }
        else if (this is Vesuvian)
        {
            return (int)gamescore.Vesuvian;
        }
        else if (this is Mercurian)
        {
            return (int)gamescore.Mercurian;
        }
        else if (this is Destroyer)
        {
            return (int)gamescore.Destroyer;
        }
        else if (this is Meteor)
        {
            return (int)gamescore.Meteor;
        }
        else if (this is Mothership)
        {
            return (int)gamescore.MotherShip;
        }
        return 0;
    }

有什么建议吗?我只能想到一些复杂的方法来做这件事,我认为甚至都行不通。
此外,我想知道,如果高分标签小于分数,则更新高分标签,使其成为分数。但是当应用程序重新启动时,如果游戏完成或玩家没有生命了,高分将重置为零,有没有办法保持高分值,以便最高分始终存在?
感谢你们对我的问题的所有帮助,我真的很感激。
谢谢!

1
你在这里有两个问题,请把它们分成两个实际的问题。 - sgriffinusa
2
关于 #1:多态。没得说。 - user395760
1
“当其中一名敌人被击杀时,我希望敌人的值每次增加10。” - Mikael Svenson
5个回答

7
在这种情况下,我不会将其存储为枚举 - 它听起来更像是范围标记而不是离散值。我可能会有一些常量和一个检查方法。
if(score>100) return "awesome";
if(score>40) return "meh";

等等

但是回答有关枚举的递增问题:您可以将其转换为基本类型(通常为int):

myEnumValue = (MyEnum)((int)myEnumValue + 10);

我不是最好的程序员,我是一个初学者,我使用枚举来保存分数,因为这是我唯一知道的方法,由于母舰和毁灭者是boss敌人,我希望每次杀死它们时它们的值增加十分。 - deucalion0

6

这个设计不是很面向对象。更好的方法是创建一个IEnemy接口,该接口需要一个GetScore方法(可能还有其他方法)。然后每个敌人都有一个单独的类来实现IEnemy接口,并返回相应的分数。

public interface IEnemy{
   int GetScore();
}

public class Martian : IEnemy{
   int GetScore(){ return 10; }
}

public class Vesuvian : IEnemy{
   int GetScore(){ return 20; }
}
...

相比于使用枚举,这种方法有很多优点,例如你可以拥有得分相同但其他属性不同的敌人。


那看起来是个好主意,谢谢。我会尝试一下,看看能否让它正常工作。谢谢! - deucalion0

2
我会创建一个名为“敌人”的抽象类,其中包含一个名为KillScore(或任何你喜欢的名称)的属性。从该抽象类派生出每种敌人类型:
public abstract class Enemy
{
    virtual public int KillScore
    {
        get { return 0; }
    }
}

public class Martian : Enemy
{
    public override int KillScore
    {
        get { return 10; }
    }
}

// All the other classes here

public class Destoyer : Enemy
{
    public override int KillScore
    {
        get { return 200; }
    }
}

您只需要实例化您的个别类,例如:
    Martian martian = new Martian();
    Destoyer destroyer = new Destoyer();
    int score = GetScore(martian);
    score = GetScore(destroyer);

然后你的 GetScore 函数就变得非常简单了:
public int GetScore(Enemy enemy)
{
    // Debug Statement to show you what this enemy actually is
    Console.WriteLine("{0} {1}", enemy.GetType(), enemy.KillScore);
    return enemy.KillScore;
}

(接口也可以工作,但这样可以控制默认值,允许在基类中执行一些常见功能,这些功能可能会被子类覆盖或不覆盖等等)。


非常感谢您对此的帮助,您给了我一个很好的线索来解决这个问题,我已经从一个抽象敌人类中继承了一些内容,我会尝试您提出的得分方法。谢谢! - deucalion0
1
哈哈,它们非常相似。伟大的思想总是相似的。虽然用户567371可能应该接受你的建议,因为你添加了关于使用接口与抽象类的说明,这有助于解释它。 - Corith Malin

2

也许最好的方式是使用多态性。因此,您需要一个名为enemy的基类,并且它是抽象的。

public abstract class Enemy
{
  public abstract int GetScore();
}

然后,您需要每次都从中继承。
public class Martian : Enemy
{
  public int GetScore() { return 10; }
}

public class Vesuvian : Enemy
{
  public int GetScore() { return 20; }
}

在你的主方法中,你只需要创建正确类型的敌人:
Enemy blah = new Martian();
Enemy blah1 = new Vesuvian();

int x = blah.GetScore(); // This is 10.
int y = blah1.GetScore(); // This is 20.

+1 非常感谢你几乎与我同时给出了完全相同的答案... :) - Wonko the Sane
嗨,那很有道理,但是按照你的想法,我该如何让destroyer和mothership增加10呢?谢谢! - deucalion0
它们将是新的类。我只是为了简洁起见没有包含所有的类。而且,你不想返回10,而是要将你的枚举转换为整数返回。 - Corith Malin

2
为什么要使用枚举?为什么不创建一个只有GetScore属性的IScorable接口,并在你的“Enemies”类中实现它。然后你可以测试你的敌人是否是IScorable,如果是,则读取该属性。或者如果你的所有敌人类都派生自一个类,那么就将它放在那里。
此外,你使用枚举的方式是错误的。枚举用于完全不同的目的。

抱歉,我不是故意一次创建两个问题的,我只是没有意识到它们都是大问题。如果我知道如何将它们分开,我会这样做的,很抱歉! - deucalion0
抱歉,页面上所有东西一下子出现让我感到困惑。如果我知道如何使用界面创建它,我会这样做的,我会研究一下! - deucalion0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接