Obrigado por visitar a The Game Makers Brasil |
Como gerar números ou instancias que não se repetem? Tópico resolvido
- gustavo12g
- Novato
- Reações: 0
- Mensagens: 16
-
Como gerar números ou instancias que não se repetem?
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?
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?
- Superbomber
- Programador
- Reações: 0
- Mensagens: 283
- Localização: Natal-RN
-
Re: Como gerar números ou instancias que não se repetem?
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:
Veja a lógica e faça seu próprio código, estou em um Tablet pode haver erros.
Bye.
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++;
}
}
Bye.

Entrem neste link com o JavaScript desabilitado e vejam a mágica: https://tgmbrasil.com.br/?PageSpeed=n0script
- gustavo12g
- Novato
- Reações: 0
- Mensagens: 16
-
Re: Como gerar números ou instancias que não se repetem?
Ele está sempre repetindo o mesmo resultado. Quando sorteia o inst2, por ex, fica só nele.
- Superbomber
- Programador
- Reações: 0
- Mensagens: 283
- Localização: Natal-RN
-
Re: Como gerar números ou instancias que não se repetem?
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...
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
- Denis Lemos
- Membro
- Reações: 0
- Mensagens: 49
-
Re: Como gerar números ou instancias que não se repetem?
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.
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.
- gustavo12g
- Novato
- Reações: 0
- Mensagens: 16
-
Re: Como gerar números ou instancias que não se repetem?
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.
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.
- Denis Lemos
- Membro
- Reações: 0
- Mensagens: 49
-
Re: Como gerar números ou instancias que não se repetem? Tópico resolvido
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:
No Alarm[0] coloque isso:
No Alarm[1] coloque isso:
No Alarm[2] coloque isso:
No Alarm[3] coloque isso:
E por fim no Alarm[4] coloque isso:
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.
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;
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;
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;
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;
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;
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.
- Primeiro é criado o item1 da lista.
- Depois é criado o item2 da lista.
- Depois é criado o item3 da lista.
- Depois é criado o item4 da lista.
- Depois é criado o item5 da lista.
- gustavo12g
- Novato
- Reações: 0
- Mensagens: 16
-
Quem está online
Usuários navegando neste fórum: Nenhum usuário registrado e 4 visitantes