Добавлен , опубликован

Lua-программирование для чайников

Содержание:

10.1. Арифметический цикл (цикл со счетчиком).

Выполняет действие заданное кол-во раз. Имеет следующую конструкцию:
Синтаксис:
for ... do  
  ...  
end
обычно указывают в for .. do end 3 параметра:
start=1 --начало цикла. часто начинают с 1. Но можно, и наоборот, в обратный цикл от max до 1. Пример цикл от 10 до 1, в таком случае, указывают start = 10, finish=1, step = -1
finish=10 --число показывает конец цикла. завершение цикла. цикл прерывается, если finish==a.
step = 1 --шаг, по стандарту =1. И можно не указывать его в for .. do end. можно изменять размер шага. Если я хочу изменить цикл, пример от 10 до 1 с шагом -1.
for a = start, finish, step do  
  ...  
end
Пример
-- начало = 1, условие выхода из цикла = 10
for i=1,10 do
  print("....");  
end
Число 1 — с какого числа надо начинать цикл, 10 — до скольки продолжать. Первое число не может быть меньше одного.
Переменная i может быть любой другой:
for j=1,10 do  
  ...  
end
Также эта переменная является локальной — после окончания цикла она перестанет существовать. Если надо, её можно сохранить:
H = 1;  
for i=1,20 do  
  print("...");  
  H = i;--сохраняем переменную  
end
Чтобы преждевременно закончить цикл, можно воспользоваться оператором break:
k = 1;
for i=1,50 do
    k = k + 1;
    if k == 25 then
        break --разрушить/завершить цикл
    end
end
Оператор break должен стоять в конце цикла. Если же этого не надо, то можно отнести его в отдельный блок do ... end, о котором говорилось ранее:
k = 1;
for i=1,60 do
    k = k + 2;
    do
        break
    end
    k = k - 20;
end
Также, если написать break так:
k = 1;  
for i=1,10 do  
  k = k + 1;  
  break  
end
Тогда цикл выполнится только один раз. В дополнение к скрипту выше:
print(k); -- 2

10.2. Цикл while (цикл с предусловием).

Выполняет цикл до тех пор, пока заданное условие является истинным. Таким образом, цикл может не выполнится ни разу. Имеет следующую конструкцию:
Синтаксис:
while ... do  
  ...  
end
цикл будет выполняться до сих пор, пока условие b истинно. Как только условие вернет b==false, цикл оборвется.
while b do
--<body>
end
Пример:
a = 1; -- переменная а  
while a < 20 do -- выполняется цикл до тех пор, пока а меньше 20  
  a = a + 1;  
end
В данном примере цикл закончится, когда а будет равна 20.
Оператор break тут тоже уместен.

10.2.1. Бесконечный цикл.

Как понятно по названию, данный цикл выполняется бесконечно. Конструкция его состоит из цикла while:
Синтаксис:
while true do  
  ...  
end
На самом деле это самый обычный цикл while. Но может пригодится для бесконечного выполнения какой-либо операции.
Пример:
i = 1;  
while true do  
  i = i + 1;  
  if i > 10000 then break end  
end  
print(i);

10.3. Цикл repeat (цикл с постусловием).

Выполняет действие, пока не выполнится заданное условие. В отличии от while всегда выполнится хотя бы один раз. Конструкция его такова:
Синтаксис:
repeat  
  ...  
until ...
Пример:
n = 1; -- есть переменная n со значением 1  
repeat -- начало цикла  
  n = n + 1;  
until n == 50; -- выполнять цикл, пока n не примет значение 50
print(n); -- напечатает 50

10.4. Оператор return для циклов.

В случае для циклов данный оператор полностью повторяет оператор break:
a = 10;
for i=1,10 do
  a = a + 1;
  if a == 15 then return end
end
print(a); -- 15
Ну, в общем, тут всё понятно.

Завершение двойного цикла

Пример, если у нас есть двойной цикл. И нужно, чтобы цикл сразу завершался:
вот внизу представлен пример двойного цикла, из которого по завершению условия, должен завершится. Т.е. по логике должен выйти из первого цикла, и из второго цикла. Но код напечатан неправильно, поскольку, break поможет выйти только из первого цикла, в то время как второй не запустится никогда.
	for x=0, column do
		for y=0, row do
			if not button_xy[x][y] then
				button_xy[x][y]=Type_building
                break break
			end
		end
	end
надо проверять условия таким образом (правильно):
	local exit = false
	for y=0, row do
		if exit then
			break --выход из второго основного цикла
 		end
		for x=0, column do
			if not button_xy[x][y] then
				button_xy[x][y]=Type_building
                exit = true
                break --выход из первого доп цикла
			end
		end
	end
Другой вариант. Оборачивай в функцию и используй return, тогда выйдет из всех циклов сразу
function checkA()
	for x=0, column do
		for y=0, row do
			if not button_xy[x][y] then
				button_xy[x][y]=Type_building
                return false --в некоторых программах луа ругает почему-то, если я ничего возвращаю. поэтому вернул false
			end
		end
	end
end

10.5. Циклы обхода элементов таблиц и массивов.

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

`
ОЖИДАНИЕ РЕКЛАМЫ...