Tprocheira 5 Postado Fevereiro 28, 2009 Share Postado Fevereiro 28, 2009 (editado) 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-OpenTibiaRepeat 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()repeatscriptvar = var+1until 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 scriptvar == 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, 2017 por Mudrock Link para o comentário https://xtibia.com/forum/topic/108641-loops/ Compartilhar em outros sites More sharing options...
LeoneFM 0 Postado Fevereiro 28, 2009 Share Postado Fevereiro 28, 2009 Ótima formatação, fácil de entender. Por min está muito bom! Link para o comentário https://xtibia.com/forum/topic/108641-loops/#findComment-702418 Compartilhar em outros sites More sharing options...
noobinhu 38 Postado Fevereiro 28, 2009 Share Postado Fevereiro 28, 2009 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. Link para o comentário https://xtibia.com/forum/topic/108641-loops/#findComment-702423 Compartilhar em outros sites More sharing options...
Tprocheira 5 Postado Fevereiro 28, 2009 Autor Share Postado Fevereiro 28, 2009 Você pode usar o while com qualquer coisa, como while getPlayerStorageValue(cid, 5000) < 5 do \\ Link para o comentário https://xtibia.com/forum/topic/108641-loops/#findComment-702428 Compartilhar em outros sites More sharing options...
RedZL 6 Postado Fevereiro 28, 2009 Share Postado Fevereiro 28, 2009 Bela formatação. Movido. Link para o comentário https://xtibia.com/forum/topic/108641-loops/#findComment-702486 Compartilhar em outros sites More sharing options...
zafor0 0 Postado Fevereiro 28, 2009 Share Postado Fevereiro 28, 2009 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 '-' Link para o comentário https://xtibia.com/forum/topic/108641-loops/#findComment-702487 Compartilhar em outros sites More sharing options...
Tprocheira 5 Postado Fevereiro 28, 2009 Autor Share Postado Fevereiro 28, 2009 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... \\ Link para o comentário https://xtibia.com/forum/topic/108641-loops/#findComment-702503 Compartilhar em outros sites More sharing options...
Sophora 0 Postado Março 3, 2009 Share Postado Março 3, 2009 Parabéns, Ótimo Tutorial. Muito bem organizado, fácil de entender e bem formatado . Nota: 10/10 Link para o comentário https://xtibia.com/forum/topic/108641-loops/#findComment-703913 Compartilhar em outros sites More sharing options...
farkboy 0 Postado Abril 4, 2009 Share Postado Abril 4, 2009 oq é exatamente os loops ? Link para o comentário https://xtibia.com/forum/topic/108641-loops/#findComment-718838 Compartilhar em outros sites More sharing options...
Tprocheira 5 Postado Abril 14, 2009 Autor Share Postado Abril 14, 2009 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. \\ Link para o comentário https://xtibia.com/forum/topic/108641-loops/#findComment-724838 Compartilhar em outros sites More sharing options...
Cotoca 0 Postado Julho 2, 2009 Share Postado Julho 2, 2009 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. Link para o comentário https://xtibia.com/forum/topic/108641-loops/#findComment-756009 Compartilhar em outros sites More sharing options...
Posts Recomendados