14.10. Как сделать два списка предметов?
В: Как сделать два списка предметов? Например для игры за разных персонажей.
О:
Списки предметов можно хранить в разных массивах. Например:
! список предметов персонажа Вася
$вася_предметы[0] = "Отвёртка"
$вася_предметы[1] = "Гаечный ключ"
$вася_предметы[2] = "Ножовка"
! список предметов персонажа Петя
$петя_предметы[0] = "Радиоактивный пепел"
$петя_предметы[1] = "Хрустальный шар"
$петя_предметы[2] = "Апельсин"
Допустим, мы играем за персонаж Петя. Тогда добавление предметов должно выглядеть так:
! добавляем предмет в окно предметов
addobj "Бутылка кетчупа"
! запоминаем название предмета в массиве
$петя_предметы[] = "Бутылка кетчупа"
Пустые квадратные скобки после названия массива означают, что нужно записать значение в ячейку следующую за последней (в новую).
Удаление предмета соответственно будет выглядеть так:
! удаляем предмет из окна предметов
delobj "Бутылка кетчупа"
! удаляем запись о предмете из массива
killvar "$петя_предметы",arrpos("$петя_предметы","Бутылка кетчупа")
Когда нам нужно сменить персонаж, мы делаем следующее:
! очищаем список предметов в окне предметов
killobj
! выводим все предметы из списка другого персонажа
! с помощью цикла
i = 0
loop local i = 0 while i<arrsize("$вася_предметы") step i+ = 1:
! пока счётчик не превысил номер последней ячейки массива
! выводим в окно предметов предмет, записанный в массив
addobj $вася_предметы[i]
end
Можно написать универсальные локации для каждого из этих алгоритмов и использовать их, когда нужно. Для подробностей см. оператор gosub
.
Если вам нужно более двух списков предметов, то заводить отдельный массив на каждый неразумно. Проще завести два массива:
- в одном массиве прописывать сам предмет:
$предмет_название[0] = "Бутылка кетчупа"
- во втором массиве прописывать, кому принадлежит предмет (или где лежит):
$предмет_расположение[0] = "Петя"
Добавление предмета немного усложнится:
! добавляем предмет в окно предметов
addobj "Бутылка кетчупа"
! добавляем название в список и указываем, кому принадлежит
$предмет_название[] = "Бутылка кетчупа"
$предмет_расположение[] = "Петя"
Важно, чтобы предмет и его расположение прописывались в массивы под одним индексом. Тогда удаление:
! удаляем предмет из окна предметов
delobj "Бутылка кетчупа"
! удаляем и название предмета из списка и его расположение
i = arrpos("$предмет_название", "Бутылка кетчупа")
killvar "$предмет_название", i
killvar "$предмет_расположение", i
Вывести все предметы текущего персонажа можно так:
! где-то ранее мы написали имя персонажа в переменную
$персонаж_имя = "Петя"
! очищаем окно предметов от предметов другого персонажа
killobj
! выводим предметы пети в окно предметов
loop local i = 0 while i<arrsize("$предмет_название") step i += 1:
! пока счётчик не превысил номер последней ячейки массива
if $предмет_расположение[i] = $персонаж_имя:
! если предмет находится у пети
! выводим в окно предметов предмет, записанный в массив
addobj $предмет_название[i]
end
end