[[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|Назад: Массивы]]