Ошибка «Имя не существует в этом контексте» в генераторе случайных элементов - PullRequest
0 голосов
/ 18 июня 2019

Целью является создание генератора случайных предметов, в данном случае зелий. Все работает хорошо, пока я не попытаюсь заставить тип зелья, который выбирается случайным образом, фактически повлиять на статистику, которую они увеличивают, и руководство, за которым я следую, не прошло.

В ошибках указано, что таких имен, как HEALTH и ENERGY, в этом контексте не существует, а также то, что «Не удается неявно преобразовать тип« void »в« BasePotion.PotionTypes »»

Я следую руководству по созданию RPG, чтобы попытаться выучить C #. Я следил за этим до этого момента, но решил расширить код, который мы делали. Первоначально у меня были операторы if в их собственной функции, но это дало ошибку «ожидаемый идентификатор».

private void CreatePotion() { 

    newPotion = new BasePotion();

    newPotion.PotionType = ChoosePotionType();
    newPotion.ItemName = newPotion.PotionType.ToString() +" POTION";
    newPotion.ItemID = Random.Range(1,100);
    if (newPotion.PotionType == HEALTH) {
        newPotion.Stamina = Random.Range(1,11);
        newPotion.Endurance = Random.Range(1,11);
        newPotion.Strength = 0;
        newPotion.Intellect = 0;
    }
    else if (newPotion.PotionType == ENERGY){
        newPotion.Stamina = 0;
        newPotion.Endurance = 0;
        newPotion.Strength = Random.Range(1,11);
        newPotion.Intellect = Random.Range(1,11);
    }
    else if (newPotion.PotionType == STAMINA){
        newPotion.Stamina = Random.Range(1,11);
        newPotion.Endurance = 0;
        newPotion.Strength = 0;
        newPotion.Intellect = 0;
    }
    else if (newPotion.PotionType == ENDURANCE){
        newPotion.Stamina = 0;
        newPotion.Endurance = Random.Range(1,11);
        newPotion.Strength = 0;
        newPotion.Intellect = 0;
    }
    else if (newPotion.PotionType == STRENGTH){
        newPotion.Stamina = 0;
        newPotion.Endurance = 0;
        newPotion.Strength = Random.Range(1,11);
        newPotion.Intellect = 0;
    }
    else if (newPotion.PotionType == INTELLECT){
        newPotion.Stamina = 0;
        newPotion.Endurance = 0;
        newPotion.Strength = 0;
        newPotion.Intellect = Random.Range(1,11);
    }
}

Операторы if - это строки с ошибками.

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

public enum PotionTypes {
    HEALTH,
    ENERGY,
    STRENGTH,
    ENDURANCE,
    STAMINA,
    INTELLECT
}

private PotionTypes potionType;
private int spellEffectID;

public PotionTypes PotionType {
    get { return potionType; }
    set { potionType = value; }
}

public int SpellEffectID {
    get { return spellEffectID; }
    set { spellEffectID = value; }
}

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

Я не могу понять, в чем проблема, но если у кого-то есть лучший способ решить эту проблему, это тоже будет полезно.

Ответы [ 2 ]

1 голос
/ 18 июня 2019

Первая проблема заключается в том, что вы пытаетесь получить доступ, например, HEALTH прямо из вашего класса BasePosition.HEALTH не является членом вашего класса, но имеет PotionTypes, поэтому вы должны получить к нему доступ через PotionTypes, как PotionTypes.HEALTH.

. Поэтому добавьте PotionTypes. перед каждым из значений перечисления.

Например,

if(newPotion.PotionType == PotionTypes.HEALTH)

Для второго вопроса нам нужно знать ваш код для ChoosePotionType

Очевидно, он определен как

private void ChoosePotionType()
{ 
    ... 
}

, но чтобы использовать его в

newPotion.PotionType = ChoosePotionType();

, он должен вернуть PotionType, поэтому он должен выглядеть как

private PotionType ChoosePotionType ()
{
    ...

    return PotionType.XY;
}
0 голосов
/ 18 июня 2019

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

private static BasePotion CreatePotion()
{
    BasePotion newPotion = new BasePotion();
    newPotion.PotionType = ChoosePotionType();
    newPotion.ItemName = newPotion.PotionType.ToString() + " POTION";
    newPotion.ItemID = new Random().Next(1, 100);
    switch (newPotion.PotionType)
    {
        case PotionTypes.HEALTH:
            newPotion.Stamina = new Random().Next(1, 11);
            newPotion.Endurance = new Random().Next(1, 11);
            newPotion.Strength = 0;
            newPotion.Intellect = 0;
            break;
        case PotionTypes.ENERGY:
            newPotion.Stamina = 0;
            newPotion.Endurance = 0;
            newPotion.Strength = new Random().Next(1, 11);
            newPotion.Intellect = new Random().Next(1, 11);
            break;
        case PotionTypes.STAMINA:
            newPotion.Stamina = new Random().Next(1, 11);
            newPotion.Endurance = 0;
            newPotion.Strength = 0;
            newPotion.Intellect = 0;
            break;
        case PotionTypes.ENDURANCE:
            newPotion.Stamina = 0;
            newPotion.Endurance = new Random().Next(1, 11);
            newPotion.Strength = 0;
            newPotion.Intellect = 0;
            break;
        case PotionTypes.STRENGTH:
            newPotion.Stamina = 0;
            newPotion.Endurance = 0;
            newPotion.Strength = new Random().Next(1, 11);
            newPotion.Intellect = 0;
            break;
        case PotionTypes.INTELLECT:
            newPotion.Stamina = 0;
            newPotion.Endurance = 0;
            newPotion.Strength = 0;
            newPotion.Intellect = new Random().Next(1, 11);
            break;
    }

    return newPotion;
}

private static PotionTypes ChoosePotionType()
{
    potionType++;
    PotionTypes returnPotion;
    switch (potionType)
    {
        case 1:
            returnPotion = PotionTypes.ENERGY;
            break;
        case 2:
            returnPotion = PotionTypes.HEALTH;
            break;
        case 3:
            returnPotion = PotionTypes.ENDURANCE;
            break;
        case 4:
            returnPotion = PotionTypes.INTELLECT;
            break;
        case 5:
            returnPotion = PotionTypes.STAMINA;
            break;
        case 6:
            returnPotion = PotionTypes.STRENGTH;
            break;
        default:
            returnPotion = PotionTypes.ENERGY;
            break;
    }

    return returnPotion;
}

public enum PotionTypes
{
    HEALTH,
    ENERGY,
    STRENGTH,
    ENDURANCE,
    STAMINA,
    INTELLECT
}

public class BasePotion
{
    private PotionTypes potionType;
    private int spellEffectID;

    public int Intellect { get; internal set; }
    public int ItemID { get; internal set; }
    public string ItemName { get; internal set; }

    public PotionTypes PotionType
    {
        get { return potionType; }
        set { potionType = value; }
    }

    public int SpellEffectID
    {
        get { return spellEffectID; }
        set { spellEffectID = value; }
    }

    public int Strength { get; internal set; }
    public int Stamina { get; internal set; }

    public int Endurance { get; internal set; }

    public override string ToString()
    {
        return $"ItemID:{ItemID}, ItemName:{ItemName}, PortionType:{PotionType.ToString()}, SpellEffect:{SpellEffectID}, Strength:{Strength}, Stamina:{Stamina}, Endurance: {Endurance}, Intellect: {Intellect}.";
    }
}

Код консольного приложения

private static int potionType = 0;
private static List<BasePotion> potions;
static void Main(string[] args)
{

    Console.WriteLine("Started.....");
    potions = new List<BasePotion>();
    for (int i = 0; i <= 5; i++)
    {
        var newPortion = CreatePotion();
        potions.Add(newPortion);
        Console.WriteLine(newPortion.ToString());
    }

    Console.WriteLine("Completed.....");
    Console.ReadLine();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...