Obrigado por visitar a The Game Makers Brasil 😁 Use o fórum de Dúvidas para fazer perguntas. Se está em busca de aprender dê uma olhada nos tutoriais.

Como gerar números ou instancias que não se repetem? Tópico resolvido

Perguntas? A comunidade te ajuda a resolver.
Avatar do usuário
gustavo12g
Novato
Novato
Reações: 0
Mensagens: 16

Como gerar números ou instancias que não se repetem?

Mensagem por gustavo12g » Qua Set 14, 2016 8:24 pm

Olá pessoal...

Minha dúvida: Quero realizar um sorteio de números ou instancias. Mas quero que apareçam apenas uma vez, que não se repitam até que o último número ou instancia aparecer.
Por ex: (1,2,3,4,5,6).
Se eu usar por ex o CHOOSE, o número 1 poderia se repetir antes que todos os outros fossem sorteados.
Gostaria que cada um que fosse sorteado, só voltasse a ser quando todos os outros já tenham sidos.

Alguém poderia me ajudar?

Avatar do usuário
Superbomber
Programador
Programador
Reações: 0
Mensagens: 283
Localização: Natal-RN

Re: Como gerar números ou instancias que não se repetem?

Mensagem por Superbomber » Qua Set 14, 2016 8:37 pm

Ou seja, você quer uma ordem aleatória.(em JS isso seria tão simples...)

Não sei se existe um "sort" aleatório no GMS, mas pode fazer isso usando ds_list e verificando se o item já foi inserido na list.

Exemplo:

Código: Selecionar todos

i = 0;
itens = ds_list_create();
while( i < 3 ){
   atu = choose(inst1, inst2, inst3);
   if( ds_list_find_index(itens, atu) == -1){ // se ainda não foi inserido na list
      ds_list_add(itens, atu);
      i++;
   }
}
Veja a lógica e faça seu próprio código, estou em um Tablet pode haver erros.

Bye. :flw:
Entrem neste link com o JavaScript desabilitado e vejam a mágica: https://tgmbrasil.com.br/?PageSpeed=n0script

Avatar do usuário
gustavo12g
Novato
Novato
Reações: 0
Mensagens: 16

Re: Como gerar números ou instancias que não se repetem?

Mensagem por gustavo12g » Qua Set 14, 2016 9:27 pm

Ele  está sempre repetindo o mesmo resultado. Quando sorteia o inst2, por ex,  fica só nele.

Avatar do usuário
Superbomber
Programador
Programador
Reações: 0
Mensagens: 283
Localização: Natal-RN

Re: Como gerar números ou instancias que não se repetem?

Mensagem por Superbomber » Qua Set 14, 2016 9:53 pm

Como você colocou o código?

No if você botou == -1? Porque se você colocar != o resultado vai ser o descrito por você.

Se puder mostrar o código usado...
Entrem neste link com o JavaScript desabilitado e vejam a mágica: https://tgmbrasil.com.br/?PageSpeed=n0script

Avatar do usuário
Denis Lemos
Membro
Membro
Reações: 0
Mensagens: 49

Re: Como gerar números ou instancias que não se repetem?

Mensagem por Denis Lemos » Qua Set 14, 2016 9:54 pm

Você pode criar uma DS List, e ir adicionando os itens ou valores em ordem crescente ou na ordem que vc preferir.

Depois você pode apenas usar ds_list_shuffle()
Isso embaralha os itens da lista em ordem aleatória e eles não se repetem. Depois basta apenas checar a lista de item a item até que apareça o item que você precisa.

Sobre vc obter o mesmo resultado, é porque o GM:s usa sempre o mesmo "seed" para gerar números aleatórios. Para mudar isso, vc precisa apenas chamar o comando randomize() no "Create" do objeto, isso vai definir a semente para um valor aleatório.

Avatar do usuário
gustavo12g
Novato
Novato
Reações: 0
Mensagens: 16

Re: Como gerar números ou instancias que não se repetem?

Mensagem por gustavo12g » Qua Set 14, 2016 10:34 pm

Eu tinha esse código:
OBJ CRIAR

create: alarm[0]=10

Alarm[0]

s=choose(1,2,3,4,5)

if s=1 {instance_create(100,50,p1); alarm[1]=60 }

if s=2 {instance_create(150,70,p2); alarm[1]=60}

if s=3 {instance_create(180,80,p3); alarm[1]=60}

if s=4 {instance_create(200,90,p4); alarm[1]=60}

if s=5 {instance_create(300,100,p5); alarm[1]=60}

Alarm[1]


s=choose(1,2,3,4,5)

if s=1 {instance_create(100,50,p1); alarm[0]=60 }

if s=2 {instance_create(150,70,p2); alarm[0]=60}

if s=3 {instance_create(180,80,p3); alarm[0]=60}

if s=4 {instance_create(200,90,p4); alarm[0]=60}

if s=5 {instance_create(300,100,p5); alarm[0]=60}


Isso ia criando os aleatórios mas eles se repetiam mesmo antes de todos aparecerem.
Por ex: sorteava o p3, logo depois sorteava o p3 de novo. Ou sorteava o p2, depois o p1, e mesmo antes do p4 e p5 aparecerem voltava a sortear o p2.
Meu desejo é que todos sejam sorteados antes que se repitam.

Avatar do usuário
Denis Lemos
Membro
Membro
Reações: 0
Mensagens: 49

Re: Como gerar números ou instancias que não se repetem?  Tópico resolvido

Mensagem por Denis Lemos » Qui Set 15, 2016 1:14 am

Por isso eu disse para vc guardar os objetos em uma lista, embaralhar a lista, e usar os valores da lista na ordem normal crescente.
Ex:
Crie um obj_controle e coloque isso no Evento Create:

Código: Selecionar todos

//Randomizando a semente usada para gerar números aleatórios.
randomize();

//Criando a nossa lista.
myList = ds_list_create();


/*Adicionando os objetos na nossa lista. Note que os objetos são
adicionados em ordem crescente, mas isso não vai fazer diferença no final.*/
ds_list_add(myList, obj_1);
ds_list_add(myList, obj_2);
ds_list_add(myList, obj_3);
ds_list_add(myList, obj_4);
ds_list_add(myList, obj_5);

/*Misturando os objetos da nossa lista em ordem aleatória.
Note que agora os objetos não estão mais ordenados como antes, estão agora em posições aleatórias.*/
ds_list_shuffle(myList);

//Chamando o alarm0 depois de 1 segundo.
alarm[0] = 1 * room_speed;
No Alarm[0] coloque isso:

Código: Selecionar todos

/*Criando o primeiro item da lista que está posicionado no índice 0.
Note que não sabemos qual é o objeto, pois ele foi definido randomicamente.*/
myInstance = ds_list_find_value(myList, 0);//Captura o primeiro item da lista.
instance_create(x + 34,y,myInstance);

//Chamando o alarm1 depois de 2 segundos.
alarm[1] = 2 * room_speed;
No Alarm[1] coloque isso:

Código: Selecionar todos

//Criando o segundo item da lista que se encontra no índice 1.
myInstance = ds_list_find_value(myList, 1);
instance_create(x + (34 * 2),y,myInstance);

//Chamando o alarm2 depois de 2 segundos.
alarm[2] = 2 * room_speed;
No Alarm[2] coloque isso:

Código: Selecionar todos

//Criando o terceiro item da lista localizado no índice 2.
myInstance = ds_list_find_value(myList, 2);
instance_create(x + (34 * 3),y,myInstance);

//Chamando o alarm3 depois de 2 segundos.
alarm[3] = 2 * room_speed;
No Alarm[3] coloque isso:

Código: Selecionar todos

//Criando o quarto item da lista localizado no índice 3.
myInstance = ds_list_find_value(myList, 3);
instance_create(x + (34 * 4),y,myInstance);

//Chamando o alarm4 depois de 2 segundos.
alarm[4] = 2 * room_speed;
E por fim no Alarm[4] coloque isso:

Código: Selecionar todos

//Criando o quinto item da lista localizado no índice 4.
myInstance = ds_list_find_value(myList, 4);
instance_create(x + (34 * 5),y,myInstance);

Viu que apenas a lista foi misturada, mudando a ordem que os objetos estão localizados nela? O código para criar os objetos é o mesmo, e sempre na mesma ordem, só o que muda é a ordem dos itens na lista.
  1. Primeiro é criado o item1 da lista.
  2. Depois é criado o item2 da lista.
  3. Depois é criado o item3 da lista.
  4. Depois é criado o item4 da lista.
  5. Depois é criado o item5 da lista.

Avatar do usuário
gustavo12g
Novato
Novato
Reações: 0
Mensagens: 16

Re: Como gerar números ou instancias que não se repetem?

Mensagem por gustavo12g » Sex Set 16, 2016 3:36 pm

Muito obrigado!!!

Trancado

Quem está online

Usuários navegando neste fórum: Google [Bot] e 8 visitantes