TP

Loops

Por Tprocheira, 28 de fev. de 2009 em Tutoriais de Scripting

otserv
tibia
script
11
3.7k
TprocheiraT
28 de fevereiro de 2009 às 12:59

Fala galerinha do XTibia.com!
Como tenho visto poucos tutoriais de nível avançado na nossa sessão de scripting, decidi fazer este tutorial completo sobre loops em LUA.
Basicamente, existem 3 tipos de loops que podem ser usados, os quais são: repeat ... until, while e for.
Recomendações:
-Conhecimento completo sobre Arrays;
-Conhecimento intermediário sobre LUA OFF-OpenTibia

Repeat Loop
Este é raro de se ver, já que ele tem uma sintaxe maior e faz a mesma coisa que o while.
A sua sintaxe é a seguinte:

local var = 0


function bla()
repeat
script
var = var+1
until var == 10
end
end


Este tipo de loop funciona da seguinte maneira:
Você tem uma variável para a qual você atribui o valor 0.
Então, você da o comando repeat, o qual irá repetir o código.
Para que o loop não seja infinito, você terá que adicionar a linha until var == valor, e antes disso, algo que aumente o valor da variável, no nosso caso, foi usado var = var+1, o que, após o script ter sido executado, irá aumentar o valor da variável var em um.
Um exemplo de OpenTibia:

local var = 0function onUse(cid, item)local rand = math.random(1, 10)repeatdoPlayerSay(cid, rand, 2)var = var+1until var == 5return trueend


Isso fará com que o player fale um número qualquer (randomizado pelo math.random) até que a variável var tenha valor 5.
Como pôde perceber, esse tipo de loop é um pouco complicado, já que você tem que aumentar a variável e para se fechar o loop você precisa colocar uma 'função' (until var == 5) para que ele termine.

While Loop
Esse, mesmo que pouco usado, ainda é usado atualmente.
Ele funciona quase da mesma maneira que o repeat, a não ser pelo fato de que não existe o until var == valor.
A sua sintaxe é a seguinte:

local var = 0


function Bla()
while var < 5 do
script
var == var+1
end
end


Neste caso, você terá que adicionar um end no lugar do until, mas percebam que ainda é preciso usar o var == var+1.

Um exemplo de OpenTibia:

local var = 0function onUse(cid, item)while var < 5 dodoPlayerSay(cid, "I'm crazy!", 2)var == var+1endend


Este script fará com que o player fale I'm Crazy 5 vezes (ou até a varíavel var estar com o mesmo valor citado no início do loop).
Você pode usar ele para criar um script após o final do while. Por exemplo, depois que ele falar as 5 vezes, ele morrerá de cansaço.

For Loop
Este, na minha opinião pessoal, é o melhor e mais flexível tipo de loop em LUA, porém não funciona com nenhuma condição (ele simplesmente vai repetir até o valor estipulado).
Com ele, você consegue checar cada item de uma tabela, podendo ser nomes, posições, ou qualquer outra coisa.
A sua sintaxe é uma das mais fáceis:

function Bla()


for index = a, b do
print("Hey, you there!")
end
end


Você pode substituir a palavra index por qualquer outra coisa.
Para determinar o valor inicial e o valor máximo à ser usado, você troca a letra a pelo valor mínimo e b pelo valor máximo.
Caso você queira checar cada item de uma tabela, você fará da seguinte maneira:

local table = {"Me", "You", "They"}


function Bla()
for i = 1, #table do
print(i)
end
end


Isso vai exibir na tela do usuário as seguintes palavras:

Me


You
They


Você pode usá-lo para repetir algum código.
Por exemplo, caso você queira esvaziar a sua array sem ter que 'chutar' quantos valores ela vai ter e sem repetir o código, o que você pode fazer, é usar o loop!

local names = {"Me", "You", "He"}function Bla()for i = 1, #names dotable.remove(names, i)endend


Isso irá remover todos os nomes da tabela, sem ter que repetir o código!

Um exemplo de OpenTibia:
20 Itens dentro de uma backpack!

Você também pode parar o loop após ele ter efetuado a sua ação, tudo que você tem à fazer, é adicionar o comando break (quebrar) após o seu código.

Um exemplo muito interessante (não é de minha autoria, e sim de Colandus), é um script que checa uma área e atribui um valor à uma variável se estiver (o tile) vazio ou com algum player.

local position = {fromx = 584, fromy = 371, tox = 595, toy = 381, z = 7}local area = ""function onUse(cid, item, frompos, item2, topos)area = "Creatures at area:\n"for i = position.fromy, position.toy dofor j = position.fromx, position.tox dolocal pos = {x = j, y = i, z = position.z, stackpos = 253}local getThing = getThingfromPos(pos).uidif isCreature(getThing) == 1 thenarea = area .. "1 "elsearea = area .. "0 "endendarea = area .. "\n"enddoPlayerSendTextMessage(cid, 17, area)return 1end



Você também pode usar Iterators com um loop for.
Para isso, farei um tutorial mais tarde!

\\

Editado Julho 10 por Mudrock

LeoneFML
28 de fevereiro de 2009 às 13:01

Ótima formatação, fácil de entender.

Por min está muito bom!

noobinhuN
28 de fevereiro de 2009 às 13:05

boa :)

dá pra entender fácil os loops, aliás eles não são complicados, complicados são os newbs usuários iniciantes, uso sempre o while porque acho melhor rs.

TprocheiraT
28 de fevereiro de 2009 às 13:27

Você pode usar o while com qualquer coisa, como

while getPlayerStorageValue(cid, 5000) < 5 do

:p

 

\\

RedZLR
28 de fevereiro de 2009 às 15:30

Bela formatação.

 

Movido.

zafor0Z
28 de fevereiro de 2009 às 15:32

Basicamente, existem 3 tipos de loops que podem ser usados, os quais são: repeat ... until, while e for.

 

Pelo que eu contei tem 4 ali '-'

TprocheiraT
28 de fevereiro de 2009 às 15:47

Se separam itens em uma lista com uma vírgula (não reticências).

Aquilo teve o sentido de mostrar o que faz parte da sintaxe do loop.

Caso você não tenha percebido, os loops while e for não possuem dois comandos, como o repeat tem...

 

\\

SophoraS
03 de março de 2009 às 10:56

Parabéns, Ótimo Tutorial.

 

Muito bem organizado, fácil de entender e bem formatado :).

 

Nota: 10/10

1 mês depois...
farkboyF
04 de abril de 2009 às 18:31

oq é exatamente os loops ?

2 semanas depois...
TprocheiraT
14 de abril de 2009 às 16:42

Loops são funções da área de programação. Essa função repete algum comando uma certa quantidade de vezes.

Você pode utilizar eles para checar todas as variáveis de uma tabela.

 

\\

3 meses depois...
CotocaC
02 de julho de 2009 às 06:22

Os primeiros são mais usados em verificações boleanas.

repeat-until é a mesma coisa que do-while em outras plataformas; sua diferença pro while é que ele primeiro executa a ação, depois verifica a condição:

local query = db.getResult("select * from database")
repeat
print(query:getDataInt("column1"), query:getDataString("column2"))
until not query:next() --Fará o ponteiro interno da resouce avançar, se não avançar para

Que seria a mesma coisa que:

local query = db.getResult("select * from database")
while (true) do --Loop infinito
print(query:getDataInt("column1"), query:getDataString("column2"))
if (not query:next()) then break end --Fará o ponteiro interno da resouce avançar, se não avançar para
end

Sendo o modo repeat-until menor e esteticamente correto. :)