C # Получить имя атрибута из строки - PullRequest
0 голосов
/ 17 мая 2019

Я создаю консольную игру на C #, которая, помимо прочего, управляет персонажем и его инвентарем.У меня есть все виды предметов, которые игрок может хранить в своем инвентаре.Один предмет, в частности, доставляет мне неприятности, предмет зелья.Это предмет, который использует игрок и который повышает его характеристики (например, очки здоровья или магические очки).Но повышаемый показатель указывается строковым атрибутом класса зелья.

Вот мой код:

Класс Player, представляющий символ игры

public class Player
{
        //Stats of the player
        public int HP;
        public int MP;
        public int Strength;
        public int Defence;

        public void UseItem(Item item) //The parameter is the Item to be used. A potion in my case
        {
            //The potion must rise the stat indicated in its attribute "Bonus Type"
        }
}

Класс Item, от которого унаследован класс Potion:

    public class Item
    {
        public string Name; //Name of the item
        public int Bonus; //The stat bonus that the item give to the Player
    }

И, наконец, класс Potion:

    public class Potion : Item
    {
        public string BonusType; //Says which stat is risen by the potion
    }

Вот мой вопрос: что я могу написать в методе UseItem () класса Player, чтобы получить атрибут BonusType используемого зелья, и такподнять правильный стат по нему?

Ответы [ 3 ]

1 голос
/ 17 мая 2019

вам нужно выяснить, какой предмет вы используете, в C # 6:

public void UseItem(Item item) 
{
    switch(item)
    {
       case Potion potion:
           if(potion.BonusType == "Whatever")
           {
               //do your stuff
           }
           break;
    }
}

впрочем, как упоминал @Neijwiert ... это не очень хороший дизайн, потому что тогда у вас есть вся ответственность в плеере ... лучше было бы:

public class Player
{
    //Stats of the player
    public int HP { get; set; }
    public int MP { get; set; }
    public int Strength { get; set; }
    public int Defence { get; set; }

    public void UseItem(Item item) //The parameter is the Item to be used. A potion in my case
    {
        item.Use(this);
    }
}


public abstract class Item
{
    public string Name { get; set;} //Name of the item

    public abstract void Use(Player player);

}

public enum BonusType
{
    HP,
    MP,
    Strength,
    Defence
}

public class Potion : Item
{
    public BonusType BonusType { get; set; }
    public int Amount { get; set; }

    public override void Use(Player player)
    {
        switch (BonusType)
        {
            case BonusType.HP:
                player.HP += Amount;
                break;
            case BonusType.MP:
                player.MP += Amount;
                break;
            case BonusType.Strength:
                player.Strength += Amount;
                break;
            case BonusType.Defence:
                player.Defence += Amount;
                break;
            default:
                throw new ArgumentOutOfRangeException();
        }
    }
}

Теперь у вас может быть целое семейство предметов, которые манипулируют игроком и выполняют различные эффекты, а эффекты управляются предметами, а не игроком.

0 голосов
/ 17 мая 2019

Простой способ:


public void UseItem(Item item)
{
switch(item.BonusType)
case "Health Bonus": // one of the "string BonusType"
player.HP = player.HP + Bonus;
break;

case "Magical Bonus": // one of the "string BonusType"
player.HP = player.MP+ Bonus;
break;

default:
// in case of no matchings.
break;
}
}

Я хочу попробовать вашу игру!

0 голосов
/ 17 мая 2019

Почему бы не начать с простого приведения?

if (item is Potion)
{
    var potion = (Potion) item;
    Console.WriteLine(potion.BonusType);
}

В более поздних версиях, если c #, вы можете объединить чек с приведением

if (item is Potion potion)
{
    Console.WriteLine(potion.BonusType);
}

В качестве альтернативы, оператор switch с проверкой типа

switch (item)
{
    case Potion potion:
        Console.WriteLine(potion.BonusType);
        break;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...