Ótima formatação, fácil de entender.
Por min está muito bom!
Ótima formatação, fácil de entender.
Por min está muito bom!
info
Grupo: Marquês
Registrado: 01/03/06
Posts: 1k
Reputação: +38
Gênero: Masculino

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.
info
Grupo: Conde
Registrado: 23/12/07
Posts: 566
Reputação: +5
Char no Tibia: Tprocheira soldier

Você pode usar o while com qualquer coisa, como
while getPlayerStorageValue(cid, 5000) < 5 do
![]()
\\
info
Grupo: Conde
Registrado: 06/11/06
Posts: 850
Reputação: +6
Char no Tibia: Xearius Thor

Bela formatação.
Movido.
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 '-'
info
Grupo: Conde
Registrado: 23/12/07
Posts: 566
Reputação: +5
Char no Tibia: Tprocheira soldier

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...
\\
Parabéns, Ótimo Tutorial.
Muito bem organizado, fácil de entender e bem formatado
.
Nota: 10/10
oq é exatamente os loops ?
info
Grupo: Conde
Registrado: 23/12/07
Posts: 566
Reputação: +5
Char no Tibia: Tprocheira soldier

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.
\\
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. ![]()
info
Grupo: Conde
Registrado: 23/12/07
Posts: 566
Reputação: +5
Char no Tibia: Tprocheira soldier
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:
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:
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:
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:
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:
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:
Isso vai exibir na tela do usuário as seguintes palavras:
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)endendIsso 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 1endVocê também pode usar Iterators com um loop for.
Para isso, farei um tutorial mais tarde!
\\
Editado Julho 10 por Mudrock