Página 1 de 1

Como funciona o choose

Enviado: Sáb Jun 25, 2016 12:07 am
por 7f55842f
Só pra esclarecer, noutro tópico foi dito que:
gabrielsch escreveu:Para complementar as respostas existe uma técnica que é adicionar um choose dentro de um choose, assim:

Código: Selecionar todos

abc = choose(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, choose(15, 16, 17, 18, ...))
e
Markito escreveu:Outro adendo, em GML todas as funções só suportam um máximo de 16 argumentos. Ter esse valor em mente cai mais em conta em funções de argumentos variáveis, como choose, mas o GM também vai dar wrong number of arguments nas funções com número de argumentos menor que 16, pois os argumentos foram declarados no banco de funções.
Ambas são respostas equivocadas, a primeira, pra falar algo assim, não pode ter conhecimento algum em probabilidade, quando você coloca um choose, dentro de outro, a chance dos eventos do segundo choose ficam desfavorecidas (salvo se o programador fizer isso propositalmente), vou explicar porque:
Imagina uma situação, onde você tem 5 possíveis inimigos, que podem ser sorteados aleatoriamente pelo jogo, então podemos usar:
instance_create(x,y,choose(ob_inimigo1,ob_inimigo2,ob_inimigo3,ob_inimigo4,ob_inimigo5))

A chance de qualquer um desses objetos serem criados, é de 1 em 5, ou seja, se eu quiser que o ob_inimigo3 por exemplo, apareça, é necessário repetir pelo menos 5 vezes o sorteio.

Bom, já quando tem um choose, dentro de outro, assim (vou usar números pra ficar mais simples de entender):
var sorteio = choose(0,1,2,3,4,5,6,7,8,choose(9,10,11,12))

A chance dos números de 0 a 8 sair, é de 1 em 10, pois tem 10 elementos a serem sorteados, porém o número 9 por exemplo, precisa ser escolhido no primeiro sorteio, para então executar um novo sorteio com 4 possibilidades, multiplicando a dificuldade do sorteio do primeiro, que é 10, ou seja, 1 em 40, então os números do segundo choose se torna muito mais difícil de ocorrer, em um jogo por exemplo, isso pode ser intencional (como um inimigo mais raro, que não pode aparecer com a mesma frequência dos demais, ou itens, powerups etc), então, caso queira que haja a mesma chance entre os sorteios, tem que usar um array (como foi dito pelo Thyago, no mesmo tópico).

A segunda resposta é ainda mais absurda, fica subentendido que todas as funções (com argumentos variáveis???? ou não???) precisam ter 16 argumentos ou vai dar erro, não entendi mesmo, de fato todas as funções do Game Maker, só suportam 16 argumentos no máximo, mas as funções podem ter menos argumentos sim, sem que isso dê algum erro, salvo no caso que são argumentos indispensáveis, como o instance_create, que pede 3 informações: x, y e o objeto, dai não tem como não colocar uma delas, inclusive se criar um script, é possível coletar apenas 16 variáveis (através das variáveis argument0 até argument15).

Enfim é isso ai, só queria corrigir isso, me senti incomodado. Flw!

Re: Como funciona o choose

Enviado: Sáb Jun 25, 2016 12:14 am
por Markito
Acho que formulei mal minha resposta, peço desculpas. O que quis dizer foi o que você falou, que as funções podem ter no máximo 16 argumentos, uma limitação interna da GML, mas como a lista das funções estão declaradas no arquivo fnames, o GM tem como determinar a quantidade de argumentos das funções com argumentos fixos e informar se todos foram preenchidos, passaram da conta, ou estão em falta.

Bacana você ter apontado isso cara, valeu mesmo :)

Re: Como funciona o choose

Enviado: Sáb Jun 25, 2016 1:07 am
por chicoweb
Nossa que informação importante!

Eu nunca tinha pensado em usar o choose assim, dentro de outro, isso pouparia argumentos mesmo.
Por exemplo tenho quatro inimigos, o 1 e o mais fraco e tem que aparecer mais vezes, o 4 é o mais forte e tem aparecer pouco, então eu fazia algo do tipo:
 

Código: Selecionar todos

choose(1,1,1,1,1,2,2,2,2,3,3,3,4,4)

Já queimaria 14 argumentos.Mas desse jeitoaí era só colocar:

Código: Selecionar todos

choose( choose(1), choose(1,2), choose(1,2,3), choose(1,2,3,4) )

As probabilidades eu não calculei acho que nao seria as mesmas mas atenderia o objetivo do sorteio.
Seria isso mesmo ou eu viajei bonito aqui :ué:?

Re: Como funciona o choose

Enviado: Sáb Jun 25, 2016 1:44 am
por Ark
choose e bom, mais eu acho que nessa de respaw de inimigo e mais facil trabalhar com probabilidade, se o 1 tem que aparecer mais, acho que tem que fazer um sistema de nivel interno , e a cada evolução de nível acrescentar inimigo mais forte, fazer um array com inimigos pre-determinado, e a cada evolução de nivel interno tem a probabilidade de aparecer inimigos mais fortes 

Re: Como funciona o choose

Enviado: Sáb Jun 25, 2016 2:44 am
por gabrielsch
Sobre o número de argumentos abordado pelo Markito:
O número máximo de argumentos que um método suporta em GML é 16, isso não quer dizer que ele necessariamente tenha que ter todos os argumentos preenchidos (uma função com até 5 argumentos pode ter 3 por exemplo). 

Me lembro disso ter causado bastante problema quando projetos eram passados de GM8 para GMS pois a versão Studio trabalha essa parte de forma diferente, argumentos não preenchidos eram considerados como 0 (zero).

É possível acessar os valores dos argumentos passados para a função de duas formas, a primeira é usando as variáveis build-ins que é oferecida como argument0argument1argument2 etc. A segunda é utilizando a variável argument, que é nada mais nada menos que um vetor, dessa forma: argument[0], argument[1], argument[2] etc.
Eu recomendo fortemente o uso da segunda maneira pois dessa forma é possível criar funções com número de argumentos variáveis em conjunto com outra variável para controlar o numero de argumentos passados (argument_count), esse é um exemplo de função com argumentos variáveis:
[codigo=gml]if argument_count > 1[/font]
{
    show_message(argument0 + argument1)   
} else
{
    show_message(argument0)    
}[/codigo]
Outro cenário que eu particularmente utilizo e acho extremamente útil é em laços, desse jeito por exemplo:
[codigo=gml]var text = '';[/font]
for (i=0; i<argument_count; i+=1)
{
    text += argument    
};
show_message(text)[/codigo]
O script acima permite entrar com quantos argumentos forem necessários (até 16 é claro) e a mensagem será gerada no laço for e exibida posteriormente.

Sobre o problema de probabilidade em usar choose dentro de outro choose:
Quando eu postei a resposta pensei justamente nesse ponto, como uma resposta válida já tinha sido dada e o autor teve o problema resolvido, não achei importante editar a minha para explicar. Vou aproveitar que você passou por todos esse trabalho de criar uma conta com nome aleatório e dar essa "incrível aula de probabilidade" e adicionar um link para esse tópico na minha resposta.

Re: Como funciona o choose

Enviado: Sáb Jun 25, 2016 7:59 am
por 7f55842f
chicoweb escreveu:(...) Por exemplo tenho quatro inimigos, o 1 e o mais fraco e tem que aparecer mais vezes, o 4 é o mais forte e tem aparecer pouco, então eu fazia algo do tipo:
 
choose(1,1,1,1,1,2,2,2,2,3,3,3,4,4)

Já queimaria 14 argumentos.Mas desse jeitoaí era só colocar:

choose( choose(1), choose(1,2), choose(1,2,3), choose(1,2,3,4) )
O princípio é o mesmo, no primeiro exemplo, o universo de possibilidade é 14 e dada a repetição dos elementos, a probabilidade de cada um seria

1 - 5 em 14 - 35,72%
2 - 4 em 14 (ou 2 em 7) - 28,57%
3 - 3 em 14 - 21,42%
4 - 2 em 14 (ou 1 em 7) - 14,29%

No exemplo que eu dei, não tem elementos repetindo, a permuta é somada quando os elementos se repetem (e multiplicada a cada sorteio adicional), é o velho caso do João, que tem 5 camisetas de cores diferentes e 4 bermudas, quantas combinações João tem de roupas? 5x4 = 20 (na verdade a fórmula é 5!/(4-1)!, que na realidade vai dar no mesmo, depois de simplificar).
No seu segundo exemplo:

choose(1, choose(1,2), choose(1,2,3), choose(1,2,3,4))

Vemos que o número 1, repete em todas possibilidades do sorteio, a quantidade total de possibilidades (universo), é 1 x 2 x 3 x 4 = 24, então a probabilidade do 1 ser sorteada é 4 em 24 (ou 1 em 6), já o 2 e o 3 possuem a mesma chance: 3 em 24 (ou 1 em 8 ), e o 4 é o número menos favorecido, pois só aparece 1 única vez, num universo de 24 sorteios, com a chance de 1 em 24 (míseros 4,17% de chance), nesse segundo caso o número 4 tem uma chance muito menor que o outro, esse tipo de sorteio é extremamente fácil de perder do controle.

Claro que existe uma forma melhor de controlar a chance de dado evento acontecer, por exemplo, eu crio uma variável ("chance" por exemplo), ele nela eu randomizo um número inteiro de 0 a 100), para um item "ultra mother fucker rare", com 1% de chance de aparecer, basta fazer um if, algo assim

chance = irandom(100);
if chance <= 1 { instance_create(x,y,item_foda) }

E olha que legal, pra deixar o jogo mais fácil ou mais difícil, basta alterar o valor do aleatório (se diminuir a chance de itens mais raros aumenta e vice versa). :)

Re: Como funciona o choose

Enviado: Sex Dez 02, 2016 8:30 am
por Eddy
meu....

desculpa reviver o tópico, mas andei pesquisando por probabilidade e encontrei esse tópico que me ajudou bastante em conjunto com outro do forum antigo.
Mas precisava de uma ajuda.
o que preciso é referente ao ataque do personagem
situação: o personagem tem o ataque normal, mas tem uma chance de 30% para realizar um ataque critico.
sendo assim a logica ficaria assim?

normal=100
critical=30
chance = irandom(100); //se usar o random (sem "i" não seria melhor?)
if chance <= 30 
{ var_ataque=2 }
else
{var_ataque=1} // no caso eu setarei um script com var_ataque sendo que var_ataque multiplicaria por 2 o ataque

desculpa os erros de comando, mas minha área é mais a arte gráfica, porém quando posso me meto na programação kkkk

Re: Como funciona o choose

Enviado: Seg Dez 05, 2016 12:49 pm
por Lima Loucão
Eddy, o irandom trabalha com números inteiros, por isso, em questão de chances, deve-se usa-lo, pois se você usar random(100) seria neste caso: 1,01 1,02 e assim por diante... Abraço.

Re: Como funciona o choose

Enviado: Ter Dez 06, 2016 8:50 am
por Eddy
Opa
vlw obrigado!
Mas queria saber se esse código iria funcionar bem, se não ficaria muito "pesado", pense que a cada ataque ele vai calcular essa chance... digamos que esse calculo vai ser mais de uma vez por segundo

Re: Como funciona o choose

Enviado: Ter Dez 06, 2016 12:44 pm
por Lima Loucão
Acho que o mais fácil neste seu caso é usar assim:
if irandom(100)<=critical_chance
{
//ataque critico
}
else
{
//ataque normal
}

Re: Como funciona o choose

Enviado: Ter Dez 06, 2016 1:14 pm
por Eddy
hmmm
boa vou usar isso mesmo

Obrigado!