[DÚVIDA RAPIDA] condição para determinar valores diferente nas variaveis

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

40% [DÚVIDA RAPIDA] condição para determinar valores diferente nas variaveis

Mensagem por Adriano Heartless em Ter 20 Mar 2012, 18:00

Olááá pessoal XD
Bom estou precisando de uma ajudinha aqui porque to batendo cabeça. Não sou muito experiente em GML mas acredito que não deve ser dificil isso que vou perguntar =/

Bom, eu tenho 4 variaveis ( na verdade são 20 mas vamos comçar co 4 )

item_1= obj_caixa

item_2= obj_morango

item_3= obj_banana

item_4= obj_arroz

até ai tudo bem...agora quero embaralhar esses itens aleatoriamente e colocar em uma das 4 posições que inventei vamos lá

// SORTEIANDO
evento alarm[1]
posicao_1= choose(item_1,item_2,item_3,item_4)
posicao_2= choose(item_1,item_2,item_3,item_4)
posicao_3= choose(item_1,item_2,item_3,item_4)
posicao_4= choose(item_1,item_2,item_3,item_4)



Bom a minha dúvida está exatamente ai.....as variaveis posicao não podem ser iguais..eu queria saber como fazer assim por exemplo

SE AS 4 VARIAVEIS "posicao" tiver valores iguais então começa alarm[1] novamente até as 4 ficarem diferente





Última edição por Adriano Heartless em Seg 26 Mar 2012, 16:37, editado 1 vez(es)

Adriano Heartless

Número de Mensagens : 95
Idade : 27
Data de inscrição : 12/02/2011
Reputação : 2
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

http://ganelse.blogspot.com.br/

Voltar ao Topo Ir em baixo

40% Re: [DÚVIDA RAPIDA] condição para determinar valores diferente nas variaveis

Mensagem por Zero. em Ter 20 Mar 2012, 19:02

cara vc pode fazer assim
irandom(4)=variavel
if irandom=1
{
//tal coisa acontece
}

se vc usar choose o choose pode escolher mais de um.

Duvida questione novamente.

Zero.

Número de Mensagens : 1295
Idade : 20
Data de inscrição : 19/08/2010
Reputação : 47
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 0

Voltar ao Topo Ir em baixo

40% Re: [DÚVIDA RAPIDA] condição para determinar valores diferente nas variaveis

Mensagem por JonathanMatemático em Ter 20 Mar 2012, 19:12

Caro Adriano Heartless, para solucionar seu problema poderíamos pensar da seguinte forma: a cada valor sorteado, esse passa a ser excluído dos próximos sorteios. Na prática, seria um código mais ou menos com essa estrutura:

Código:
n=4;
v[0]=item_1;
v[1]=item_2;
v[2]=item_3;
v[3]=item_4;

posicao_1=choose(v[0],v[1],v[2],v[3]);
posicao_2=choose(v[0],v[1],v[2]);
posicao_3=choose(v[0],v[1]);
posicao_4=choose(v[0]);

Mas, dessa forma, não funcionaria, pois não declaramos, ou seja, "dissemos" que, após um valor ser sorteado, ele deveria ser descartado. Para tal deveríamos usar uma estrutura nesse formato:

Código:
p=0;
for(i=0; i<n; i+=1){
if(v[i]=vs;){p=1;}
if(p=1){v[i]=v[i+1];}}

Esse script será complicado de você entender, primeiramente te recomendo, caso não conheça, pesquisar as estrutura condicionais if e for, pois não a explicarei aqui. Nessa estrutura que passei, p é a variável definida para estabelecer quando o valor que deve ser eliminado foi detectado. O for compara todos os valores da array, que tem sua dimensão definida em n, até achar o valor que se deseja eliminar, ponto em que define p=1. A partir desse momento, todas as variáveis da array recebem o valor da que vem a frente delas, ou seja, os valores são reorganizados. Se desconhece o que é uma array, terá que pesquisar também.

Assim, o código final seria:
Código:
n=4;

v[0]=item_1;
v[1]=item_2;
v[2]=item_3;
v[3]=item_4;

posicao_1=choose(v[0],v[1],v[2],v[3]);
vs=posicao_1;
for(i=0; i<n; i+=1){
if(v[i]=vs;){p=1;}
if(p=1){v[i]=v[i+1];}}

posicao_2=choose(v[0],v[1],v[2]);
vs=posicao_2;
for(i=0; i<n; i+=1){
if(v[i]=vs;){p=1;}
if(p=1){v[i]=v[i+1];}}

posicao_3=choose(v[0],v[1]);
vs=posicao_3;
for(i=0; i<n; i+=1){
if(v[i]=vs;){p=1;}
if(p=1){v[i]=v[i+1];}}

posicao_4=choose(v[0]);

Eu poderia simplificar mais esse código aplicando mais uma array e mais algumas estruturas for, mas prefiro deixar-te pensar sobre essa solução mais simples. Ok?

Qualquer dúvida é só falar.

JonathanMatemático

Número de Mensagens : 33
Idade : 21
Data de inscrição : 17/03/2012
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

40% Re: [DÚVIDA RAPIDA] condição para determinar valores diferente nas variaveis

Mensagem por Zero. em Ter 20 Mar 2012, 19:21

Interessante Happy
Jonatan como essa estrutura se chama e onde posso estuda-la e pra que ela serve ?

@Topico
Ah vc quer escluir um após selecionar ele aleatoriamente ?
se não o random serve Happy

Zero.

Número de Mensagens : 1295
Idade : 20
Data de inscrição : 19/08/2010
Reputação : 47
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 0

Voltar ao Topo Ir em baixo

40% Re: [DÚVIDA RAPIDA] condição para determinar valores diferente nas variaveis

Mensagem por JonathanMatemático em Ter 20 Mar 2012, 19:29

Não sei se ele quer excluir, mas foi a ideia que tive. É que não conhecia o código random, é mais eficiente no caso. Mas ficam as duas soluções para enriquecer a resposta.

As propriedades da GML que usei foram: if, for e array.

O if é a condição básica que checa um estado finito de uma ou mais variáveis, o for é um loop (algo que se repete) que, dentro de sua própria estrutura, cria uma sequência lógica, no caso da minha estrutura, o for faz i+=1 a cada reinício. Muito útil, ferramenta que simplifica códigos de dezenas de linhas em algumas unidades.

E array é uma tabela, onde, em uma única variável, se declaram finitos valores que são, até onde sei, virtualmente ilimitados.

Material sobre tudo que citei pode ser encontrado no fórum, tanto que em minha época de primeiro contato com a GML, foi assim que aprendi, tutoriais da GMBR.

Qualquer dúvida, é só emendar aí. Cool

JonathanMatemático

Número de Mensagens : 33
Idade : 21
Data de inscrição : 17/03/2012
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

40% Re: [DÚVIDA RAPIDA] condição para determinar valores diferente nas variaveis

Mensagem por Kabeção em Qua 21 Mar 2012, 11:25

Embaralhar valores é exatamente como JonathanMatemático fez, escolher um e exclui-lo do próximo sorteio.
Mas isso é uma ação rotineira então o GML para facilitar nossa vida tem recursos para lidar com isso, o problema é que eles estão meio escondidos e pouca gente os percebe ou lembra deles (inclusive eu). Happy

Para 20 valores a solução do JonathanMatemático seria bem complicada mas usando datas estruturadas simplificaria.

Primeiro você cria uma ds_list e coloca todos os valores nela :
Código:
lista = ds_list_create();
ds_list_add(lista,item1);
ds_list_add(lista,item2);
....
Depois use a função ds_list_shuffle(lista), ela embaralha os valores da list.
Ai é só recuperar-los com algo assim:
Código:
for (i = 0; i < ds_list_size(lista); i += 1) {
    posicao[i] = ds_list_find_value(lista,i);
}
No final delete a list com ds_list_destroy.

Não crie 20 variáveis para uma mesma finalidade em comum!
Um array ou uma list é muito mais eficiente e fácil de se controlar.

Kabeção

Ranking : Sem avaliações
Número de Mensagens : 2314
Data de inscrição : 08/06/2008
Reputação : 100
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 3
   : 0
   : 1

http://blackcapapps.blogspot.com.br/

Voltar ao Topo Ir em baixo

40% Re: [DÚVIDA RAPIDA] condição para determinar valores diferente nas variaveis

Mensagem por shatterhand2 em Qua 21 Mar 2012, 18:07

A melhor forma de fazer isso realmente é usando array ou lista.

Mas se você é inexperiente em programação, array pode ser um conceito meio complexo de entender (Na verdade é bem simples, mas sempre vejo muita gente tendo dificuldade pra entender)

Vai uma sugestão sem array, que vai ficar um código bem mais longo, mas talvez mais facil de entender:

Código:

item_1= obj_caixa
item_2= obj_morango
item_3= obj_banana
item_4= obj_arroz
item_troca = null
//muda o item1 de lugar aleatoriamente com outro
sorteio = ceil(random(4))
if sorteio == 2
{
   item_troca = item_1
   item_1 = item_2
   item_2 = item_troca
}
if sorteio == 3
{
   item_troca = item_1
   item_1 = item_2
   item_3 = item_troca
}
if sorteio == 4
{
   item_troca = item_1
   item_1 = item_3
   item_3 = item_troca
}
//muda o item2 de lugar aleatoriamente com outro
sorteio = ceil(random(4))
if sorteio == 1
{
   item_troca = item_2
   item_2 = item_1
   item_1 = item_troca
}
if sorteio == 3
{
   item_troca = item_2
   item_2 = item_3
   item_3 = item_troca
}
if sorteio == 4
{
   item_troca = item_2
   item_2 = item_4
   item_4 = item_troca
}
//muda o item3 de lugar aleatoriamente com outro
sorteio = ceil(random(4))
if sorteio == 1
{
   item_troca = item_3
   item_3 = item_1
   item_1 = item_troca
}
if sorteio == 2
{
   item_troca = item_3
   item_3 = item_2
   item_2 = item_troca
}
if sorteio == 4
{
   item_troca = item_3
   item_3 = item_4
   item_4 = item_troca
}
//muda o item4 de lugar aleatoriamente com outro
sorteio = ceil(random(4))
if sorteio == 1
{
   item_troca = item_4
   item_4 = item_1
   item_1 = item_troca
}
if sorteio == 2
{
   item_troca = item_4
   item_4 = item_2
   item_2 = item_troca
}
if sorteio == 3
{
   item_troca = item_4
   item_4 = item_3
   item_3 = item_troca
}


Como você pode perceber, é simples de entender, mas com muitos itens vai ficar um código extremamente longo e confuso. Você pode ser sagaz e transformar isso num script, é muito mais inteligente.

Ou você pode ser ainda MAIS sagaz, e realmente estudar um pouquinho sobre arrays e lista, e perceber que são recursos muito mais apropriados para você fazer o que precisa Very Happy Essa mesma lógica que eu apliquei no código acima ficaria muito mais simples e reduzida com a utilização de um array Very Happy

shatterhand2

Número de Mensagens : 645
Idade : 33
Data de inscrição : 21/10/2009
Reputação : 11
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 0

http://shatterhand.beatthegame.net

Voltar ao Topo Ir em baixo

40% Re: [DÚVIDA RAPIDA] condição para determinar valores diferente nas variaveis

Mensagem por Conteúdo patrocinado Hoje à(s) 14:22


Conteúdo patrocinado


Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum