Ir para conteúdo

Desafio do mês. #02


Night Wolf

Posts Recomendados

Olá pessoal, seguindo a onda do desafio do mês eu bolei um novo desafio pra vocês no mesmo esquema do anterior (você pode verificar o desafio do mês passado clicando aqui)

Eu vou mais uma vez apresentar um pseudocódigo, algumas partes dele estão mais explícitas na linguagem e outras estão mais teóricas mas isso não vai influenciar tanto.


local position = {x = 160, y = 154, z = 7} -- posição do que?

function fazQualquerCoisa(cid, pos, i, j) -- recursao caudal
	j = j or 0
	p = i or 0
	if p >= config.rX then
		p = 0
		j = j < config.rY -1 and j + 1 or false
	end
	if j then
		posi = {x = pos.x + ( p * config.distX), y = pos.y + (j * config.distY), z = pos.z}
		if check_disponivel(posi) then
			doTeleportThing(cid, posi)
			countdown({{x = posi.x + 1, y = posi.y - 1, z = posi.z}, {x = posi.x - 1 , y = posi.y - 1, z = posi.z}} )
		else
			fazQualquerCoisa(cid, pos, p + 1, j)
		end
	end
end

function check_disponivel(npos)
	if disponivel(npos) then
		return true
	end
return false
end

function countdown(pos, Arraypos) -- apenas a ideia, pode ser que isso nao seja a prova de bugs e tenha que ser feito uma versao recursiva.
	local tempo = 5 -- tempo de que?
	for lugares = 1, #Arraypos do
		for j = 0, tempo do
			addEvent(function()
				sendTextMessage(Arraypos[lugares], tempo - j, TEXTCOLOR_ORANGE)
				if j == tempo and not check_disponivel(pos) then
					createMonster(Arraypos[lugares], "Nome monstro")
				end
			end, 1000 * j)
		end
	end
end


function onStepIn(cid)
	fazQualquerCoisa(cid, position)
return true
end 

 



O desafio é o seguinte: vocês tem que tentar adivinhar do que se trata esse código. Isso vale tanto para explicar partes do código quanto para explicar a idéia por trás dele.

A cada dia (o primeiro não conta) irei postar uma dica para ajudá-los nesse desafio, podendo ser uma dica explicando partes do código ou dicas sobre a funcionalidade dele.

"Mas lobo, por que eu iria tentar descobrir do que se trata seu código estúpido?" Bem meu caro, será uma tarefa legal e esse script é uma idéia bem inovadora.. só o fato de você tentar ler irá ajudá-lo a treinar seu cérebro para a linguagem Lua. E também há uma recompensa!! aquele que acertar ou chegar mais perto verá e terá acesso ao código antes de todo mundo!!111

Espero que vocês aninem pra participar deste tanto quanto animaram para participar do outro laugh.png

Dicas = {

}

Lembrando que toda resposta próxima da correta irá ganhar 1 ponto de reputação.

Editado por Night Wolf
Link para o comentário
Compartilhar em outros sites

Tudo bem, nunca tinha participado deste desafio antes... vamos lá... antes de tudo, quero dizer que ao falar var config.rX eu me refiro ao índice rX da table config, usei var config.rX para evitar ficar muito grande, o mesmo vale para os variantes disto.

 

Esta function countdown(pos) realiza uma contagem regressiva do que o scripter definir na variável tempo até 0 (na tela in game, enquanto no script ele aumenta a var j até chegar no valor tempo) e quando chega a 0 e, ao mesmo tempo, se a posição pos[lugares] estiver disponível, então ele cria o "monstro" (que deve ser colocado o nome no lugar de"Nome monstro") em todas posições da tabela indicada como parâmetro para a função. Lembrando que a contagem in game é feita na mesma pos onde o monstro será criado.

function countdown(pos) -- apenas a ideia, pode ser que isso nao seja a prova de bugs e tenha que ser feito uma versao recursiva.
	for lugares = 1, #pos do
		for j = 0, tempo do
			addEvent(sendTextMessage, 1000 * j, tempo - j, pos[lugares])
			if j == tempo and not check_disponivel(pos) then
				createMonster(pos[lugares], "Nome monstro")
			end
		end
	end
end

Essa function check_disponivel(pos) não entendi direito, creio que seja para checar se a posição está disponível para teleportar o player.

function countdown(pos) -- apenas a ideia, pode ser que isso nao seja a prova de bugs e tenha que ser feito uma versao recursiva.
	for lugares = 1, #pos do
		for j = 0, tempo do
			addEvent(sendTextMessage, 1000 * j, tempo - j, pos[lugares])
			if j == tempo and not check_disponivel(pos) then
				createMonster(pos[lugares], "Nome monstro")
			end
		end
	end
end

A function onStepIn(cid) apenas chama a function fazQualquerCoisa(cid) quando alguém sobe em cima do tile, mandando o uid do player como parâmetro.

function onStepIn(cid)
	fazQualquerCoisa(cid)
return true
end

Agora vamos a function fazQualquerCoisa(cid, i, j), esta função explicarei por partes... vamos lá...

	j = j or 0
	p = i or 0

Se a var j existir, ela recebe o próprio valor ou, caso contrário, ela receberá o valor de 0. Já no caso da var p, se a var i existir, ela recebe o valor de i ou, caso contrário, ela receberá o valor de 0.

	if p > config.rX then
		p = 0
		j = j < config.rY -1 and j + 1 or false
	end

Se a var p for maior do que a var config.rX (acredito que seja o raio em x) então a var p vai receber 0. Depois se a var j for menor ou igual a var config.rY - 1 (acredito que seja o raio em y reduzido em 1), a var j recebe o próprio valor acrescentado de 1, caso contrário recebe o valor booleano false.

	if j then
		posi = {x = pos.x + ( p * config.distX), y = pos.y + (j * config.distY), z = pos.z}
		if check_disponivel(posi) then
			doTeleportThing(cid, posi)
			countdown({{x = posi.x + 1, y = posi.y - 1, z = posi.z}, {x = posi.x - 1 , y = posi.y - 1, z = posi.z}} )
		else
			fazQualquerCoisa(p + 1, j)
		end
	end

Se j existir e não for false (caso não tenha entendido como ele possa ter o valor false, ver explicação anterior), então a var posi vai receber a seguinte posição: coordenada x vai receber a variável pos.x somado da var p vezes a var config.distX (lembrando que irá multiplicar para depois somar). Com a coordenada y vai acontecer a mesma coisa, porém será a var j multiplicado pela config.distY ao invés da var p multiplicada pela var config.distX. A coordenada z vai receber a coordenada z da var pos.

 

Se estiver disponível a pos da var posi (explicado anteriormente na function check_disponivel(posi)) então irá teleportar o player para a posi e executar o countdown (explicado anteriormente). Em countdown({{x = posi.x + 1, y = posi.y - 1, z = posi.z}, {x = posi.x - 1 , y = posi.y - 1, z = posi.z}} ) ele manda para a function countdown as posições superior direita e superior esquerda, respectivamente, de onde o player será teleportado., caso contrário, irá repetir a function fazQualquerCoisa. Nesta parte de repetir a function fazQualquerCoisa eu não entendi, pois ele manda a var p+1 aonde ele recebe o parâmetro cid e o j aonde recebe o parâmetro i, creio que o correto seria fazQualquerCoisa(cid, p + 1, j), mas enfim, o código destrinchado é este, agora vou falar para o que imagino que seja.

 

 

Function fazQualquerCoisa(cid, i, j) completa abaixo:

function fazQualquerCoisa(cid, i, j) -- recursao caudal
	j = j or 0
	p = i or 0
	if p > config.rX then
		p = 0
		j = j < config.rY -1 and j + 1 or false
	end
	if j then
		posi = {x = pos.x + ( p * config.distX), y = pos.y + (j * config.distY), z = pos.z}
		if check_disponivel(posi) then
			doTeleportThing(cid, posi)
			countdown({{x = posi.x + 1, y = posi.y - 1, z = posi.z}, {x = posi.x - 1 , y = posi.y - 1, z = posi.z}} )
		else
			fazQualquerCoisa(p + 1, j)
		end
	end
end

Para o que acho que foi feito este script irei postar em breve, tenho que almoçar primeiro asuhashuasuh.

Link para o comentário
Compartilhar em outros sites

Vamo lá vou chutar não manjo nada de script mais vo tentar, isso faz quando vc pisar em algum tile ele veja se o lugar configurado esteja vazio se sim teleporta o player até lá e sumona algum monstro acho q é isso

Link para o comentário
Compartilhar em outros sites

 

 

creio que o correto seria fazQualquerCoisa(cid, p + 1, j)


você tem razão, é que eu fiz o código correndo porque tinha esquecido disso daqui e acabei esquecendo de passar esse parâmetro. Vou editar, vlw
Link para o comentário
Compartilhar em outros sites

Vamos la, pelo que vi ele roda toda uma area a partir da var pos variando distX em X e distY em y, dentro de um range rX para x e rY para y, a primeura dessas pos onde estiver disponivel para teleportar o player ele teleportará e criará os monstros após a contagem regressiva. Minha opinião é qie este é um script para sala de trainers.

 

Estou no celular pq por algum motivo este tópico não abre no meu pc, se tiver algum erro de digitação releve. E ae, acertei?

Link para o comentário
Compartilhar em outros sites

Ok, mas terei de fazer pelo celular pq no pc n abre este topico n sei pq.

 

 

local config = {

distX=3;

distY=3;

rY=15;

rY=15

 

}

 

local pos = {x=147,y=300,z=7}

 

 

 

 

 

Assim ele rodará uma área de 15 em x e y saindo a partir da pos inicial variando de x em 3 e y em 3. As posiçoes verificadas serao:

 

{x=147,y=300,z=7}

 

{x=147,y=300,z=7}

{x=147,y=300,z=7}

Apertei o responder do celular sem qrer, estou terminando de ppstar as pos

Falei errado e.e o rx e o ry eh o numero de repetiçoes em x e y para achar a pos, eu li o codigo errado antes hahahah e.e tnc

 

Seguindo este exemplo acima as pos serao:

{x =147, y = 300, z = 7}

{x =150, y = 300, z = 7}

{x =153, y = 300, z = 7}

{x =156, y = 300, z = 7}

{x =159, y = 300, z = 7}

{x =162, y = 300, z = 7}

{x =165, y = 300, z = 7}

{x =168, y = 300, z = 7}

{x =171, y = 300, z = 7}

{x =174, y = 300, z = 7}

{x =177, y = 300, z = 7}

{x =180, y = 300, z = 7}

{x =183, y = 300, z = 7}

{x =186, y = 300, z = 7}

{x =189, y = 300, z = 7}

{x =192, y = 300, z = 7}

{x =147, y = 303, z = 7}

{x =150, y = 303, z = 7}

{x =153, y = 303, z = 7}

{x =156, y = 303, z = 7}

{x =159, y = 303, z = 7}

{x =162, y = 303, z = 7}

{x =165, y = 303, z = 7}

{x =168, y = 303, z = 7}

{x =171, y = 303, z = 7}

{x =174, y = 303, z = 7}

{x =177, y = 303, z = 7}

{x =180, y = 303, z = 7}

{x =183, y = 303, z = 7}

{x =186, y = 303, z = 7}

{x =189, y = 303, z = 7}

{x =192, y = 303, z = 7}

{x =147, y = 306, z = 7}

{x =150, y = 306, z = 7}

{x =153, y = 306, z = 7}

{x =156, y = 306, z = 7}

{x =159, y = 306, z = 7}

{x =162, y = 306, z = 7}

{x =165, y = 306, z = 7}

{x =168, y = 306, z = 7}

{x =171, y = 306, z = 7}

{x =174, y = 306, z = 7}

{x =177, y = 306, z = 7}

{x =180, y = 306, z = 7}

{x =183, y = 306, z = 7}

{x =186, y = 306, z = 7}

{x =189, y = 306, z = 7}

{x =192, y = 306, z = 7}

{x =147, y = 309, z = 7}

{x =150, y = 309, z = 7}

{x =153, y = 309, z = 7}

{x =156, y = 309, z = 7}

{x =159, y = 309, z = 7}

{x =162, y = 309, z = 7}

{x =165, y = 309, z = 7}

{x =168, y = 309, z = 7}

{x =171, y = 309, z = 7}

{x =174, y = 309, z = 7}

{x =177, y = 309, z = 7}

{x =180, y = 309, z = 7}

{x =183, y = 309, z = 7}

{x =186, y = 309, z = 7}

{x =189, y = 309, z = 7}

{x =192, y = 309, z = 7}

{x =147, y = 312, z = 7}

{x =150, y = 312, z = 7}

{x =153, y = 312, z = 7}

{x =156, y = 312, z = 7}

{x =159, y = 312, z = 7}

{x =162, y = 312, z = 7}

{x =165, y = 312, z = 7}

{x =168, y = 312, z = 7}

{x =171, y = 312, z = 7}

{x =174, y = 312, z = 7}

{x =177, y = 312, z = 7}

{x =180, y = 312, z = 7}

{x =183, y = 312, z = 7}

{x =186, y = 312, z = 7}

{x =189, y = 312, z = 7}

{x =192, y = 312, z = 7}

{x =147, y = 315, z = 7}

{x =150, y = 315, z = 7}

{x =153, y = 315, z = 7}

{x =156, y = 315, z = 7}

{x =159, y = 315, z = 7}

{x =162, y = 315, z = 7}

{x =165, y = 315, z = 7}

{x =168, y = 315, z = 7}

{x =171, y = 315, z = 7}

{x =174, y = 315, z = 7}

{x =177, y = 315, z = 7}

{x =180, y = 315, z = 7}

{x =183, y = 315, z = 7}

{x =186, y = 315, z = 7}

{x =189, y = 315, z = 7}

{x =192, y = 315, z = 7}

{x =147, y = 318, z = 7}

{x =150, y = 318, z = 7}

{x =153, y = 318, z = 7}

{x =156, y = 318, z = 7}

{x =159, y = 318, z = 7}

{x =162, y = 318, z = 7}

{x =165, y = 318, z = 7}

{x =168, y = 318, z = 7}

{x =171, y = 318, z = 7}

{x =174, y = 318, z = 7}

{x =177, y = 318, z = 7}

{x =180, y = 318, z = 7}

{x =183, y = 318, z = 7}

{x =186, y = 318, z = 7}

{x =189, y = 318, z = 7}

{x =192, y = 318, z = 7}

{x =147, y = 321, z = 7}

{x =150, y = 321, z = 7}

{x =153, y = 321, z = 7}

{x =156, y = 321, z = 7}

{x =159, y = 321, z = 7}

{x =162, y = 321, z = 7}

{x =165, y = 321, z = 7}

{x =168, y = 321, z = 7}

{x =171, y = 321, z = 7}

{x =174, y = 321, z = 7}

{x =177, y = 321, z = 7}

{x =180, y = 321, z = 7}

{x =183, y = 321, z = 7}

{x =186, y = 321, z = 7}

{x =189, y = 321, z = 7}

{x =192, y = 321, z = 7}

{x =147, y = 324, z = 7}

{x =150, y = 324, z = 7}

{x =153, y = 324, z = 7}

{x =156, y = 324, z = 7}

{x =159, y = 324, z = 7}

{x =162, y = 324, z = 7}

{x =165, y = 324, z = 7}

{x =168, y = 324, z = 7}

{x =171, y = 324, z = 7}

{x =174, y = 324, z = 7}

{x =177, y = 324, z = 7}

{x =180, y = 324, z = 7}

{x =183, y = 324, z = 7}

{x =186, y = 324, z = 7}

{x =189, y = 324, z = 7}

{x =192, y = 324, z = 7}

{x =147, y = 327, z = 7}

{x =150, y = 327, z = 7}

{x =153, y = 327, z = 7}

{x =156, y = 327, z = 7}

{x =159, y = 327, z = 7}

{x =162, y = 327, z = 7}

{x =165, y = 327, z = 7}

{x =168, y = 327, z = 7}

{x =171, y = 327, z = 7}

{x =174, y = 327, z = 7}

{x =177, y = 327, z = 7}

{x =180, y = 327, z = 7}

{x =183, y = 327, z = 7}

{x =186, y = 327, z = 7}

{x =189, y = 327, z = 7}

{x =192, y = 327, z = 7}

{x =147, y = 330, z = 7}

{x =150, y = 330, z = 7}

{x =153, y = 330, z = 7}

{x =156, y = 330, z = 7}

{x =159, y = 330, z = 7}

{x =162, y = 330, z = 7}

{x =165, y = 330, z = 7}

{x =168, y = 330, z = 7}

{x =171, y = 330, z = 7}

{x =174, y = 330, z = 7}

{x =177, y = 330, z = 7}

{x =180, y = 330, z = 7}

{x =183, y = 330, z = 7}

{x =186, y = 330, z = 7}

{x =189, y = 330, z = 7}

{x =192, y = 330, z = 7}

{x =147, y = 333, z = 7}

{x =150, y = 333, z = 7}

{x =153, y = 333, z = 7}

{x =156, y = 333, z = 7}

{x =159, y = 333, z = 7}

{x =162, y = 333, z = 7}

{x =165, y = 333, z = 7}

{x =168, y = 333, z = 7}

{x =171, y = 333, z = 7}

{x =174, y = 333, z = 7}

{x =177, y = 333, z = 7}

{x =180, y = 333, z = 7}

{x =183, y = 333, z = 7}

{x =186, y = 333, z = 7}

{x =189, y = 333, z = 7}

{x =192, y = 333, z = 7}

{x =147, y = 336, z = 7}

{x =150, y = 336, z = 7}

{x =153, y = 336, z = 7}

{x =156, y = 336, z = 7}

{x =159, y = 336, z = 7}

{x =162, y = 336, z = 7}

{x =165, y = 336, z = 7}

{x =168, y = 336, z = 7}

{x =171, y = 336, z = 7}

{x =174, y = 336, z = 7}

{x =177, y = 336, z = 7}

{x =180, y = 336, z = 7}

{x =183, y = 336, z = 7}

{x =186, y = 336, z = 7}

{x =189, y = 336, z = 7}

{x =192, y = 336, z = 7}

{x =147, y = 339, z = 7}

{x =150, y = 339, z = 7}

{x =153, y = 339, z = 7}

{x =156, y = 339, z = 7}

{x =159, y = 339, z = 7}

{x =162, y = 339, z = 7}

{x =165, y = 339, z = 7}

{x =168, y = 339, z = 7}

{x =171, y = 339, z = 7}

{x =174, y = 339, z = 7}

{x =177, y = 339, z = 7}

{x =180, y = 339, z = 7}

{x =183, y = 339, z = 7}

{x =186, y = 339, z = 7}

{x =189, y = 339, z = 7}

{x =192, y = 339, z = 7}

{x =147, y = 342, z = 7}

{x =150, y = 342, z = 7}

{x =153, y = 342, z = 7}

{x =156, y = 342, z = 7}

{x =159, y = 342, z = 7}

{x =162, y = 342, z = 7}

{x =165, y = 342, z = 7}

{x =168, y = 342, z = 7}

{x =171, y = 342, z = 7}

{x =174, y = 342, z = 7}

{x =177, y = 342, z = 7}

{x =180, y = 342, z = 7}

{x =183, y = 342, z = 7}

{x =186, y = 342, z = 7}

{x =189, y = 342, z = 7}

{x =192, y = 342, z = 7}

 

 

 

Na proxima vez irei ler sem pressa kkk

Link para o comentário
Compartilhar em outros sites

Pelo que entendi é um script que adiciona o player em uma posição + monstros baseada na quantidade de "salas" disponíveis,



Ou seja, seria como um teleportador de players para trainers, ele vai pegar a quantidade total de salas disponíveis, e vai tentar 1 a 1 usando os cálculos do código, vai contar o tempo configurado no sistema, e depois vai adicionar os monstros.



- Posição da primeira sala



local position = {x = 160, y = 154, z = 7} -- posição do que?

- Começa a verificar cada sala a partir da quantidade de vezes que executou a recursividade, caso encontre uma sala disponível, teleporta o player para ela, e inicia a contagem de tempo e criar os monstros



function fazQualquerCoisa(cid, pos, i, j) -- recursao caudal
j = j or 0
p = i or 0

if p >= config.rX then
p = 0
j = j < config.rY -1 and j + 1 or false
end

if j then
posi = {x = pos.x + ( p * config.distX), y = pos.y + (j * config.distY), z = pos.z}
if check_disponivel(posi) then
doTeleportThing(cid, posi)
countdown({{x = posi.x + 1, y = posi.y - 1, z = posi.z}, {x = posi.x - 1 , y = posi.y - 1, z = posi.z}} )
else
fazQualquerCoisa(cid, pos, p + 1, j)
end
end
end

Verifica a disponibilidade da sala em questão, para saber se já esta ocupada ou não.



function check_disponivel(npos)
if disponivel(npos) then
return true
end
return false
end

Começa a contagem regressiva de ( 5 até 0 ), quando chegar no numero ( 0 Visual no jogo, e 5 no código ), ele cria o monstro verificando se a sala esta ocupada ( para saber se o player ainda esta nela provavelmente )



Editado por BananaFight
Link para o comentário
Compartilhar em outros sites

Você poderia por scripts sem erros, consigo apontar no minimo 5 erros que causariam bugs críticos para esse seu sistema, sem contar que existem jeitos melhores de se aumentarem a performasse do sistema.



Por exemplo:



O que esse sistema faz ?



tabela = {}
local num = 0

for x = 1, 5 do
for y = 1, 5 do
num = num + 1
if (num % 2) ~= 0 then
table.insert(tabela, num)
end
end
end

Editado por BananaFight
Link para o comentário
Compartilhar em outros sites

roda 25 vezes num = num +1 e checa se ele não é divisivel por 2 pra inserí-lo numa tabela.. e isso é só um jeito q eu pensei de fazer esse código, se eu levei mais de 2 minutos escrevendo isso foi muito. Depois qnd eu for passar pra código mesmo eu optimizo laugh.png

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...