[Aula 8] Loops: while e repeat

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

[Aula 8] Loops: while e repeat

Mensagem  caiohu123 em Sex Nov 26, 2010 6:04 pm

While & repeat
Aula 8

Primeiramente desculpe a demora por essa aula, ficou meio aquela de; ah faz você, não faz você, anem faz você; Mais em fim estamos de volta com uma coisa indispensável em scripting que são os loops. Antes de tudo devo avisa que loops são perigosos, você pode travar seu servidor inteiro usando errado um loop.
Os loops são usados para inicialmente quando temos varias funções juntas iguais, por exemplo, fazendo um jogador falar oi 10 vezes. Sem os loops você faria assim:
Lua:
doPlayerSay(cid,'oi',1)
doPlayerSay(cid,'oi',1)
doPlayerSay(cid,'oi',1)
doPlayerSay(cid,'oi',1)
doPlayerSay(cid,'oi',1)
doPlayerSay(cid,'oi',1)
doPlayerSay(cid,'oi',1)
doPlayerSay(cid,'oi',1)


Com loops você resume isso a 4 linhas, e ainda pode fazer milhares de coisas com eles!
While
Sintaxe:
Código:
while (sentença) do
(bloco)
end
Traduzindo:
Código:
enquanto (algo for verdadeiro) Fazer
(coisas)
fim
Entao repare, enquanto algo for verdadeiro fazer... Ele vai executar o que estiver dentro do loop infinitas veses até que o ((sentença)) seja falso ou você mande ele parar. Veja um exemplo:
Lua:
while getPlayerLevel(cid) < 10 do --- Enquanto o level for menor que 10
doPlayerAddExp(cid,1000) adcionar 1k de exp por vez
end


Viram? enquanto o nível for menor que 10 ele vai adicionar 1k de exp. Ele ira verificar, se for false (maior que 10) ele pula tudo e vai para o que estiver depois do end, se for true (for menor que 10) ele ira adicionar 1k de exp e depois ira verificar dinovo, ele vai executar até que seje 10.
Nessa hora que se tem que tomar cuidado, é na verificação. Se você colocar algo como: while 1 < 2 do, ele vai executar eternamente, até que vc encerre o programa forçadamente (ctrl-alt-del) ou reinicie o pc, ou entao fexe o programa no X
Veja mais alguns exemplos:
Lua:
pos = {x=100,y=100,z=100,stackpos=0}
local stack = 0
while stack < 255 do
pos.stackpos = stack
local item = getThingFromPos(pos)
if item.itemid ~= 0 and isCreature(item.uid) == false then
doRemoveItem(item.uid,item.type)
end
stack = stack+1
end


Nesse exemplo declaramos uma pos e um numero, no loop verifica se o numero é menor que 255, se for a stackpos vai ser igual ao numero e depois ira verificar o que tem no mapa naquela posição, se tiver um item e nao for um player ou monster ele ira remover o item e no final adcionar +1 numero a nossa variavel stack, Nisso repare, ele ira executar 255 veze e ira deletar todos os items daquela posição ;D imagina vc escrevendo isso 255 vezes sem o loop .
Repeat
Ao contrario do while ele é tudo ao contrario, a verificação é no fim e ele só repete se for false (contrario de while que é se for true)
Sintaxe:
Código:
repeat
(bloco)
until (sentença)
Tradução:
Código:
Repetir
(coisas)
até (bloco)
Bem nao seria até seria até que nao, pois se você usar:
until true
ele vai parar, e se usar:
until false
ele vai continuar. è ao contrario especificando mais. Diferente do while, o repeat ele executa primeiro o bloco para depois verificar, a verificação é no final. Tambem perigoso pois se usado incorretamente vc vai travar seu server tambem. Mais nao ligue pra isso todos que começam a mexer com loops sempre travam seus servidores no começo é normal.
Veja o repeat em uso:
Lua:
local n = 0
repeat
n = n+1
print('ola pessoas este é o loop numero:'..n)
until n == 10

Ele ira executar 10 vezes, ele ira parar quando n for 10.
Agora veja o exemplo de limpar o char adaptado para o repeat e veja a diferença (repare nos sinais de > e< )
Lua:
pos = {x=100,y=100,z=100,stackpos=0}
local stack = 0
repeat
pos.stackpos = stack
local item = getThingFromPos(pos)
if item.itemid ~= 0 and isCreature(item.uid) == false then
doRemoveItem(item.uid,item.type)
end
stack = stack+1
until stack > 255

Viram? Ao invez da verificação ser no começo do loop ela é feita no final, entao ao final do lopp antes da verificação eu adciono +1 no valor da variavel stack, e ele so ira parar o loop assim que stack for maior que 255 (ou seja 256), entao assim que o script dentro do loop temrinar com o valor 256 ele ira parar o loop e prosseguir com o resto do script.

break
Antes de terminarmos irei falar rapidamente sobre o break.
Ele é usado APENAS em loops e serve para "quebrar" o loop, acontece quando vc quer parar o loop sem a verificação, ou parar antes de algo.
Veja:
Lua:
local parar = 0
while os.date('%S') == '45' do
print('Verificando se agora são 45 segundos')
if parar > 25 then
break
end
print('Nem é agora são:'..os.date('%S')..' segundos')
parar = para+1
end
print('oi')


Nesse caso criei um script para ver se agora são X horas X minutos e 45 segundos (não importa quantas horas e minutos só os segundos), e se depois de 25 verificações não for 45 segundos ele ira usar o break. Quando usado ele ira finalizar o loop e irar continuar a executar o script depois do loop, no caso o print('oi') ai e o resto do script (caso exista)



Exercicios

Faça seguinte:
Crie um loop que execute enquanto o player estiver online, e enquanto ele estiver online colocar para kickar ele.
Use o repeat para criar um script que solte 25 magic effects diferentes.
Use qualquer loop para criar um scritp que mova um player por 5 sqm em direções aleatorias (o scritp deve parar com o break!)
[/code]

DESAFIO
Crie um script que gwere um loop infinite que so pare depois de 10 segundos de execução.


respostas:

exercicio:


1.
Lua:
while isPlayer(cid) == true do
doRemoveCreature(cid)
end


2.
Lua:
local efect = 0
repeat
doSendMagicEffect({x=100,y=100,z=7},efect)
efect = efect+1
until efect > 25


3.
Lua:
local times = 0
while true do
doMoveCreature(cid,math.random(0,3))
times = times+1
if times > 4 then
break
end
end


desafio:

Lua:
local time = 10 --- segundos
time = time+os.clock()
while true do
if time <= os.clock() then
break
end
end


credito: caiohu123

caiohu123
Membro
Membro

Mensagens : 32
Data de inscrição : 25/11/2010

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum