Инструменты пользователя

Инструменты сайта


Боковая панель

help:multid_array

Назад: Массивы

Многомерные массивы

Для чего нужны многомерные массивы

Обычно для текстовых игр многомерные массивы не нужны, однако авторы, пишущие на 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]='река'

В данном примере в квадратных скобках вместо номера ячейки мы указываем числа, перечисляемые через запятую. Таким образом мы создаём ячейки двумерного массива.

Числа в квадратных скобках — это кортеж.

Используя для индексации ячеек кортежи, мы можем создавать трёхмерные, четырёхмерные, и вообще сколькиугодно-мерные массивы:

$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/multid_array.txt · Последние изменения: 2026/01/31 12:11 — aleks_versus