Суббота, 19.09.2020, 11:50 | Приветствую Вас Гость
Массивы
 
В прошлом уроке мы разобрали устройство игры "Змейка", в которой активно использовали вложенные массивы. Однако я думаю не всем было понятно - "что это такое и с чем его едят". Именно поэтому сегодняшний урок я и решил посвятить такой замечательной вещи, как массивы.

Так что же такое массивы? Массив - грубо говоря это набор однотипных индексированных ячеек памяти, которые хранят необходимую пользователю информацию, и обеспечивают удобное обращение к любой из ячеек. Однотипных - значит, что в этом массиве хранятся данные одного типа, ну скажем координаты всех ботов на карте, или массив оценок всех учеников в классе и т.д.

Так зачем же они нужны? - спросите вы. "Мы же можем прекрасно задать координаты ботов с помощью переменных". Ну да - можете, однако если ботов у вас ну скажем хотя бы 100, то попробуйте придумать 100 отличающихся друг от друга переменных, а теперь подумайте, какой длины будет самая последняя переменная - явно не очень маленькая, а соответственно коэффициент ошибки при наисании программы возрастает в разы.

Массивы бывают 3х основных типов.
1)Одномерные
2)Двумерные
3)Вложенные

1)Одномерные массивы служат для хранения информации ни чуть не хуже чем остальные, однако обращение к ним происходит через одну переменную.

Пример:

Мы хотим создать массив координат всех пуль, которыми мы стреляем из танка, чтобы подряд стрелять сразу несколькими пулями. Нам известно, что каждая пуля меняет свои координаты относительно экрана только по оси Х, т.е. движется вперёд. Соответственно нам понадобится массив на координаты пуль по Х и массив контролирующий номер вылетевшей пули, а вот если бы мы кидали гранаты, да ещё и по баллистической траектории, то тут бы без массива по Y - мы бы не обошлись.

Реализация:

pulia=Image.load("pulia.png")

masx={10}--Объявим PSP сам массив на 10 пуль, можно больше (ЭТО СИНТАКСИС ОБЪЯВЛЕНИЯ ЛЮБОГО МАССИВА. В данном случаем имя нашего массива masx)
masn={10}--Объявим PSP сам массив на 10 контролев, можно больше - зависит от числа пуль (ЭТО СИНТАКСИС ОБЪЯВЛЕНИЯ ЛЮБОГО МАССИВА. В данном случаем имя нашего массива masn)

for i=1,10 do--создадим цикл для заполнения всех эл-тов массивов нулями
masx[i]=0--обращаемся к текущей ячейке памяти массива с помощью скобок и переменной внутри них [i] (Так можно присваивать ячейкам массива любые значения, в данном случае я присваивал 0)
masn[i]=0--(Так как мы присваиваем значения ячейкам внутри цикла с параметром, как вы можете видеть 'i', то соответственно пробегаясь вперёд, этот параметр, стоящий в квдаратных скобках указывает на адрес ячейки, в которую мы будем заносить числа, ну или буквы - тут уж на ваше усмотрение)
end

fire=1--номер вылетающей пули

while true do
screen:clear()
pad=Controls.read()

if pad:cross() and oldpad:cross()~=pad:cross() then
masn[fire]=1--массив номеров в ячейке под номером (fire)=один теперь хранит значение 1 (Как вы можете видеть в квадратных скобках я совсем не обязан писать i, я могу туда поставить любую переменную со значением, а могу даже написать константу, ну скажем так [1])
if fire<10 then--если номера пуль не перевалили за 10, то продолжаем увеличивать
fire=fire+1--увеличение
else
fire=1--сброс, если же всё-таки перевалили за 10
end
end

for i=1,10 do--этот цикл позволяет нам каждую долю секунды обращаться раз за разом по очереди ко всем ячейкам массива
screen:blit(masx[i],0,pulia)--выыод пуль на экран (Опять же обращаюсь поочереди к ячейкам массива, с помощью переменной i)
if masn[i]==1 then--если массив номеров для данной пули i равен 1 то
if masx[i]<480 then--если пуля не вылетела ещё за пределы экрана то
masx[i]=masx[i]+1--перемещаем её туда :)
else--а иначе
masx[i]=0--снова ставим её в начало экрана
masn[i]=0--и сбрасиваем с неё активность
end
end
end

screen:flip()--проявление изображения
oldpad=pad
end

2)Теперь перейдём к двумерным массивам.
Чаще всего они нужны при создании 2D карт, ну скажем в Terraria без них явно не обошлись) Они удобны именно в этой области, поскольку позволяют наиболее точно и удобно обратиться к нужной ячейке. Вот скажем у нас есть кинозал 10на10 мест. Это по сути дела двумерный массив из 10 рядов и 10 мест на каждом ряду. А обращаться к этому массиву мы будем так - дайте нам сведения о 3 ряде 4 месте mas[3][4] - первой ячейкой принято обозначать ряд, а второй столбец, или в нашем случае - место.
Задач интересных на эту тему - тьма. Расписывать каждое из них силы не хватит, однако ничего сложного в них нет, просто обращаться к ним надо теперь не так mas[i] а так mas[i][k], где k - это уже новая переменная отвечающая за места.

Пример объявления двумерного массива:

mas={}--создаем безразмерный массив mas
for i=1,3 do--цикл до 3 рядов
table.insert(mas,{})--расширяем массив рядов
for k=1,4 do--цикл до 4 мест
table.insert(mas[i],{})--расширяем массив столбцов
end
end

Пример обращения к ячейкам такого массива:

for i=1,3 do
for k=1,4 do
mas[i][k]=0--заполняем всё нулями
end
end
 
Пример проверки содержимого ячеек массива:
 
for i=1,3 do
for k=1,4 do
if mas[i][k]==0 then--если в текущей по i и k ячейке содержится 0
--Здесь можно написать любой свой код, который выполнится
end
end
end

3)Вложенные массивы. Это такие массивы, которые в своих ячейках содержат ещё массивы с ячейками telo={{x=1,y=1},{x=2,y=1},{x=3,y=1},{x=4,y=1}}--яркий пример из игры "Змейка", мною рассмотренной Обращение к ним происходит через специальный знак (.) точку telo[1].x=0--вот скажем тут мы в первый вложенный массив в массив telo, по координате Х присвоили 0 telo[1].y=0--а тут по Y

for i=1, table.getn(telo) do--цикл от 1 вложенного массива до последнего, определяемого специальной функцией, мною в предыдущем уроке рассмотренной
telo[i].x=0--всё заполняется нулями
telo[i].y=0--всё заполняется нулями
end
Навигация
Форма входа

Календарь
«  Сентябрь 2020  »
ПнВтСрЧтПтСбВс
 123456
78910111213
14151617181920
21222324252627
282930