10. Exercício #1
Enviado: 19 Mai 2018, 20:21
Tópico antigo: http://brmodstudio.forumeiros.com/t5989-10-exercicio-1

(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 var1Você 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 = 12Quando 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 var5Coisas 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:
Ou com o uso do WHILE em vez do IF. ("enquanto não é 12")
Código: Selecionar tudo
IF NOT var1 = 12
IF var1 > 12
var1 -= 1
ELSE
var1 += 1
ENDIF
ENDIFSpoilerAbrir
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:
No próximo spoiler você terá o script pronto, incluindo variações:
SpoilerAbrir
Este é um script simples de ter imaginado:
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:
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:
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!
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_ENDO 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_ENDEste é 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_ENDNa 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:
Em WYSIWYG fica assim:

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
