[[help:arrays|Назад: Массивы]]
====== Многомерные массивы ======
===== Для чего нужны многомерные массивы =====
Обычно для текстовых игр многомерные массивы не нужны, однако авторы, пишущие на QSP, порой внедряют в свои проекты элементы RPG, стратегий, и игр других жанров. Вот тогда-то многомерные массивы бывают очень полезны.
Если вы не знаете, зачем в вашей игре может понадобиться многомерный массив, скорее всего он вам не нужен. Пропустите данную тему — вернётесь к ней, когда возникнет необходимость.
Ну, а если вы всё-таки подозреваете, что многомерный массив вам может понадобиться, то вот несколько примеров использования:
* Координатная сетка или карта местности.
* Это самая распространённая механика, требующая многомерных массивов. Мы живём в трёхмерном пространстве, а карты рисуем в двумерном.
$map[1,2]='лес' & ! в строке 1, столбце 2 находится лес
$map[1,3]='лес' & ! в строке 1, столбце 3 находится лес
$map[2,2]='лес' & ! в строке 2, столбце 2 находится лес
$map[4,0]='река' & ! в строке 4, столбце 0 находится река
* Таблицы данных, которые позволяют представить что-то в виде табличек в игре. В этом случае одним из измерений может быть номер или название столбца, а вторым номер или иной индекс строки.
* Например, так легко составить список товаров в магазине, где будут записаны не только названия, но и другие характеристики.
$cell['Полка 1', 'Название'] = 'Апельсин' & cell['Полка 1', 'Цена'] = 12 & $cell['Полка 1', 'Вес'] = 1
$cell['Полка 2', 'Название'] = 'Отвёртка' & cell['Полка 2', 'Цена'] = 79 & $cell['Полка 2', 'Вес'] = 2
$cell['Полка 3', 'Название'] = 'Камень' & cell['Полка 3', 'Цена'] = 1 & $cell['Полка 3', 'Вес'] = 153
* Многоуровневый инвентарь и тому подобные механики хранения предметов в игре. Чаще всего реализация похожа на предыдущий пример.
===== Как делать многомерные массивы =====
В **QSP** есть возможность создавать многомерные массивы, используя для этого специальные индексы:
$map[1,2]='лес'
$map[1,3]='лес'
$map[2,2]='лес'
$map[4,0]='река'
В данном примере в квадратных скобках вместо номера ячейки мы указываем числа, перечисляемые через запятую. Таким образом мы создаём ячейки **двумерного** массива.
Числа в квадратных скобках — это **[[help:tuples|кортеж]]**.
Используя для индексации ячеек кортежи, мы можем создавать трёхмерные, четырёхмерные, и вообще сколькиугодно-мерные массивы:
$space[0,-2,9] = 'космический корабль'
value_time[12,33,1,366] = 137
макрокосмос_миллиардов_микрокосм[12,34,12,98,76,30,11,19,137,90] = 991112
Для многомерных индексов можно использовать не только числовые значения, но и строковые:
данные['таблица_данных',0,1]=73
яблоки['Паша','левый карман']=91
яблоки['Миша','правый карман']=10
$map[12,14,'слой_подземелья']="стена"
Есть небольшая хитрость в том, как назначаются многомерные индексы ячейкам массивов. Когда вы инициализируете (создаёте; объявляете) новую ячейку массива с многомерным индексом, происходит следующее:
* Плеер создаёт новую ячейку с новым **числовым** индексом, следующим по порядку. Например, если в массиве уже были созданы семь ячеек, создаётся ячейка с числовым индексом ''%%7%%''.
* Затем плеер "прикрепляет" указанный многомерный индекс к ячейке.
Поэтому, если вы создаёте ячейку с многомерным индексом, вы можете получать из неё значения в том числе и по числовому индексу:
яблоки['у Паши','левый карман']=37
яблоки['у Паши','правый карман']=5
яблоки['у Лёши','левый карман']=11
яблоки['у Лёши','правый карман']=19
*pl яблоки[0] & ! выведет на экран число 37
*pl яблоки[1] & ! выведет на экран число 5
*pl яблоки[2] & ! выведет на экран число 11
*pl яблоки[3] & ! выведет на экран число 19
**Настоятельно рекомендуется** использовать для индексирования или только числовые индексы, или только многомерные индексы.
Поскольку многомерные индексы - это кортежи: - можно использовать переменные типа **кортеж** для подстановок в индексах таких массивов:
%coords = [120, 450, -37]
$map[%coords] = 'Alien'
* Запись с дополнительным набором скобок эквивалентна записи с одним набором скобок, если вы указываете индекс ячейки массива:
$array[1, 2, 137]
! эквивалентно
$array[[1, 2, 137]]
===== Примеры использования =====
Заполняем карту 10x10 случайными объектами:
local $tile
$tile[] = 'река'
$tile[] = 'горы'
$tile[] = 'лес'
$tile[] = 'дорога'
! нумерация строк, т.е. координата Y
loop local y while y < 10 step y+=1:
! нумерация столбцов, т.е. координата X
loop local x while x < 10 step x+=1:
$map[y, x] = $tile[rand(0, 3, 3)]
end
end
[[help:arrays|Назад: Массивы]]