Найти тему

Как расширеть одномерный массив? Пример с игровым инвентарём.

Расширение массива в C sharp
Расширение массива в C sharp

Всем Хай! Сегодня мы будем разбирать тему расширения массива.

Давайте представим, что у нас есть инвентарь. И этот инвентарь не бесконечный. В нём всего 3 места. Если вы играли в «Resident Evil», то вы понимаете то, о чём я говорю. Все эти три места заняты вещами, патронами, аптечками. Без разницы. Чтобы мы могли расширить этот инвентарь нужно найти, допустим, подсумок. И тогда у нас появится ещё одна свободная ячейка. Это классический одномерный массив.

Как добавить эту ячейку рассмотрим на коротеньком коде.

int[] invent = { 5, 10, 8 };
int[] inventPlus = new int[invent.Length + 1];
for (int i = 0; i < invent.Length; i++)
{
inventPlus[i] = invent[i];
}
inventPlus[invent.Length] = 20;
invent = inventPlus;
for (int i = 0; i < invent.Length; i++)
{
Console.WriteLine(invent[i]);
}

Как видим первой строчкой кода мы создали одномерный массив на 3 элемента и сразу забили все его ячейки.

int[] invent = { 5, 10, 8 }

  • 5 аптечек
  • 10 пистолетных патронов
  • 8 метательных ножей

Чтобы увеличить наш инвентарь, мы должны создать ещё один массив по размерам, который больше предыдущего на один элемент.

int[] inventPlus = new int[invent.Length + 1]

Теперь мы переносим всю информацию из старого массива в новый.

inventPlus[i] = invent[i]

Естественно в цикле.

Теперь у нас есть массив «inventPlus» с размером на 4 элемента и с информацией из массива «invent». И у нас появилось место, чтобы засунуть 20 найденных патронов для дробовика. И мы в последнюю ячейку массива под индексом 3 засовываем наши патроны.

inventPlus[invent.Length] = 20

Напишите в комментариях, почему у нас патроны для дробовика попадут в ячейку под индексом 3. Проверим вашу внимательность.

Но у нас в игре инвентарь называется «invent», а патроны мы положили в другой массив «inventPlus». Не проблема. Не помню, говорил я или нет. Но название массивов это просто ссылка на место в памяти, где лежит информация о массиве. Поэтому мы просто указываем новую ссылку для нашего массива «invent».

invent= inventPlus

Мы заставляем массив «invent» ссылаться на память, на которую ссылается массив «inventPlus».

В конце мы просто выводим все элементы массива в консоли.

Console.WriteLine(invent[i])

Усовершенствование кода.

Зная эту информацию можно реализовать ввод данных через консоль в постоянно расширяющийся массив и потом делать с этими данными всё что угодно.

Код будет выглядеть вот так.

bool exi = true;
string stop;
int[] invent = { 5, 10, 8 };
Console.WriteLine("Массив");
for (int i = 0; i < invent.Length; i++)
{
Console.Write(invent[i] + " ");
}
while (exi)
{
Console.WriteLine("\nВведите новый элемент в массив");
int[] inventPlus = new int[invent.Length + 1];
for (int i = 0; i < invent.Length; i++)
{
inventPlus[i] = invent[i];
}
inventPlus[invent.Length] = Convert.ToInt32(Console.ReadLine());
invent = inventPlus;
Console.WriteLine("Для выхода введите - exit\nДля продолжения нажмите - Enter");
stop = Console.ReadLine();
if (stop == "exit")
{
exi = false;
}
}
Console.WriteLine("Вывести все элементы в массиве - 1");
switch (Console.ReadLine())
{
case "1":
for (int i = 0; i < invent.Length; i++)
{
Console.Write(invent[i] + " ");
}
break;
}

Из новых элементов:

  • Я добавил ввод данных в массив через консоль.

inventPlus[invent.Length] = Convert.ToInt32(Console.ReadLine())

  • Выход из цикла по запросу.
stop = Console.ReadLine();
if (stop == "exit")
{
exi = false;
}
  • И вывод всех элементов массива в консоли через «switch». Что позволяет в будущем, для работы с массивом, добавлять новые команды.
switch (Console.ReadLine())
{
case "1":
for (int i = 0; i < invent.Length; i++)
{
Console.Write(invent[i] + " ");
}
break;
}

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

Видео работы программы.

В принципе по этой теме всё. Если возникли вопросы, то пишите их в комментариях. Чем смогу помогу. : ) Ставьте лайки, если всё понятно.

В следующей статье мы будем рисовать карту и героя который будет собирать деньги на ней. Так что опять почти работа с графикой в консоли. Будет интересно, поэтому подписывайтесь, чтобы не пропустить. Пока!

#it #разработкаигр #программированиеснуля #программированиедляначинающих #какстатьпрограммистом #csharp #сишарп