Ir para conteúdo

Featured Replies

Postado
  • Este é um post popular.

<< Aula 7 - Estruturas de Controle

Essa aula foi escrita por um urso gordo Mock, todos os créditos pertencem à ele.

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:

 
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:

  Citar
while (sentença) do
    (bloco)
end

Traduzindo:

  Citar
enquanto (algo for verdadeiro) fazer
    (coisas)
fim

Então repare, enquanto algo for verdadeiro fazer... Ele vai executar o que estiver dentro do loop infinitas vezes até que o ((sentença)) seja falso ou você mande ele parar.

Veja um exemplo:

 
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 de novo, ele vai executar até que seja 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 então feche o programa no X coolface.png

 

Veja mais alguns exemplos:

 
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 ermm.gif.

 

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:

  Citar
repeat
    (bloco)
until (sentença)

Tradução:

  Citar
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:

 
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< )

 
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:

 
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) 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)

 

 

Exercícios

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 script que mova um player por 5 sqms em direções aleatórios (o script deve parar com o break!)

DESAFIO Crie um script que gere um loop infinito que só pare depois de 10 segundos de execução.

 

Essa aula foi escrita por um urso gordo Mock, todos os créditos pertencem à ele.

Respostas:

 

Spoiler

1.

 

while isPlayer(cid) == true do
       doRemoveCreature(cid)
end

2.

 

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

3.

 

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

Desafio:

Spoiler
 
 


local time = 10 --- segundos

time = time+os.clock()

while true do

       if time <= os.clock() then

              break

       end

end

Editado por MaXwEllDeN (veja o histórico de edições)

-"Supra Omnes Lux Lucis"

- Acima de todos brilha a Luz -

5VGnDyBz.png

  • 1 year later...
Postado

Aaaaaaaaaah . esses exercicios to errando tudo...

:(

kkk

a aula ta muito boa...

so acho que esses exercicios teve coisas que eu nem sabia como

:
time = time+os.clock()

doSendMagicEffect

 

Cheguei a inventar

Magic_efect kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk

s6jali.png

  • 2 years later...
  • 11 months later...
Postado

desculpa reviver o topico, mas tenho uma duvida.

 

toda vez q eu quiser relacionar tempo as scripts tenho que 

usar essa linha de codigo?

 

time = time+os.clock()
 

se no caso fosse uma hora, teria q por o time = 3600?

 

se eu quiser printar isso e só eu por print('%S')?

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Conteúdo Similar

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.7k

Informação Importante

Confirmação de Termo