Problemas com DS_LIST, FOR e WHILE

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

Resolvido Problemas com DS_LIST, FOR e WHILE

Mensagem por Felipe Reis Magno 2 em Ter 17 Mar 2015, 17:35

Olá a todos, boa tarde! Happy Happy
Estou com alguns problemas ao criar minha ds_list, já tentei várias coisas, porém os resultados são os mesmos.

Estou criando um jogo em que 7 bolinhas são criadas e cada uma deve ter uma image_index diferente (de sete) sem repeti-las.

Vejam oq ue eu usei no Create do obj_bolinha:
Código:

cores_aleatorias = ds_list_create();

ds_list_add(cores_aleatorias,0);
ds_list_add(cores_aleatorias,1);
ds_list_add(cores_aleatorias,2);
ds_list_add(cores_aleatorias,3);
ds_list_add(cores_aleatorias,4);
ds_list_add(cores_aleatorias,5);
ds_list_add(cores_aleatorias,6);

cor = round(random(7));
ds_list_shuffle(cores_aleatorias);

while
ds_list_find_index(cores_aleatorias,-1)
{
ds_list_find_index(cores_aleatorias,cor);
if !ds_list_find_index(cores_aleatorias,-1)
image_index = cor;
ds_list_delete(cores_aleatorias,cor);
}

if not
cor round(random(7));

image_speed=0;

Quando as bolinhas são criadas, as cores se repetem, já tentei usar FOR, mas tabmém há repetição da image_index!
Uso o Game Maker Standalone, gmx.

Por favor, quem puder me ajudar ficarei muito feliz!!! abraço abraço felicidade

Felipe Reis Magno 2

Ranking : Nota E
Número de Mensagens : 43
Data de inscrição : 08/08/2014
Notas recebidas : E
Reputação : 2
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Resolvido Re: Problemas com DS_LIST, FOR e WHILE

Mensagem por Limalokão em Ter 17 Mar 2015, 18:06

Talvez o erro esteja aqui:
Código:
if not
cor round(random(7));

Falta o = logo depois de cor

Acho que é isso.

Limalokão

Ranking : Nota C
Número de Mensagens : 803
Idade : 24
Data de inscrição : 24/11/2009
Notas recebidas : C
Reputação : 10
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: Problemas com DS_LIST, FOR e WHILE

Mensagem por Willy em Ter 17 Mar 2015, 18:17

Você cometeu um erro bem bobo... Simplesmente está definindo que a cor será o valor de Cor, que por sua vez, é definido com random(7), ou seja, todo o restante do código foi inutilizado. O certo é você usar essa variavel "cor" para sortear um item da ds_list, e então, pegar o real valor sorteado, ou seja:

Código:
cor = irandom(7);
ds_list_shuffle(cores_aleatorias);

//while[...]
CorDaLista = ds_list_find_index(cores_aleatorias,cor);
image_index = CorDaLista;
Estou sendo bem superficial aqui. Caso precise de uma explicação mais direta, é só falar.

Ah, duas dicas:
1 - Você pode adicionar mais de um valor usando ds_list_add, ou seja, você poderia adicionar todos os valores com uma só linha:
Código:
ds_list_add(lista,0,1,2,3,4,5);
2 - ao invés de arredondar o valor do random, simplesmente use irandom (retorna números inteiros).

Nota: Do jeito que está, seu código é praticamente apenas isso:
Código:
image_index = round(random(7));

___________


Engines, tutoriais e projetos? Clique no banner!



Atenção:
Comporte-se, senão você vai levar a cintada do Willy no meio da bunda! bravo


Willy

Ranking : Nota A
Número de Mensagens : 1812
Idade : 23
Data de inscrição : 08/06/2009
Notas recebidas : C + B + A + A
Reputação : 245
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 2
   : 1
   : 1

http://willy-gmbr.blogspot.com/

Voltar ao Topo Ir em baixo

Resolvido Re: Problemas com DS_LIST, FOR e WHILE

Mensagem por Felipe Reis Magno 2 em Ter 17 Mar 2015, 18:20

Sério? Kraka!!! Vou testar!

Já testei, o código além de ser mais limpo, funcionou 99%, só tem um porem....



a image_index=0 de valor zero, que possui a cor cinza não aparece e é substituida por outra amarela! não ressaca

Felipe Reis Magno 2

Ranking : Nota E
Número de Mensagens : 43
Data de inscrição : 08/08/2014
Notas recebidas : E
Reputação : 2
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Resolvido Re: Problemas com DS_LIST, FOR e WHILE

Mensagem por itarodrigo em Ter 17 Mar 2015, 21:11

tenta pôr o image_index + 1 pra ver se funfa

itarodrigo

Número de Mensagens : 599
Idade : 33
Data de inscrição : 28/08/2010
Reputação : 52
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: Problemas com DS_LIST, FOR e WHILE

Mensagem por Willy em Ter 17 Mar 2015, 22:03

Isso porque você está sorteando 8 vezes em uma lista que possui apenas 7 itens. irandom sorteia um número ente 0 e N (no caso, 7), ou seja, são 8. Creio que substituir o irandom(7) por irandom(6) possa resolver o problema embora isso não justifique o fato do círculo cinza não aparecer.

___________


Engines, tutoriais e projetos? Clique no banner!



Atenção:
Comporte-se, senão você vai levar a cintada do Willy no meio da bunda! bravo


Willy

Ranking : Nota A
Número de Mensagens : 1812
Idade : 23
Data de inscrição : 08/06/2009
Notas recebidas : C + B + A + A
Reputação : 245
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 2
   : 1
   : 1

http://willy-gmbr.blogspot.com/

Voltar ao Topo Ir em baixo

Resolvido Re: Problemas com DS_LIST, FOR e WHILE

Mensagem por Felipe Reis Magno 2 em Ter 17 Mar 2015, 22:11

Bem, a minha linha de código atual do meu obj_bolinha é esta:



Deixei o ds_list_add um por um mesmo pois a minha versão do game maker não aceita ds_list_add(cores_aleatorias,0,1,2,3,4,5,6), mas esse não é o ponto.

Primeiro problema:
A questão de não aparecer a image_index=0 e surgir outra amarela que corresponde a image_index=1. Aonde eu inseriria neste código esse image_index+=1?

Segundo problema:
Apesar de aleatórias, o irandom sempre escolhe a mesma ordem das cores, o que prejudicaria futuramente qualquer tentativa de fazer itens diferentes surgirem da ds_list, pois a ordem sempre continuaria a mesma. Se eu usar o random no lugar do irandom, todas as bolinhas serão vermelhas, ou sej, image_index=6, o último indice da ds_list.pale pale

Existe uma solução, mas eu não consigo interpretar qual é!tonto


Vi sua mensagem agora!
Mudei o irandom pra (Cool, e olhe o que houve:


as imagens de indice repetem mais do que antes que apenas repetia uma.

Felipe Reis Magno 2

Ranking : Nota E
Número de Mensagens : 43
Data de inscrição : 08/08/2014
Notas recebidas : E
Reputação : 2
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Resolvido Re: Problemas com DS_LIST, FOR e WHILE

Mensagem por Willy em Ter 17 Mar 2015, 22:21

Rapaz... Não era pra colocar o código do jeito que eu postei, era apenas pra você substituir (por isso deixei o while comentado, era só pra você se orientar --\').

Bom... Vou fazer o sistema aqui de cabeça:

Create:
Código:
Lista = ds_list_create();
ds_list_add(Lista,0);
//Demais add's.

KeyPressEnter (ou outro lugar que execute apenas uma vez);
Código:
Size = ds_list_size(Lista);
randomize(); //Impede que o random seja sempre o mesmo (pergunta 2)
Index = irandom(Size);
Escolha = ds_find_value(Lista,Index);
ds_list_delete(Lista,Index);
image_index = Escolha;
Toda vez que o código acima é executado, a lista fica menor. Se desejar sortear tudo de uma vez, basta usar um for desta forma:
Código:
for (i=0;i<Size;i+=1){
Size = ds_list_size(Lista);
Index = irandom(Size);
Escolha = ds_find_value(Lista,Index);
ds_list_delete(Lista,Index);
image_index = Escolha;
}


Última edição por Willy em Ter 17 Mar 2015, 22:23, editado 1 vez(es)

___________


Engines, tutoriais e projetos? Clique no banner!



Atenção:
Comporte-se, senão você vai levar a cintada do Willy no meio da bunda! bravo


Willy

Ranking : Nota A
Número de Mensagens : 1812
Idade : 23
Data de inscrição : 08/06/2009
Notas recebidas : C + B + A + A
Reputação : 245
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 2
   : 1
   : 1

http://willy-gmbr.blogspot.com/

Voltar ao Topo Ir em baixo

Resolvido Re: Problemas com DS_LIST, FOR e WHILE

Mensagem por itarodrigo em Ter 17 Mar 2015, 22:21

tente:

randomize();
irandom_range(0,6);

itarodrigo

Número de Mensagens : 599
Idade : 33
Data de inscrição : 28/08/2010
Reputação : 52
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: Problemas com DS_LIST, FOR e WHILE

Mensagem por Felipe Reis Magno 2 em Ter 17 Mar 2015, 22:51

Vou tentar Itarodrigo, mas não tenho muita esperança! Obrigado!

Willy, desculpe por ter simplismente copiado seu código sem lê-lo direito e interpretá-lo
felicidade felicidade  é a minha pressa, mas enfim....

O me sistema é de mostrar tudo de uma vez, então apliquei o for como vc ensinou:

Código:

///Criando a cor da bolinha
cores_aleatorias = ds_list_create();//nome da lista de cores do obj_bolinha
//lista
ds_list_add(cores_aleatorias,0);
ds_list_add(cores_aleatorias,1);
ds_list_add(cores_aleatorias,2);
ds_list_add(cores_aleatorias,3);
ds_list_add(cores_aleatorias,4);
ds_list_add(cores_aleatorias,5);
ds_list_add(cores_aleatorias,6);

tamanho_da_lista = ds_list_size(cores_aleatorias);//coloquei esse aqui em cima pois estava dando cores iguais e erro pois havia sido declarada antes do FOR
ds_list_shuffle(cores_aleatorias);//misturar_cores

for
(i=0;i<tamanho_da_lista;i+=1)
{
tamanho_da_lista = ds_list_size(cores_aleatorias);//tirei e depois recoloquei este aqui e continua dando cores iguais
cor = irandom(tamanho_da_lista);
cor_escolhida = ds_list_find_value(cores_aleatorias,cor);
ds_list_delete(cores_aleatorias,cor);
image_index = cor_escolhida;
}

image_speed=0;//velocidade da imagem


Só que a image_index permanece repetindo, agora são quase todas. Troquei a posição do identificador do ds_list_size, mas nada mudou... ainda tentarei o método de cima que não usa o FOR.

Com certeza devo ter cometido outro erro
nervoso

Felipe Reis Magno 2

Ranking : Nota E
Número de Mensagens : 43
Data de inscrição : 08/08/2014
Notas recebidas : E
Reputação : 2
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Resolvido Re: Problemas com DS_LIST, FOR e WHILE

Mensagem por Willy em Ter 17 Mar 2015, 23:00

Suponho que cada círculo seja um objeto, certo? Se for este o caso, acredito que tenha um objeto responsável por criá-las. Este código deve estar neste objeto, e a aplicação do image_index também. Algo mais ou menos assim:
Código:
for(i=0;i<tamanho_da_lista;i+=1){
tamanho_da_lista = ds_list_size(cores_aleatorias);//tirei e depois recoloquei este aqui e continua dando cores iguais
cor = irandom(tamanho_da_lista);
cor_escolhida = ds_list_find_value(cores_aleatorias,cor);
ds_list_delete(cores_aleatorias,cor);
obj = instance_create(x,y,obj_bola);
obj.image_index = cor_escolhida;
}
Se este for está no próprio objeto que precisa ter a cor alterada (o que acredito ser o caso, já que existe um image_index indicando a si mesmo) vai dar errado mesmo. Isso porque a cor aplicada será a definida no último loop do for, ou seja, são 7 círculos executando o mesmo código.

___________


Engines, tutoriais e projetos? Clique no banner!



Atenção:
Comporte-se, senão você vai levar a cintada do Willy no meio da bunda! bravo


Willy

Ranking : Nota A
Número de Mensagens : 1812
Idade : 23
Data de inscrição : 08/06/2009
Notas recebidas : C + B + A + A
Reputação : 245
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 2
   : 1
   : 1

http://willy-gmbr.blogspot.com/

Voltar ao Topo Ir em baixo

Resolvido Re: Problemas com DS_LIST, FOR e WHILE

Mensagem por Felipe Reis Magno 2 em Ter 17 Mar 2015, 23:59

Willy, por favor não fique com raiva de mim, tenho um ano e meio de game maker rsrsrs

Realmente, eu estava colocando o ds_list no obj_bolinha, ao invez de colocar no obj_criador. Enfim, veja:
Create: (obj_criador)
Código:

///Criando as coress da bolinhas

cores_aleatorias = ds_list_create();//nome da lista de cores do obj_bolinha
//lista.
ds_list_add(cores_aleatorias,0);
ds_list_add(cores_aleatorias,1);
ds_list_add(cores_aleatorias,2);
ds_list_add(cores_aleatorias,3);
ds_list_add(cores_aleatorias,4);
ds_list_add(cores_aleatorias,5);
ds_list_add(cores_aleatorias,6);


coloquei no pressed right
Código:

tamanho_da_lista = ds_list_size(cores_aleatorias);
randomize(); //Impede que o random seja sempre o mesmo (pergunta 2)
cor = irandom(tamanho_da_lista);
cor_escolhida = ds_list_find_value(cores_aleatorias,cor);
ds_list_delete(cores_aleatorias,cor);
obj = instance_create(random(600),random(400),obj_bolinha);
obj.image_index = cor_escolhida;
obj_bolinha.image_speed=0;

Bem, o resultado é esse:


Agora finalmente o código parece estar muito mais próximo do perfeito. toda vez que eu aperto o RIGHT, cria uma bolinha com uma cor diferente! As cores amarelo,vermelho, vinho, azul claro, azul escuro e verde, só surgem uma vez, o que é perfeito, porém o cinza (image_index=0) antes de eu apertar o RIGHT a oitava vez (que já passaria do número da ds_list original de 7 itens), o cinza ainda repete as vezes na segunda ou terceira vez, as vezes. E após completar todas as sete cores do ds_list, todas as cores se tornam cinza dos novos obj_bolinha. Bem pra isso acho que teria que usar o ds_list_empty()?

Tipo: (número de apertos, sendo que o randomize ta ajudando na aleatoriedade bastante)
1-azul claro;
2-vermelho;
3-vinho;
4-cinza;
5-verde;
6-azul escuro;
7-amarelo;
8-vez cinza infinito...

Os problemas terminaram quase que 100%, agora só falataria algo para que quando a ds_list terminasse de ser usada, o obj_criador não conseguisse mais criar bolinhas quando eu apertar o botao.
Happy Happy Happy Happy

Felipe Reis Magno 2

Ranking : Nota E
Número de Mensagens : 43
Data de inscrição : 08/08/2014
Notas recebidas : E
Reputação : 2
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Resolvido Re: Problemas com DS_LIST, FOR e WHILE

Mensagem por Willy em Qua 18 Mar 2015, 08:20

Basta encapsular todo o código abaixo de tamanho_da_lista com um if que checa se tamanho_da_lista é maior que zero. Assim você bloqueia a criação.

___________


Engines, tutoriais e projetos? Clique no banner!



Atenção:
Comporte-se, senão você vai levar a cintada do Willy no meio da bunda! bravo


Willy

Ranking : Nota A
Número de Mensagens : 1812
Idade : 23
Data de inscrição : 08/06/2009
Notas recebidas : C + B + A + A
Reputação : 245
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 2
   : 1
   : 1

http://willy-gmbr.blogspot.com/

Voltar ao Topo Ir em baixo

Resolvido Re: Problemas com DS_LIST, FOR e WHILE

Mensagem por Felipe Reis Magno 2 em Qua 18 Mar 2015, 10:33

Perfeito Willy!!! Funcionou!
Inseri a disposição dos códigos assim:
Código:

tamanho_da_lista = ds_list_size(cores_aleatorias);
randomize(); //Impede que o random seja sempre o mesmo (pergunta 2)
cor = irandom(tamanho_da_lista);
if tamanho_da_lista>0
{
cor_escolhida = ds_list_find_value(cores_aleatorias,cor);
ds_list_delete(cores_aleatorias,cor);
obj = instance_create(random(600),random(400),obj_bolinha);
obj.image_index = cor_escolhida;
obj_bolinha.image_speed=0;
}

Agora quando as sete cores da lista aparecem, o obj_criador não cria mais o obj_bolinha!!!


Muito obrigado Willy e Itarodrigo!

Vou fechar o tópico como resolvido, agora poderei aplicar esse códigos em projetos antigos e mais bem elaborados! Finalmente estou com uma boa noção de ds_list!!!
cheers

Vou dar joinha* pra vcs!!!


Felipe Reis Magno 2

Ranking : Nota E
Número de Mensagens : 43
Data de inscrição : 08/08/2014
Notas recebidas : E
Reputação : 2
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Resolvido Re: Problemas com DS_LIST, FOR e WHILE

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


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