[Resolvido]Verificação no laço FOR

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

Resolvido [Resolvido]Verificação no laço FOR

Mensagem por Ufrarion em Qui 27 Dez 2012, 18:44

Aew galera!!!

Tenho no meu jogo um laço FOR chamado "s":

Código:
for(s=0; s<ds_list_size(ini); s+=1)
Eu queria fazer uma verificação com IF nesse "s" assim:

Código:
if s=ds_list_size(ini)
Mas não funciona, como eu posso verificar o valor da variável que é um FOR?


Última edição por Ufrarion em Sab 29 Dez 2012, 20:39, editado 2 vez(es)

Ufrarion

Número de Mensagens : 222
Data de inscrição : 06/06/2010
Reputação : 3
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Verificação no laço FOR

Mensagem por vinians em Qui 27 Dez 2012, 18:55

Funciona sim, sempre uso variaveis associadas ao laço for e nunca tive problema. Qual seria o problema?
Flws!

vinians

Ranking : Nota B
Número de Mensagens : 2490
Idade : 27
Data de inscrição : 18/09/2008
Notas recebidas : B-C-A-C
Reputação : 52
Insignia 1 x 0 Insignia 2 x 1 Insignia 3 x 0
Prêmios
   : 0
   : 2
   : 1

http://xcreatorgames.weebly.com/

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Verificação no laço FOR

Mensagem por Ufrarion em Qui 27 Dez 2012, 19:00

Estranho não é a primeira vez que tento e não funciona (parece que a condição não vira verdadeira)

Vo postar todo o code do for:

Código:
for(s=0;s<ds_list_size(ini);s+=1)
    {
    if real(string_copy(ds_list_find_value(ini,s),1,4)) > global.timer
        {
        ds_list_insert(ini,s,string(global.timer)+"                    "+string(current_day)+"/"+string(current_month)+"/"+string(current_year))
        ds_list_delete(ini,5); break
        }
    if s=ds_list_size(ini) {ds_list_add(ini,string(global.timer)+"                    "+string(current_day)+"/"+string(current_month)+"/"+string(current_year))}
    }
}

Ufrarion

Número de Mensagens : 222
Data de inscrição : 06/06/2010
Reputação : 3
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Verificação no laço FOR

Mensagem por Alex FC em Qui 27 Dez 2012, 19:07

Bom, está tudo certo. Eu tive que editar o post. Pensei que era outra coisa. Um exemplo:

Código:
for (i=0 i<10 i+=1)
{

    if i == 5
    {
        show_message("Sua variável de evento <i> está no valor 5");
    }

}

Seu código está correto. Mas o que provavelmente está impedindo o código de checar avariável é esse BREAK que corta loop e passa ele pro próximo valor.

Para saber mais sobre o laço (ciclo, loop, etc) for acesse a aula:

http://gmbr.forumeiros.com/t5121-aula-6-introducao-em-gml-for-do-until-e-repeat

FLWS!

Alex FC

Ranking : Nota A
Número de Mensagens : 2503
Idade : 23
Data de inscrição : 20/12/2008
Notas recebidas : B A
Reputação : 174
Insignia 1 x 1 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 2
   : 1
   : 1

http://redscreensoft.blogspot.com

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Verificação no laço FOR

Mensagem por vinians em Qui 27 Dez 2012, 19:14

Alex FC escreveu:vinians ele está tentando colocar isso dentro do dos parenteses do for (Pra mim também estava difícil decifrar a pergunta, mas consegui), mas na verdade o certo é colocar entre colchetes:

Código:
for (i=0 i<10 i+=1)
{

    if i == 5
    {
        show_message("Sua variável de evento <i> está no valor 5");
    }

}

Para saber mais sobre o laço (ciclo, loop, etc) for acesse a aula:

http://gmbr.forumeiros.com/t5121-aula-6-introducao-em-gml-for-do-until-e-repeat

FLWS!
Sei como, mas o laço for permite que se coloque no segundo parâmetro qualquer tipo de condição, não necessariamente uma constante. O código inicial que ele postou teoricamente tem que funcionar....
Flws!

vinians

Ranking : Nota B
Número de Mensagens : 2490
Idade : 27
Data de inscrição : 18/09/2008
Notas recebidas : B-C-A-C
Reputação : 52
Insignia 1 x 0 Insignia 2 x 1 Insignia 3 x 0
Prêmios
   : 0
   : 2
   : 1

http://xcreatorgames.weebly.com/

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Verificação no laço FOR

Mensagem por Alex FC em Qui 27 Dez 2012, 19:21

¬¬ Sim, queimei a língua xD.

Provavelmente a primeira condição sempre ocorre, cortando a execução da segunda condição por causa do BREAK.

FLWS!

Alex FC

Ranking : Nota A
Número de Mensagens : 2503
Idade : 23
Data de inscrição : 20/12/2008
Notas recebidas : B A
Reputação : 174
Insignia 1 x 1 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 2
   : 1
   : 1

http://redscreensoft.blogspot.com

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Verificação no laço FOR

Mensagem por vinians em Qui 27 Dez 2012, 19:24

Ufrarion escreveu:Estranho não é a primeira vez que tento e não funciona (parece que a condição não vira verdadeira)

Vo postar todo o code do for:

Código:
for(s=0;s<ds_list_size(ini);s+=1)
    {
    if real(string_copy(ds_list_find_value(ini,s),1,4)) > global.timer
        {
        ds_list_insert(ini,s,string(global.timer)+"                    "+string(current_day)+"/"+string(current_month)+"/"+string(current_year))
        ds_list_delete(ini,5); break
        }
    if s=ds_list_size(ini) {ds_list_add(ini,string(global.timer)+"                    "+string(current_day)+"/"+string(current_month)+"/"+string(current_year))}
    }
}
Amigo, o erro ai que vc esta "aumentando" o proprio ds_list que faz parte da condição, no caso "ini". Quando usado em uma condição vc não deve (pois é possivel) aumentar o tamanho de elementos que sejam verificados desta forma. Pra funcionar poderia ser algo do tipo:
Código:

t = ds_list_size(ini);
for(s=0;s<t;s+=1)
    {
    if real(string_copy(ds_list_find_value(ini,s),1,4)) > global.timer
        {
        ds_list_insert(ini,s,string(global.timer)+"                    "+string(current_day)+"/"+string(current_month)+"/"+string(current_year))
        ds_list_delete(ini,5); break
        }
    if s=ds_list_size(ini) {ds_list_add(ini,string(global.timer)+"                    "+string(current_day)+"/"+string(current_month)+"/"+string(current_year))}
    }
}
Flws!


vinians

Ranking : Nota B
Número de Mensagens : 2490
Idade : 27
Data de inscrição : 18/09/2008
Notas recebidas : B-C-A-C
Reputação : 52
Insignia 1 x 0 Insignia 2 x 1 Insignia 3 x 0
Prêmios
   : 0
   : 2
   : 1

http://xcreatorgames.weebly.com/

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Verificação no laço FOR

Mensagem por Ufrarion em Qui 27 Dez 2012, 19:27

@Alex FC

O BREAK não é porque já testei colocando uma mensagem junto ao break e ele não é executado, por isso que eu preciso fazer esse verificação no "s" porque essa parte do código não vai ser executada.

@vinians

Eu tamebm não estou entendendo, não sei como funciona o for, se ele adiciona +1 no começo do for ou no fim, porque se for no fim pode ser isso que não está funcionando


Última edição por Ufrarion em Qui 27 Dez 2012, 19:49, editado 3 vez(es)

Ufrarion

Número de Mensagens : 222
Data de inscrição : 06/06/2010
Reputação : 3
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Verificação no laço FOR

Mensagem por vinians em Qui 27 Dez 2012, 19:33

Ufrarion escreveu:@Alex FC


@vinians

Eu tamebm não estou entendendo, não sei como funciona o for, se ele adiciona +1 no começo do for ou no fim, porque se for no fim pode ser isso que não está funcionando
Veja, ele executa o terceiro parâmetro que no seu caso é "s+=1" no final da iteração com certeza. Quando vc dá break ele sai do loop. No caso, o "não funcionando" seria oque ?

vinians

Ranking : Nota B
Número de Mensagens : 2490
Idade : 27
Data de inscrição : 18/09/2008
Notas recebidas : B-C-A-C
Reputação : 52
Insignia 1 x 0 Insignia 2 x 1 Insignia 3 x 0
Prêmios
   : 0
   : 2
   : 1

http://xcreatorgames.weebly.com/

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Verificação no laço FOR

Mensagem por Ufrarion em Qui 27 Dez 2012, 19:49

Testei assim:

Código:
t = ds_list_size(ini);

for(s=0;s<t;s+=1)
    {
    if real(string_copy(ds_list_find_value(ini,s),1,4)) > global.timer
        {
        show_message("kkkkk")
        ds_list_insert(ini,s,string(global.timer)+"                    "+string(current_day)+"/"+string(current_month)+"/"+string(current_year))
        ds_list_delete(ini,5); break
        }
    if s=t {ds_list_add(ini,string(global.timer)+"                    "+string(current_day)+"/"+string(current_month)+"/"+string(current_year))}
    }
}
E tambem não funcionou =/

E que no teste que eu estou fazendo a condição "if real(string_copy(ds_list_find_value(ini,s),1,4)) > global.timer" nunca é verdadeira, então o BREAK nunca é executado (no teste).

Ufrarion

Número de Mensagens : 222
Data de inscrição : 06/06/2010
Reputação : 3
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Verificação no laço FOR

Mensagem por vinians em Qui 27 Dez 2012, 20:01

Entendi. Neste caso, o problema não está no laço for e sim no valor de global.timer ou nos próprios valores inseridos dentro de "ini". Na verdade
Código:

    if s=t {ds_list_add(ini,string(global.timer)+"                    "+string(current_day)+"/"+string(current_month)+"/"+string(current_year))}
nunca será executado pois a condição delimita em t - 1. Se você coloar "if s = t - 1, o IF vai executar mas mesmo assim pode não funcionar pois você está operando na propria variavel usada na condição ou seja esta adicionando no "ini" e excluindo com o ds_list_delete() caso a condição se torne verdadeira. Esse algoritmo não vai funcionar assim e não é devido ao laço for.
Explique o que você precisa que vamos pensar juntos numa solução.
Flws!

vinians

Ranking : Nota B
Número de Mensagens : 2490
Idade : 27
Data de inscrição : 18/09/2008
Notas recebidas : B-C-A-C
Reputação : 52
Insignia 1 x 0 Insignia 2 x 1 Insignia 3 x 0
Prêmios
   : 0
   : 2
   : 1

http://xcreatorgames.weebly.com/

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Verificação no laço FOR

Mensagem por Ufrarion em Qui 27 Dez 2012, 20:48

Na verdade eu fiz esse sistema porque o ds_list_sort ele devia pegar uma lista de numeros como e deixar em ordem acendente mas ele deixa assim:

132
50
83
98

Porque o 1 do numero 132 é menor que o 5 do 50 mas não leva em conta que o numero inteiro 132 é maior que o 50 entendeu? o ds_list_sort faz a ordem levando em conta o primeiro digito somente e eu preciso que leve em consideração o numero inteiro e que a ordem fique:

50
83
98
132

Ufrarion

Número de Mensagens : 222
Data de inscrição : 06/06/2010
Reputação : 3
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Verificação no laço FOR

Mensagem por vinians em Qui 27 Dez 2012, 22:42

Entendi sim amigo. Na verdade você deve estar adicionando os elementos do ds_list como string. Se adiciona-los como valor, o ds_list_sort() vai coloca-los em ordem corretamente. Veja:
Código:

ini = ds_list_create();
ds_list_add(ini, 132);
ds_list_add(ini, 5);
ds_list_add(ini, 45);
ds_list_sort(ini, true);
//Agora mostrar os valores
i = 0;
repeat(3)
{
  show_message(ds_list_finc_value(ini, i));
  i += 1;
}

Viu, basta apenas adicionar os itens como numeros diretamente ou converter as string quando for inserido usando real(numero).
Flws!

vinians

Ranking : Nota B
Número de Mensagens : 2490
Idade : 27
Data de inscrição : 18/09/2008
Notas recebidas : B-C-A-C
Reputação : 52
Insignia 1 x 0 Insignia 2 x 1 Insignia 3 x 0
Prêmios
   : 0
   : 2
   : 1

http://xcreatorgames.weebly.com/

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Verificação no laço FOR

Mensagem por Ufrarion em Sex 28 Dez 2012, 00:01

Então com numeros reais funciona, o problema é que eu estou fazendo um highscore que mostra o tempo + alguns espaços pra não deixar junto + data (com barras de separação) e por isso acho que não tem como converter a numeros reais não é?

Ufrarion

Número de Mensagens : 222
Data de inscrição : 06/06/2010
Reputação : 3
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Verificação no laço FOR

Mensagem por vinians em Sex 28 Dez 2012, 00:32

A saquei, entao vc pode fazer assim para ordenar:
Supondo que o DS chame-se ini
Código:

var i, j, repetir;
while (true)
{
  repetir = false;
  for (i = 0; i < ds_list_size(ini) - 2; i += 1)
  {
      v1 = string_copy(ds_list_find_value(ini, i), 1, 4); // mude a posicao aqui
      v2 = string_copy(ds_list_find_value(ini, i + 1), 1, 4); //idem
      if (real(v1) > real(v2))
      {
          ds_list_replace(ini, i, v2);
          ds_list_replace(ini, i + 1, v1);
          repetir = true;
      }
  }
  if (not repetir) break;
}
Isso é uma rotina de ordenação basica em ordem crescente, para decrescente basta trocar o sinal. Assim vc pode ordenar qualquer coisa em um ds_list() usando qualquer posicao. Código não otimizado para simplificar.
Flws!

vinians

Ranking : Nota B
Número de Mensagens : 2490
Idade : 27
Data de inscrição : 18/09/2008
Notas recebidas : B-C-A-C
Reputação : 52
Insignia 1 x 0 Insignia 2 x 1 Insignia 3 x 0
Prêmios
   : 0
   : 2
   : 1

http://xcreatorgames.weebly.com/

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Verificação no laço FOR

Mensagem por saim em Sex 28 Dez 2012, 09:01

gente, não li tudo, tem muita coisa, mas notei um erro simples. Veja bem, teste esse código aqui:
Código:
naoRolou = true;
for(s = 0; s < 10; s += 1){
if (s == 10){
show_message("tá beleza")
naoRolou = false;
}
}

if (naoRolou == true){
show_message("tá fraco");
}

Sem ds_list aumentando, sem nada. No meu entendimento, a mensagem mostrada será "tá fraco" (não testei). Agora, pra mostrar a mensagem "tá beleza", temos que trocar o "<" por "<=", no for:
Código:
naoRolou = true;
for(s = 0; s <= 10; s += 1){
if (s == 10){
show_message("tá beleza")
naoRolou = false;
}
}

if (naoRolou == true){
show_message("tá fraco");
}

Se a ds_list estiver crescendo a cada iteração, o erro que vai dar é o computador travar. Seria algo como
Código:
for(s = 0; s < 2; s += 1){
s -= 1;
}
NÃO testem esse código.

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Verificação no laço FOR

Mensagem por Ufrarion em Sab 29 Dez 2012, 20:28

Desculpe pela demora (problemas com a internet), andei olhando todo o tópico e deixei meu code assim e funcionou:

Código:
var ds;
ds=ds_list_size(ini)

for(s=0;s<ds;s+=1)
    {
    if real(string_copy(ds_list_find_value(ini,s),1,4)) > global.timer
        {
        ds_list_insert(ini,s,string(global.timer)+"                    "+string(current_day)+"/"+string(current_month)+"/"+string(current_year))
        ds_list_delete(ini,5); break
        }
    if (s==ds-1) {ds_list_add(ini,string(global.timer)+"                    "+string(current_day)+"/"+string(current_month)+"/"+string(current_year))}
    }
Na verdade, quando o if (s==ds-1) ser verdadeira ela será o ultimo ciclo e é isso que eu preciso, um dos teus posts vinians tu falou que não funcionaria porque estaria adicionando a ds_list e excluindo depois, mas a parte de excluir está em outra parte desse code, na parte do if (s==ds-1) não tem o ds_list_delete() e esse ds_list_delete() era para deletar a posição 5 da ds_list e só uso da posição 0 a 4 então não tem como dar erro.

Obrigado a todos que me ajudaram. Resolvido!

Ufrarion

Número de Mensagens : 222
Data de inscrição : 06/06/2010
Reputação : 3
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Verificação no laço FOR

Mensagem por Thopson1m em Seg 07 Jan 2013, 19:35

Tópico trancado, pois a dúvida do autor foi resolvida.
Caso necessites, favor se dirigir à mim ou à qualquer outro moderador para destrancar este seu tópico.

Thopson1m

Número de Mensagens : 624
Idade : 26
Data de inscrição : 21/05/2011
Reputação : 16
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://gnbr.forumeiros.com

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Verificação no laço FOR

Mensagem por Conteúdo patrocinado Hoje à(s) 12:33


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