Página 1 de 8

10. Exercício #1

Enviado: 19 Mai 2018, 20:21
por Junior_Djjr
Imagem
(english)

Antes de prosseguir no tutorial, é importante que você realmente tenha aprendido tudo o que foi feito até agora.

Eu defendo o grande uso da prática durante o aprendizado de programação, pois não é só lendo que se aprende, você também precisa colocar a mão na massa após ler! (mas não antes de ler! Calma...)

Devido ao sucesso — e boa ideia — do exercício do tutorial de Sanny Builder do LINK/2012, eu irei repassar o mesmo exercício aqui em forma de GTA3script.



Exercício
  
Faça com que 5 variáveis iniciadas com valores aleatórios fiquem com o valor "12".



Regras
Você deve iniciar o script usando o seguinte comando:

Código: Selecionar tudo

GENERATE_RANDOM_INT_IN_RANGE 0 100 var1
Em todas as 5 variáveis. Assim, todas as variáveis terão um valor aleatório entre 0 e 99, e você não sabe qual valor!

Você terá que fazer com que todas as 5 variáveis fiquem com valor "12", e para isso, você terá que usar condições e operações matemáticas.

Não jogue dados! Não fique rodando o comando para gerar o número aleatório até que a variável seja "12". Isto é jogar 1 (ou 5) dado de 100 lados! Pode demorar para dar 12, e este não é o desafio deste tutorial, o desafio deste tutorial é usar condições e matemática para o número ser 12, e não tirar a sorte, pois tirar a sorte pode consumir muito CPU/tempo.

É óbvio que você não poderá fazer nada assim:

Código: Selecionar tudo

var1 = 12
Tente usar o que você aprendeu nas últimas partes do tutorial! Controle os valores.

Quando todas as 5 variáveis serem "12", mostre na tela o valor de todas elas usando o seguinte comando:

Código: Selecionar tudo

PRINT_FORMATTED_NOW "Todas as variaveis sao 12: %i %i %i %i %i" 10000 var1 var2 var3 var4 var5

Coisas do tipo "comando para ativar, voltar e poder ativar de novo" são opcionais mas recomendados que você faça.
Você pode em seguida (após ter terminado o desafio) abrir os spoilers de dicas abaixo e ver um código já pronto, para ter novas ideias de como poderia ser feito etc.


Vamos ao trabalho!


Dúvidas?
Abra os spoilers abaixo para receber dicas. Quanto mais spoilers abrir, mais você vai tendo respostas, e no último spoiler você terá o código pronto.
Portanto, evite ao máximo abrir os spoilers abaixo. Tente fazer sozinho! Mas se tiver dúvidas, abra:

SpoilerAbrir
Há uma infinidade de maneiras de fazer isso, uma delas é checar o valor da variável e abaixar ou subir até que fique "12".

SpoilerAbrir
Por exemplo, faça um loop checando se o valor da variável é "12", e se não for, você checa se é acima ou abaixo de "12". Se for abaixo, aumente, e se for acima, diminua!

SpoilerAbrir
O exemplo que eu disse seria escrito desta forma:

Código: Selecionar tudo

IF NOT var1 = 12
    IF var1 > 12
        var1 -= 1
    ELSE
        var1 += 1
    ENDIF
ENDIF
Ou com o uso do WHILE em vez do IF. ("enquanto não é 12")

SpoilerAbrir
Rode isso repetindo o mesmo para todas as variáveis, e no fim, cheque se todas as variáveis ficaram "12" e mostre na tela e pare o script.

No próximo spoiler você terá o script pronto, incluindo variações:

SpoilerAbrir
Este é um script simples de ter imaginado:

SpoilerAbrir

Código: Selecionar tudo

SCRIPT_START
{
NOP

WAIT 2000

LVAR_INT var1 var2 var3 var4 var5

GENERATE_RANDOM_INT_IN_RANGE 0 100 var1
GENERATE_RANDOM_INT_IN_RANGE 0 100 var2
GENERATE_RANDOM_INT_IN_RANGE 0 100 var3
GENERATE_RANDOM_INT_IN_RANGE 0 100 var4
GENERATE_RANDOM_INT_IN_RANGE 0 100 var5

main_loop:
WAIT 0

IF NOT var1 = 12
   IF var1 > 12
       var1 -= 1
   ELSE
       var1 += 1
   ENDIF
ENDIF

IF NOT var2 = 12
   IF var2 > 12
       var2 -= 1
   ELSE
       var2 += 1
   ENDIF
ENDIF

IF NOT var3 = 12
   IF var3 > 12
       var3 -= 1
   ELSE
       var3 += 1
   ENDIF
ENDIF

IF NOT var4 = 12
   IF var4 > 12
       var4 -= 1
   ELSE
       var4 += 1
   ENDIF
ENDIF

IF NOT var5 = 12
   IF var5 > 12
       var5 -= 1
   ELSE
       var5 += 1
   ENDIF
ENDIF

IF var1 = 12
AND var2 = 12
AND var3 = 12
AND var4 = 12
AND var5 = 12
   PRINT_FORMATTED_NOW "Todas as variaveis sao 12: %i %d %i %i %i" 10000 var1 var2 var3 var4 var5
   TERMINATE_THIS_CUSTOM_SCRIPT
ENDIF

GOTO main_loop
}
SCRIPT_END

O problema dele é que ele fica rodando tudo isso caso alguma variável não seja 12, assim deixando o script muito "lento".

Aqui, parecido, mas em vez de um loop com vários IF, usaremos um loop em cada variável, usando WHILE:

SpoilerAbrir

Código: Selecionar tudo

SCRIPT_START
{
NOP

WAIT 2000

LVAR_INT var1 var2 var3 var4 var5

GENERATE_RANDOM_INT_IN_RANGE 0 100 var1
GENERATE_RANDOM_INT_IN_RANGE 0 100 var2
GENERATE_RANDOM_INT_IN_RANGE 0 100 var3
GENERATE_RANDOM_INT_IN_RANGE 0 100 var4
GENERATE_RANDOM_INT_IN_RANGE 0 100 var5

WHILE NOT var1 = 12
   IF var1 > 12
       var1 -= 1
   ELSE
       var1 += 1
   ENDIF
ENDWHILE

WHILE NOT var2 = 12
   IF var2 > 12
       var2 -= 1
   ELSE
       var2 += 1
   ENDIF
ENDWHILE

WHILE NOT var3 = 12
   IF var3 > 12
       var3 -= 1
   ELSE
       var3 += 1
   ENDIF
ENDWHILE

WHILE NOT var4 = 12
   IF var4 > 12
       var4 -= 1
   ELSE
       var4 += 1
   ENDIF
ENDWHILE

WHILE NOT var5 = 12
   IF var5 > 12
       var5 -= 1
   ELSE
       var5 += 1
   ENDIF
ENDWHILE

PRINT_FORMATTED_NOW "Todas as variaveis sao 12: %i %i %i %i %i" 10000 var1 var2 var3 var4 var5
}
SCRIPT_END

Este é muito legal e o resultado é instantâneo. A leitura do código também é boa: "enquanto não é 12, checa se é maior que 12, e se for, diminua, se não for, então aumente". No fim, nós temos certeza que todas são 12! É só mostrar na tela e fim.

Se você ter um pensamento mais matemático, faria assim:

SpoilerAbrir

Código: Selecionar tudo

SCRIPT_START
{
NOP

LVAR_INT var1 var2 var3 var4 var5
LVAR_INT diferenca

GENERATE_RANDOM_INT_IN_RANGE 0 100 var1
GENERATE_RANDOM_INT_IN_RANGE 0 100 var2
GENERATE_RANDOM_INT_IN_RANGE 0 100 var3
GENERATE_RANDOM_INT_IN_RANGE 0 100 var4
GENERATE_RANDOM_INT_IN_RANGE 0 100 var5

diferenca = var1 - 12
var1 -= diferenca

diferenca = var2 - 12
var2 -= diferenca

diferenca = var3 - 12
var3 -= diferenca

diferenca = var4 - 12
var4 -= diferenca

diferenca = var5 - 12
var5 -= diferenca

PRINT_FORMATTED_NOW "Todas as variaveis sao 12: %i %i %i %i %i" 10000 var1 var2 var3 var4 var5
}
SCRIPT_END

Na qual realmente é muito interessante. Não usou condições como foi pedido, mas o que importa é que ficou legal e muito veloz (este exemplo tem baixíssimo uso de CPU).

Você não sabe ainda, mas usar arrays também é uma ótima. Você aprenderá a usar arrays logo-logo e pode querer refazer este exercício!


Eaí? Conseguiu fazer? Responda esse tópico mostrando como você fez esse código! Use a tag [spoiler] para enviar o código na mensagem:

Imagem

Em WYSIWYG fica assim:
Imagem

Se você não conseguiu fazer o exercício ou precisou das dicas acima para conseguir, possivelmente você precisa reler o tutorial inteiro ou algumas partes que você acha que não entendeu bem e que está com dificuldades.

Evite prosseguir o tutorial com falta de conhecimento pois é sempre bom ir devagar conhecendo cada pedaço do caminho para não se perder — ao invés de sair correndo.


Próxima parte:
11. Comandos e argumentos

10. Exercício #1

Enviado: 09 Jun 2018, 16:23
por thiagoD
SpoilerAbrir

Código: Selecionar tudo

SCRIPT_START
{
NOP

LVAR_INT var var1 var2 var3 var4 diferenca
GENERATE_RANDOM_INT_IN_RANGE 0 100 var
GENERATE_RANDOM_INT_IN_RANGE 0 100 var1
GENERATE_RANDOM_INT_IN_RANGE 0 100 var2
GENERATE_RANDOM_INT_IN_RANGE 0 100 var3
GENERATE_RANDOM_INT_IN_RANGE 0 100 var4

IF NOT var = 12
IF var > 12
diferenca = var - 12
var -= diferenca
ELSE
diferenca = 12 - var
var += diferenca
ENDIF
ENDIF
IF NOT var1 = 12
IF var1 > 12
diferenca = var1 - 12
var1 -= diferenca
ELSE
diferenca = 12 - var1
var1 += diferenca
ENDIF
ENDIF
IF NOT var2 = 12
IF var2 > 12
diferenca = var2 - 12
var2 -= diferenca
ELSE
diferenca = 12 - var2
var2 += diferenca
ENDIF
ENDIF
IF NOT var3 = 12
IF var3 > 12
diferenca = var3 - 12
var3 -= diferenca
ELSE
diferenca = 12 - var3
var3 += diferenca
ENDIF
ENDIF
IF NOT var4 = 12
IF var4 > 12
diferenca = var4 - 12
var4 -= diferenca
ELSE
diferenca = 12 - var4
var4 += diferenca
ENDIF
ENDIF
PRINT_FORMATTED_NOW "Todos 12: %i %i %i %i %i" 2787 var var1 var2 var3 var4
}
SCRIPT_END​​​

10. Exercício #1

Enviado: 10 Jun 2018, 04:18
por Junior_Djjr
Tá nice, só que nesse caso poderia ser feito simplesmente como o último script das dicas do tutorial. Dê uma olhada lá, muita coisa que você fez na verdade é desnecessário.

10. Exercício #1

Enviado: 14 Jun 2018, 13:48
por Saudoso
Cara, não tava conseguindo fazer pois tava fazendo com IF e esquecendo de colocar isso aqui no final:

Código: Selecionar tudo

[code]IF var1 = 12
AND var2 = 12
AND var3 = 12
AND var4 = 12
AND var5 = 12
[/code]
Eu já ia direto pro "PRINT_FORMATED_NOW"

Então eu já tava quebrando a cabeça aqui e pensei, "ah vou abrir o spoiler, fazer oq"

Ai eu vi que dava pra usar o WHILE :ayfkm:

Fico triste de ter que precisar da ajuda do spoiler pra conseguir o resultado final, mas fazer oq, as vezes a gente precisa de um empurrãozinho né?

Enfim, no final ficou assim:

SpoilerAbrir

Código: Selecionar tudo

[color=#569cd6]SCRIPT_START[/color][color=#d4d4d4]{[/color][color=#569cd6]NOP[/color] [color=#569cd6]    LVAR_INT[/color][color=#d4d4d4] var1 var2 var3 var4 var5[/color] [color=#569cd6]GENERATE_RANDOM_INT_IN_RANGE[/color][color=#d4d4d4] [/color][color=#b5cea8]0[/color][color=#d4d4d4] [/color][color=#b5cea8]100[/color][color=#d4d4d4] var1[/color][color=#569cd6]GENERATE_RANDOM_INT_IN_RANGE[/color][color=#d4d4d4] [/color][color=#b5cea8]0[/color][color=#d4d4d4] [/color][color=#b5cea8]100[/color][color=#d4d4d4] var2[/color][color=#569cd6]GENERATE_RANDOM_INT_IN_RANGE[/color][color=#d4d4d4] [/color][color=#b5cea8]0[/color][color=#d4d4d4] [/color][color=#b5cea8]100[/color][color=#d4d4d4] var3[/color][color=#569cd6]GENERATE_RANDOM_INT_IN_RANGE[/color][color=#d4d4d4] [/color][color=#b5cea8]0[/color][color=#d4d4d4] [/color][color=#b5cea8]100[/color][color=#d4d4d4] var4[/color][color=#569cd6]GENERATE_RANDOM_INT_IN_RANGE[/color][color=#d4d4d4] [/color][color=#b5cea8]0[/color][color=#d4d4d4] [/color][color=#b5cea8]100[/color][color=#d4d4d4] var5[/color] [color=#569cd6]WHILE NOT[/color][color=#d4d4d4] var1 = [/color][color=#b5cea8]12[/color][color=#569cd6]IF[/color][color=#d4d4d4] var1 > [/color][color=#b5cea8]12[/color][color=#d4d4d4]       var1 -= [/color][color=#b5cea8]1[/color][color=#569cd6]   ELSE[/color][color=#d4d4d4]       var1 += [/color][color=#b5cea8]1[/color][color=#569cd6]   ENDIF[/color][color=#569cd6]ENDWHILE[/color] [color=#569cd6]WHILE NOT[/color][color=#d4d4d4] var2 = [/color][color=#b5cea8]12[/color][color=#569cd6]IF[/color][color=#d4d4d4] var2 > [/color][color=#b5cea8]12[/color][color=#d4d4d4]       var2 -= [/color][color=#b5cea8]1[/color][color=#569cd6]   ELSE[/color][color=#d4d4d4]       var2 += [/color][color=#b5cea8]1[/color][color=#569cd6]   ENDIF[/color][color=#569cd6]ENDWHILE[/color] [color=#569cd6]WHILE NOT[/color][color=#d4d4d4] var3 = [/color][color=#b5cea8]12[/color][color=#569cd6]IF[/color][color=#d4d4d4] var3 > [/color][color=#b5cea8]12[/color][color=#d4d4d4]       var3 -= [/color][color=#b5cea8]1[/color][color=#569cd6]   ELSE[/color][color=#d4d4d4]       var3 += [/color][color=#b5cea8]1[/color][color=#569cd6]   ENDIF[/color][color=#569cd6]ENDWHILE[/color] [color=#569cd6]WHILE NOT[/color][color=#d4d4d4] var4 = [/color][color=#b5cea8]12[/color][color=#569cd6]IF[/color][color=#d4d4d4] var4 > [/color][color=#b5cea8]12[/color][color=#d4d4d4]       var4 -= [/color][color=#b5cea8]1[/color][color=#569cd6]   ELSE[/color][color=#d4d4d4]       var4 += [/color][color=#b5cea8]1[/color][color=#569cd6]   ENDIF[/color][color=#569cd6]ENDWHILE[/color] [color=#569cd6]WHILE NOT[/color][color=#d4d4d4] var5 = [/color][color=#b5cea8]12[/color][color=#569cd6]IF[/color][color=#d4d4d4] var5 > [/color][color=#b5cea8]12[/color][color=#d4d4d4]       var5 -= [/color][color=#b5cea8]1[/color][color=#569cd6]   ELSE[/color][color=#d4d4d4]       var5 += [/color][color=#b5cea8]1[/color][color=#569cd6]   ENDIF[/color][color=#569cd6]ENDWHILE[/color] [color=#569cd6]PRINT_FORMATTED_NOW[/color][color=#d4d4d4] [/color][color=#ce9178]"Conseguiii ae: %i %i %i %i %i"[/color][color=#d4d4d4] [/color][color=#b5cea8]10000[/color][color=#d4d4d4] var1 var2 var3 var4 var5[/color] [color=#d4d4d4]}[/color] [color=#569cd6]SCRIPT_END[/color]

Espero ter mais êxito no futuro, não achei que fui bem nisso, basicamente essa parte do meio foi copiada, só fiz o inicio e o fim, acho que preciso de bastante exercício pra isso entrar na minha cabeça :peepo8: , mas no fim das contas foi bem divertido!

Adicionado após 6 minutos 11 segundos:
Imagem

Por que diabos isso ta assim?

10. Exercício #1

Enviado: 14 Jun 2018, 22:28
por Junior_Djjr
Quando você copia e cola algo o editor coloca automaticamente a formatação do texto (com cores e tal), você não pode colar cores no código, tem que usar "Colar texto sem formatação" do navegador, ou o botão de código.

10. Exercício #1

Enviado: 16 Jun 2018, 11:44
por Saudoso
Junior_Djjr escreveu:
14 Jun 2018, 22:28
tem que usar "Colar texto sem formatação" do navegador
Ah saquei, mas eu já apaguei o bagulho ashaushua, acho q não vale a pena refazer já que tenho "o gabarito".

10. Exercício #1

Enviado: 16 Jun 2018, 13:30
por Um_Geek
Para o pessoal que estiver lendo o tutorial, mas interessados em depois passar para Lua. Em lua não tem o comando generateRandomIntRange, mas tem outras formas. Aqui um exemplo simples sem usar qualquer require. Da para fazer de outras formas, depende do conhecimento da pessoa em lua, matematica e criatividade.

SpoilerAbrir

Código: Selecionar tudo

function main()
	local MaxBalls = 5; -- definir quantos numeros tem no sorteio;
	local go_to_number = 12;
	math.randomseed(getGameTimer());
	while true do
		while not testCheat("GO") do wait(80) end;
		-- gerar numeros aleatorios entre 1 e 100;
		local Balls = {};
		for i = 1, MaxBalls do  
			local rnd = math.random(1, 100);
			Balls[#Balls+1] = rnd;
		end 
		while not testCheat("END") do
			local Points = 0;
			local text = "";
			for i = 1, MaxBalls do 
				-- todos para 12
				if Balls[i] > go_to_number then 
					Balls[i] = Balls[i] - 1;				
				elseif Balls[i] < go_to_number then 
					Balls[i] = Balls[i] + 1;
				elseif Balls[i] == go_to_number then
					Points = Points + 1;
				end
				text = "[~y~".. Balls[i] .. "~w~]" .. text;
			end
			printStringNow("Pontos: [ " .. Points .. " ]~n~Numeros: " .. text, 2000);
			if Points >= MaxBalls then break end; -- se todos numeros for 12 encerrar o sorteio.
			wait(0);
		end 
		wait(5);
	end
end
*correções

10. Exercício #1

Enviado: 16 Jun 2018, 17:18
por Junior_Djjr

Código: Selecionar tudo

math.randomseed(getGameTimer());
Não use isto em loop, só precisa usar uma vez em todo o jogo.

10. Exercício #1

Enviado: 16 Jun 2018, 18:50
por Um_Geek
Corrigido.
Com um pouco mais de matemática :peepo7:

Para moonloader

Código: Selecionar tudo

function main()
	math.randomseed(os.clock());
	
	local X = {};
	
	for i = 1, 5 do 
		X[i] = math.random(1, 100);
	end
	
	while not isButtonPressed(PLAYER_HANDLE, 15) do -- botão entrar em veiculo
		printStringNow(string.format('~p~%i %i %i %i %i',X[1],X[2],X[3],X[4],X[5]),1000);
		wait(0);
	end
	while isButtonPressed(PLAYER_HANDLE, 15) do wait(0) end;
	
	for i = 1, 5 do 
		X[i] = X[i] * (12 / X[i]); 
	end	
	
	while not isButtonPressed(PLAYER_HANDLE, 15) do -- botão entrar em veiculo
		printStringNow(string.format('~y~%i %i %i %i %i',X[1],X[2],X[3],X[4],X[5]),1000);
		wait(0);
	end
end
**simplificado

10. Exercício #1

Enviado: 16 Jun 2018, 19:29
por Junior_Djjr
Matemática legal, não sabia disso :peepo1:
 

10. Exercício #1

Enviado: 25 Jun 2018, 23:20
por Moreno_Sensual
SpoilerAbrir
 

Código: Selecionar tudo

SCRIPT_START
{
NOP

WAIT 1000

LVAR_INT var1 var2 var3 var4 var5

GENERATE_RANDOM_INT_IN_RANGE 0 100 var1
GENERATE_RANDOM_INT_IN_RANGE 0 100 var2
GENERATE_RANDOM_INT_IN_RANGE 0 100 var3
GENERATE_RANDOM_INT_IN_RANGE 0 100 var4
GENERATE_RANDOM_INT_IN_RANGE 0 100 var5

main_loop:
WAIT 0 

IF NOT var1 = 12
    IF var1 > 12
        var1 -=1
    ELSE   
        var1 +=1
    ENDIF
ENDIF

IF NOT var2 = var1
    IF var2 > var1
        var2 -= 1
    ELSE
        var2 += 1
    ENDIF
ENDIF

WHILE NOT var3 = var1
    IF var3 > var1
        var3 -= 1
    ELSE
        var3 +=1
    ENDIF
ENDWHILE

IF NOT var4 = 12    
    IF var4 > 12
        var4 -= 1
    ELSE    
        var4 += 1
    ENDIF
ENDIF

IF NOT var5 = var1
    IF var5 > var1
        var5 -= 1
    ELSE
        var5 += 1
    ENDIF
ENDIF

IF var1 = 12
AND var2 = 12
AND var3 = 12
AND var4 = 12
AND var5 = 12
    PRINT_FORMATTED_NOW "Todas as variaveis sao 12: %i %i %i %i %i" 10000 var1 var2 var3 var4 var5
ENDIF

GOTO main_loop

}
SCRIPT_END

10. Exercício #1

Enviado: 26 Jun 2018, 06:46
por Junior_Djjr
Prefira usar o WHILE em vez do IF. O seu script irá rodar dezenas de vezes o loop até conseguir, pode demorar mais de 1 segundo para dar resultado.

10. Exercício #1

Enviado: 26 Jun 2018, 12:09
por Moreno_Sensual
Se eu usasse While eu não precisaria de um main_loop?

10. Exercício #1

Enviado: 26 Jun 2018, 12:15
por Junior_Djjr
Moreno_Sensual escreveu: Se eu usasse While eu não precisaria de um main_loop?
É, seria um resultado instantâneo, nem de WAIT precisaria.

10. Exercício #1

Enviado: 26 Jun 2018, 13:08
por Moreno_Sensual
Ok,obrigado