Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/15: Рейтинг темы: голосов - 15, средняя оценка - 5.00
5 / 5 / 0
Регистрация: 20.08.2017
Сообщений: 685

Какой контейнер использовать в качестве рюкзака для персонажа в игре?

23.04.2018, 13:53. Показов 3751. Ответов 79
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем добрый день, посоветуйте как лучше решить проблему: пишу консольную рпг, задумал сделать рюкзак персонажу в котором он будет хранить все свои добытые кровью и потом вещи в боях. Что для этого лучше использовать (Вектор)? Как контейнер для содержания вещей или что иное, так же интересен был бы ваш совет как сделать так, что бы при открытии рюкзака выводилось уведомление у вас (нет вещей/ или же перечень вещей находящихся внутри).
Спасибо
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.04.2018, 13:53
Ответы с готовыми решениями:

Какой контейнер для чего использовать?
для чего какой контейнер эффективней использовать? vector- list- map- set- queue- stack-

Какой контейнер в STL и для чего эффективнее использовать?
Какой контейнер в STL и для чего эффективнее использовать? И почему

Какой контейнер можно использовать для быстрого сравнения 44-битовых хэшей?
Добрый день. Народ какой контейнер можно использовать для быстрого сравнения 44'битовых хэшов? хэшов примерно 5000000 QMap медленно...

79
5 / 5 / 0
Регистрация: 20.08.2017
Сообщений: 685
25.04.2018, 05:48  [ТС]
Студворк — интернет-сервис помощи студентам
Bespridelschic, как он о должно было выглядеть со структурой? я запускал отладчик посмотреть в чем ошибка так он даже не заходит в структуру, только в класс создает лист и сразу выходит с него не вызывая ShowAll

Добавлено через 8 минут
Bespridelschic, т.е. если я буду заполнять лист (инвентаря ) через структуру, нужно в
C#
1
2
3
4
5
  public Swords(string v1, int v2)
    {
        this.v1 = v1;
        this.v2 = v2;
    }
передать параметры типа v1= ("Лучезарный клинок рассвета\n"); v2= 1;??
0
Wanna be serious
 Аватар для Bespridelschic
587 / 474 / 186
Регистрация: 31.07.2013
Сообщений: 1,693
25.04.2018, 06:34
Сделал пример, как это может выглядеть у вас:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
    internal class Program
    {
        public static void Main(string[] args)
        {
            Backpack bp = new Backpack(new Item1("name1", 1), new Item2("name2", 1), new Item1("name3", 1), new Item2("name4", 1));
            bp.ShowAll();
 
            Console.ReadKey();
        }
    }
 
    public interface IDrop
    {
        string Weapon { get; }
    }
 
    public class Item1 : IDrop
    {
        public string Weapon { get; private set; }
        public int Count { get; private set; }
 
        public Item1(string name, int count)
        {
            Weapon = name;
            Count = count;
        }
    }
 
    public class Item2 : IDrop
    {
        public string Weapon { get; private set; }
        public int Count { get; private set; }
 
        public Item2(string name, int count)
        {
            Weapon = name;
            Count = count;
        }
    }
 
    sealed class Backpack
    {
        private List<IDrop> Items;
 
        public Backpack() => Items = new List<IDrop>();
        public Backpack(params IDrop[] items) => Items = new List<IDrop>(items);
 
        public void Add(IDrop item) => Items.Add(item);
        public void Remove(string name) => Items.RemoveAll(item => item.Weapon == name);
 
        public void ShowAll()
        {
            foreach (var item in Items)
            {
                Console.WriteLine($"Предмет: {nameof(item.Weapon)} - {item.Weapon}");
            }
        }
 
        public static bool IsEmpty(Backpack backpack) => backpack.Items.Count == 0 ? true : false;
    }
0
5 / 5 / 0
Регистрация: 20.08.2017
Сообщений: 685
25.04.2018, 06:44  [ТС]
Bespridelschic,
C#
1
Backpack bp = new Backpack(new Item1("name1", 1), new Item2("name2", 1), new Item1("name3", 1), new Item2("name4", 1));
сюда надо все классы вещей передать?!
0
Wanna be serious
 Аватар для Bespridelschic
587 / 474 / 186
Регистрация: 31.07.2013
Сообщений: 1,693
25.04.2018, 06:50
Esso11, это начальная инициализация инвентаря, вы можете туда вообще ничего не передавать, тогда он будет пустой.
Для добавления нового предмета, вы можете использовать метод add в объекте bp:
C#
1
bp.Add(new Item1("Name", 2));
А можете уже готовый:
C#
1
2
Item1 item = new Item1("Name", 2);
bp.Add(item);
0
5 / 5 / 0
Регистрация: 20.08.2017
Сообщений: 685
25.04.2018, 07:06  [ТС]
Bespridelschic, спасибо, может хоть сегодня посплю если все выйдет

Добавлено через 12 минут
Bespridelschic, а я могу засунуть туда результат Пандора? Или сначало этот результат надо сохранить в отдельную переменную а потом вставлять?!
0
Wanna be serious
 Аватар для Bespridelschic
587 / 474 / 186
Регистрация: 31.07.2013
Сообщений: 1,693
25.04.2018, 11:00
Цитата Сообщение от Esso11 Посмотреть сообщение
а я могу засунуть туда результат Пандора?
Я не знаю что такое "результат Пандора", но могу вам сказать точно - без разницы как. Можно добавить туда уже определенную переменную, либо создать прямо там, в аргументах. Главное - что бы это был объект класса реализующего интерфейса IDrop.
0
5 / 5 / 0
Регистрация: 20.08.2017
Сообщений: 685
25.04.2018, 13:39  [ТС]
Bespridelschic, т9 сработал, хотел написать результат рандома
0
Wanna be serious
 Аватар для Bespridelschic
587 / 474 / 186
Регистрация: 31.07.2013
Сообщений: 1,693
25.04.2018, 13:58
Esso11, весь Ваш рандом, заключается в том, что бы извлечь из общего списка доступных вещей - одну единственную. Так что да, можете.
0
5 / 5 / 0
Регистрация: 20.08.2017
Сообщений: 685
25.04.2018, 14:27  [ТС]
Bespridelschic, я изначально наверное не правильно объяснил, у меня есть список предметов которые выпадают с монстра, после смерти монстра на экран выводиться рандомно название вещи, а потом это название вещи я хотел бы переместить в рюкзак - новый лист.
и потом так же по одной вещи после убийства монстра добавлять в рюкзак- дальше вещи

Добавлено через 7 минут
Bespridelschic, получилось, ОГРОМНОЕ СПАСИБО!!! если вам будет интересно репетиторство то я бы хотел обговорить этот вопрос, естественно все не бесплатно!!!!

Добавлено через 2 минуты
Bespridelschic, если вам не сложно можно комментарий к вашему коду.... пожалуйста
0
Wanna be serious
 Аватар для Bespridelschic
587 / 474 / 186
Регистрация: 31.07.2013
Сообщений: 1,693
25.04.2018, 14:35
Рад был помочь
Цитата Сообщение от Esso11 Посмотреть сообщение
если вам не сложно можно комментарий к вашему коду.... пожалуйста
К какому из?
0
5 / 5 / 0
Регистрация: 20.08.2017
Сообщений: 685
25.04.2018, 15:41  [ТС]
Bespridelschic, к вот этом всему
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
internal class Program
    {
        public static void Main(string[] args)
        {
            Backpack bp = new Backpack(new Item1("name1", 1), new Item2("name2", 1), new Item1("name3", 1), new Item2("name4", 1));
            bp.ShowAll();
 
            Console.ReadKey();
        }
    }
 
    public interface IDrop
    {
        string Weapon { get; }
    }
 
    public class Item1 : IDrop
    {
        public string Weapon { get; private set; }
        public int Count { get; private set; }
 
        public Item1(string name, int count)
        {
            Weapon = name;
            Count = count;
        }
    }
 
    public class Item2 : IDrop
    {
        public string Weapon { get; private set; }
        public int Count { get; private set; }
 
        public Item2(string name, int count)
        {
            Weapon = name;
            Count = count;
        }
    }
 
    sealed class Backpack
    {
        private List<IDrop> Items;
 
        public Backpack() => Items = new List<IDrop>();
        public Backpack(params IDrop[] items) => Items = new List<IDrop>(items);
 
        public void Add(IDrop item) => Items.Add(item);
        public void Remove(string name) => Items.RemoveAll(item => item.Weapon == name);
 
        public void ShowAll()
        {
            foreach (var item in Items)
            {
                Console.WriteLine($"Предмет: {nameof(item.Weapon)} - {item.Weapon}");
            }
        }
 
        public static bool IsEmpty(Backpack backpack) => backpack.Items.Count == 0 ? true : false;
    }
Добавлено через 31 минуту
Bespridelschic, и последний вопросик, а можно передать в
C#
1
Backpack bp = new Backpack(new Item1("name1", 1), new Item2("name2", 1), new Item1("name3", 1), new Item2("name4", 1));
эту строку, вещь которая рандомно выпала с монстра ? потому что в вашем примере передаем я так понял все вещи что есть игре
0
Wanna be serious
 Аватар для Bespridelschic
587 / 474 / 186
Регистрация: 31.07.2013
Сообщений: 1,693
25.04.2018, 15:47
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
internal class Program
    {
        public static void Main(string[] args)
        {
            // Создание объекта типа Backpack, с помощью конструктора принимающего массив предметов. В качестве аргументов передаются объекты вещей
            Backpack bp = new Backpack(new Item1("name1", 1), new Item2("name2", 1), new Item1("name3", 1), new Item2("name4", 1));
            bp.ShowAll();
 
            Console.ReadKey();
        }
    }
 
    /// <summary>
    /// Интерфейс, предназначенный для реализации каждой вещью, для приведения к общему типу
    /// </summary>
    public interface IDrop
    {
        /// <summary>
        /// Свойство интерфейса, в классе реализации может быть дополнено методом set
        /// </summary>
        string Weapon { get; }
    }
 
    /// <summary>
    /// Одна из вещей, которая реализует требуемый интерфейс
    /// </summary>
    public class Item1 : IDrop
    {
        public string Weapon { get; private set; }
        public int Count { get; private set; }
 
        /// <summary>
        /// Конструктор на два аргумента
        /// </summary>
        /// <param name="name">Название вещи</param>
        /// <param name="count">Количество</param>
        public Item1(string name, int count)
        {
            Weapon = name;
            Count = count;
        }
    }
 
    public class Item2 : IDrop
    {
        public string Weapon { get; private set; }
        public int Count { get; private set; }
 
        public Item2(string name, int count)
        {
            Weapon = name;
            Count = count;
        }
    }
 
    /// <summary>
    /// Запечатанный класс инвентаря - наследование от него запрещено
    /// </summary>
    sealed class Backpack
    {
        /// <summary>
        /// Список для хранения вещей в инвентаре. Хранит в себе типы, реализующие интерфейс IDrop
        /// </summary>
        private List<IDrop> Items;
 
        /// <summary>
        /// Простой конструктор, выделяющий объект списка на куче
        /// </summary>
        public Backpack() => Items = new List<IDrop>();
 
        /// <summary>
        /// Конструктор, имеющий один параметр - массив объектов наследников интерфейса IDrop
        /// </summary>
        /// <param name="items">Массив предметов</param>
        public Backpack(params IDrop[] items) => Items = new List<IDrop>(items);
 
        /// <summary>
        /// Добавление вещи в инвентарь, путем использования метода Add класса List<>
        /// </summary>
        /// <param name="item"></param>
        public void Add(IDrop item) => Items.Add(item);
 
        /// <summary>
        /// Удаление всех вещей из инвентаря, путём использования лямбды метода расширения, название которых совпадает с названием переданным в качестве аргумента
        /// </summary>
        /// <param name="name"></param>
        public void Remove(string name) => Items.RemoveAll(item => item.Weapon == name);
 
        /// <summary>
        /// Выведение списка
        /// </summary>
        public void ShowAll()
        {
            foreach (var item in Items)
            {
                Console.WriteLine($"Предмет: {nameof(item.Weapon)} - {item.Weapon}");
            }
        }
 
        /// <summary>
        /// Статический метод. Возвращает булево значение, соответствующее наполнению инвентаря
        /// </summary>
        /// <param name="backpack">Передаваемый инвентарь</param>
        /// <returns></returns>
        public static bool IsEmpty(Backpack backpack) => backpack.Items.Count == 0 ? true : false;
    }
1
5 / 5 / 0
Регистрация: 20.08.2017
Сообщений: 685
25.04.2018, 15:51  [ТС]
Bespridelschic, все работает идеально, посоветовать книгу по си шарпу которую вы читали не скажите?
0
Wanna be serious
 Аватар для Bespridelschic
587 / 474 / 186
Регистрация: 31.07.2013
Сообщений: 1,693
25.04.2018, 15:54
Цитата Сообщение от Esso11 Посмотреть сообщение
эту строку, вещь которая рандомно выпала с монстра ? потому что в вашем примере передаем я так понял все вещи что есть игре
Если объект bp уже выделен с помощью new, вы просто затрёте свой предыдущий список, и потеряете в нём все свои предметы. Для добавления, используйте:
C#
1
bp.Add(/*Выпавший предмет*/);
Если объект ещё не создан - выделяете его с помощью new, и передаёте в конструкторе начальные вещи в инвентарь. Если их нет - оставляете конструктор пустым.

Добавлено через 2 минуты
Цитата Сообщение от Esso11 Посмотреть сообщение
все работает идеально, посоветовать книгу по си шарпу которую вы читали не скажите?
Я начинал с книги Эндрю Троелсена, по C# 5.0. А потом по классическому пути - CLR via C# Джефри Рихтера (маст. хэв для любого, кто прикасается к C#) и Джон Скит C# in Depth. А дальше уже книги по проектированию идут
1
5 / 5 / 0
Регистрация: 20.08.2017
Сообщений: 685
25.04.2018, 16:04  [ТС]
Bespridelschic, спасибо
0
Wanna be serious
 Аватар для Bespridelschic
587 / 474 / 186
Регистрация: 31.07.2013
Сообщений: 1,693
25.04.2018, 16:05
Цитата Сообщение от Esso11 Посмотреть сообщение
спасибо
Пожалуйста. Удачи вам в ваших начинаниях
0
5 / 5 / 0
Регистрация: 20.08.2017
Сообщений: 685
28.04.2018, 03:55  [ТС]
Bespridelschic, здравствуйте, а не подскажите как решить еще одну проблему, нужно сделать проверку того какая вещь находиться в инвентаре. Это нужно для того что бы запустить процесс одевания или невозможности одеть шмотки которая есть в рюкзаке...
0
Wanna be serious
 Аватар для Bespridelschic
587 / 474 / 186
Регистрация: 31.07.2013
Сообщений: 1,693
28.04.2018, 05:42
Esso11, можете сделать метод в классе рюкзака, где в агрументах вы передавали бы название вещи, а в теле метода с помощью цикла проходили бы по всей коллекции. При этом, возращаемое значение из метода, яаляется типом bool. Нашли вещь - true, иначе - false.
0
5 / 5 / 0
Регистрация: 20.08.2017
Сообщений: 685
28.04.2018, 06:12  [ТС]
Bespridelschic, я думал использовать (Contains - метод) но при моей конструкции метод добавления в лист лежит за приделами видимости где проходит проверка ....
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
 public void Quest()
        {Console.WriteLine("Если желаете надеть вещь, нажмите (1)");
                                int a = Convert.ToInt32(Console.ReadKey());
                                
                                if (a==1)
                                {
                                    if (Items.Contains(new IDrop(drop.Weapon) ))
                                    {
 
                                    }
 
                                }
}
sealed class Backpack
{
  private List<IDrop> Items;
 
    public Backpack() => Items = new List<IDrop>();
    public Backpack(params IDrop[] items) => Items = new List<IDrop>(items);
 
    public void Add(IDrop drop) => Items.Add(drop);
    public void Remove(string name) => Items.RemoveAll(drop => drop.Weapon == name);
........
Добавлено через 4 минуты
Bespridelschic, небольшого примерчика у вас нет?
0
Wanna be serious
 Аватар для Bespridelschic
587 / 474 / 186
Регистрация: 31.07.2013
Сообщений: 1,693
28.04.2018, 06:37
Что то вроде этого:
C#
1
2
3
4
5
6
7
8
9
10
11
public bool IsContains(string name)
{
    for (int i = 0; i < Items.Count; i++)
    {
        If (Items[0].Weapon.Contains(name))
        {
            return true;
        }
    }
    return false;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.04.2018, 06:37

Какой контейнер использовать?
Привет всем. Я только начинаю программировать на Си и поэтому со многими особенностями языка не знаком. К сожалению сейчас у меня слишком...

Какой контейнер использовать?
Всем привет! Нужно повторить след: Немного не пойму, какой контейнер нужно выбрать. ListView и изменить свой адаптер? Или GridView, но...

Когда какой контейнер использовать?
Поделитесь опытом, когда и при каких условиях какой контейнер особенно удобен? Только поменьше абстракции пожалуйста :)

Прочитать массив чисел неизвестной длины. Какой контейнер использовать?
Доброго времени суток! И всех с наступающими праздниками :drink: В общем необходимо считать последовательность чисел, заранее неизвестной...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru