Использование одних и тех же объектов класса, но с разными членами - PullRequest
0 голосов
/ 10 февраля 2019

Хорошо, поэтому я хочу использовать один и тот же тип объекта пять раз в классе.Все они имеют одинаковые атрибуты, но они присутствуют там несколько раз.

     for(int i=0;i<5;i++){
         army1.Add(monkey);
         army1.Add(flyingMonkey);
         army1.Add(wizard);
         army1.Add(balloon);
     }

Класс войск содержит два атрибута: Имя и Здоровье.Я хочу, чтобы у всех обезьян были разные экземпляры, но без создания разных переменных, таких как monkey1, monkey2 или без использования массива.Все обезьяны получают урон в разном количестве, но сейчас урон накапливается.

Код: https://dotnetfiddle.net/YRukEz

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

У вас есть 4 набора волшебников, обезьяна, летающая обезьяна и воздушный шар (20 единиц войск).

 for(int i=0;i<5;i++)
 {
             army1.Add(monkey);
             army1.Add(flyingMonkey);
             army1.Add(wizard);
             army1.Add(balloon);
 }

Это значит, что каждый из них должен умереть 4 раза, прежде чем он больше не появится.Но в вашем коде, не относящемся к классу, у вас их всего 4.

var health = new List<int>() {50,50,60,55};

Это объясняет, почему Мастер умирает раньше в коде, не являющемся классом, и продолжает возвращаться (ну, на самом деле это не так.это еще один пример волшебника)

0 голосов
/ 10 февраля 2019

Причиной различного вывода является способ заполнения списка Troop объектов:

 for(int i=0;i<5;i++){
     army1.Add(monkey);
     army1.Add(flyingMonkey);
     army1.Add(wizard);
     army1.Add(balloon);
 }

Вы делаете это в цикле с пятью итерациями.Таким образом, каждый из ваших Troop экземпляров будет добавлен в ваш список пять раз (оставив вам список army1 с 20 элементами).Соответственно, каждый из ваших Troop элементов должен быть удален пять раз , пока их больше нет в списке.

Просто удалите цикл и полученное количество строкиз кода 2 будет совпадать с кодом 1:

 army1.Add(monkey);
 army1.Add(flyingMonkey);
 army1.Add(wizard);
 army1.Add(balloon);

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

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

Чтобы создать армию из нескольких юнитов одного типа, вам нужно будет Создайте единиц в каждой итерации вместо этого, поместив соответствующий код инициализации в цикл, а также:

for(int i=0;i<5;i++){
    Troop monkey = new Troop();
    Troop flyingMonkey = new Troop();
    Troop wizard = new Troop();
    Troop balloon = new Troop();

    monkey.name = "Monkey " + i;
    flyingMonkey.name = "Flying Monkey " + i;
    wizard.name = "Wizard " + i;
    balloon.name = "Balloon " + i;

    monkey.health = 50;
    flyingMonkey.health = 50;
    wizard.health = 60;
    balloon.health = 55;

    army1.Add(monkey);
    army1.Add(flyingMonkey);
    army1.Add(wizard);
    army1.Add(balloon);
}

РЕДАКТИРОВАТЬ: Кстати, на текущем этапе вашего кода и ваших классовВы можете легко написать это без каких-либо переменных для создания отдельных войск:

for (int i=0; i<5; i++){
    army1.Add(new Troop
    {
        name = "Monkey " + i,
        health = 50
    });
    army1.Add(new Troop
    {
        name = "Flying Monkey " + i,
        health = 50
    });
    army1.Add(new Troop
    {
        name = "Wizard " + i,
        health = 60
    });
    army1.Add(new Troop
    {
        name = "Balloon " + i,
        health = 55
    });
}
...