0

Я разрабатываю консольную игру на C# и столкнулся с проблемой при использовании метода AddItemInInventory в конструктореInventory. У меня есть конструктор, который принимает готовый список предметов и успешно добавляет их в инвентарь, обновляя при этом общие параметры защиты. Однако, когда я пытаюсь добавить предмет в уже существующий инвентарь с помощью метода AddItemInInventory, общие параметры защиты не обновляются.

Вот код моего конструктора:

public Inventory(List<Item> items)
{
    _items = new List<Item>();
    foreach (var item in items)
    {
        _items.Add(item);
    _totalProtection += item.Protection;
    _totalProtectionQuality += item.ProtectionQuality;
}

}

И вот код метода AddItemInInventory:

public void AddItemInInventory(Item item)
{
    _items.Add(item);
_totalProtection += item.Protection;
_totalProtectionQuality += item.ProtectionQuality;

}

Я добавляю предметы в инвентарь так:

Item item = new("Новый предмет", 10000, 456, 987, ItemType.Weapon, ItemSize.Large);

_player.Inventory.PrintInventory(); Console.WriteLine(); _player.Inventory.AddItemInInventory(item); _player.Inventory.PrintInventory(); Console.WriteLine($"Protection { _player.Inventory.TotalProtection}"); Console.WriteLine($"ProtectionQuality { _player.Inventory.TotalProtectionQuality}");

Вот вывод в консоль, который я получаю

Name New Item For Test
Cost 500
Protection 12
Protection Quality 34
Size Small
Type Weapon

Name New Item For Test Cost 500 Protection 12 Protection Quality 34 Size Small Type Weapon

Name Новый предмет Cost 10000 Protection 456 Protection Quality 987 Size Large Type Weapon

Protection 12 ProtectionQuality 34

Я думаю, что Protection и ProtectionQuality будут иметь значения 468 и 1021 соответственно.

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

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

Заранее благодарю за помощь и рекомендации!

  • 1
    Опять двадцать пять. Вместо того, чтоб дублировать вопрос, далиб все нужные данные, создали минимальный, самодостаточный пример, который мы скопируем, запустим и увидим проблему. Сейчас вы нам показали все нужное? Нет... Например, что такое _totalProtection и почему потом вдруг вызывается TotalProtection? Если это свойство с приватным полем, то используйте свойство напрямую, а не поле. Далее, как "инвентарь" инициализируется, где? Наверно в классе "игрок", где его код в вопросе? Повторю, весь код воспроизводящий вопрос должен быть в вопросе. – EvgeniyZ Jan 02 '24 at 15:17
  • @EvgeniyZ я извиняюсь, что не скинул весь код. Я думал, что в описании вопроса нужно писать все кратко. Я могу предложить ссылку на гит хаб проекта. https://github.com/jomeiii/Fight-Game Объясню что происходит в проекте. В классе Program создается объект Player и объект Item, который в дальнейшем должен будет добавлен в инвентарь. Перед тем как добавить предмет в инвентарь выводим его содержимое. После добавляем предмет и выводим инвентарь теперь. Конструктор Player по дефолту имеет один предмет в инвентаре. После выводим параметры защиты из инвентаря игрока. Они не соответствуют ожиданиям – Степа Дресвянников Jan 02 '24 at 15:58
  • "нужно писать кратко" - да, а также так, чтоб можно было запустить и проверить код. Я могу скопировать ваш код из этого/предыдущего вопроса и запустить? Нет, у меня нет части классов, которые могут в себе нести проблему. На будущее, открываете студию, создаете пустой проект, создаете там 1-2 объекта в которых будет только необходимое, что показывает проблему, полученный код сюда. Вот хотите я вам коротко всю суть вопроса напишу? Смотрите: "Почему не меняется переменная value в данном коде? struct Obj { int value; public void Change(int newVal) => value += newVal; } .. obj.Change(5);", все... – EvgeniyZ Jan 02 '24 at 16:31
  • Ну а намек думаю уже поняли, если нет, то public struct Inventory меняем на public class Inventory. Почему так, читайте про структуры (зачем вы из тут используете, не пойму), а если не поймете сами, то приведите вопрос в нормальный вид, тогда мб кто-то даст ответ (если такого дубликата нет конечно). – EvgeniyZ Jan 02 '24 at 16:31
  • Боже, пример я вам не тот написал... В голове одно, пишу другое... Вот ваша проблема, структура и свойство, которое эту структуру получает. Проблема в том, что при get свойства вы получаете постоянно копию структуры, ибо это структура... Об этом кстати написано в Для чего нужны свойства. – EvgeniyZ Jan 02 '24 at 16:49

0 Answers0