Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: francordoba en Febrero 01, 2013, 01:17:20 AM

Título: Repetir acciones si no se cumple una condición.(RESUELTO)
Publicado por: francordoba en Febrero 01, 2013, 01:17:20 AM
Tengo 5 pozos y un cubo.

Quiero ,cuando coja el cubo, llenar solamente un pozo, haciendo comprobaciones si el primero ya esta lleno, y si es así, que pase al siguiente, y así hasta que encuentre uno vacío para llenarlo, y que si lleno uno vacío, ahí se pare la acción y no altere a los demás.

¿Cómo se consigue esto?

AÑADO INFO:

Los pozos son P1_obj   P2_obj P3_obj P4_obj P5_obj

"Si cojo un cubo, empieza a comprobar del primero al ultimo, cual es el siguiente vacio, cuando lo detecte , AHÍ mismo se detiene la acción, quedando ese pozo lleno"
Es decir, primero empieza en P1_obj, si éste está lleno, busco el siguiente pozo (P2_obj), si este tambien está lleno, seguirá hasta encontrar alguno vacío. Cuando lo encuentre, ignorará los pozos restantes.

Hay alguna forma en código de referirse a P1_obj, P2_obj y etc que no haya que nombrarlos por sus nombres si no que se le vaya sumando una variable y que esto ayude a identificarlos? Por que, y si tuviera 1000 pozos?
Título: Re:Repetir acciones si no se cumple una condición.
Publicado por: elviskelley en Febrero 01, 2013, 01:44:22 AM
verificate las sentencias en el manual en especial las "Do" y las "while"
Título: Re:Repetir acciones si no se cumple una condición.
Publicado por: elviskelley en Febrero 01, 2013, 01:51:12 AM
Sentencia DO
do <sentencia> until(<expresión>)

La sentencia (que puede también ser un bloque) es ejecutada hasta que la expresión sea verdadera.
{
  do
  {
    x = random(room_width);
    y = random(room_height);
  }
  until (place_free(x,y))
}
Título: Re:Repetir acciones si no se cumple una condición.
Publicado por: francordoba en Febrero 01, 2013, 02:09:56 AM
Purifico más el código:

if P1_obj.tipo<1{P1_obj.tipo=1}    //--Si el Pozo 1 esta vacío(su variable interna tipo es menor a 0)----poner la variable interna de Pozo 1 en 1 indicando que lo ha llenado y se para la acción.

Si la variable interna de Pozo 1 no es menor a 1, (indica que esta lleno) probamos con el Pozo2 y su variable interna y así hasta el infinito y más allá..............
Título: Re:Repetir acciones si no se cumple una condición.
Publicado por: Silver_light en Febrero 01, 2013, 08:07:42 PM
Hay distintas formas de hacerlo, pero en vista que utilizas varios objetos, y cómo se me ha ocurrido la solucion, la haría de la siguiente forma, sentencias IF anidadas:

if (P1_obj.tipo<1)
   P1_obj.tipo = 1;
else
   if (P2_obj.tipo<1)
       P2_obj.tipo = 1;
   else
      if (P3_obj.tipo<1)
          P3_obj.tipo = 1;
      else
          if (P4_obj.tipo<1)
             P4_obj.tipo = 1;
          else
              if (P5_obj.tipo<1)
                 P5_obj.tipo = 1;

entonces verifica si el primer pozo está vacio, sino lo está verifica el segundo pozo, sino el tercero y así hasta el quinto pozo. Verifica si funciona mi idea.
Saludos!
Título: Re:Repetir acciones si no se cumple una condición.
Publicado por: brunoxzx en Febrero 01, 2013, 09:47:28 PM
Wow una vez fui a una clase de programación (a la que nunca regrese) y el ejercicio que pusieron fue uno igual al que preguntas.

Bueno la respuesta está en un bucle, para esté caso un for, si no sabes como funciona buscala en el manual o en google.

Aunque bueno viendo esto supongo que tal vez tu problema no sean los bucles si no que no es posible llamar a objetos por su nombre.

La solución más elegante que se me ocurre es crear un array con los numeros de todos tus pozos, esto lo haría siguiendo estos pasos.

Crear un objeto llamado par_pozo(o como quieras) y asignar a todos los posos como padre a par pozo.

El evento padre de par_pozo pon esté código.
[gml]
/*La función object_get_name devuelve un string con el nombre de un objeto.
Lo que tienes que hacer es obtener el nombre del objeto del pozo, por ejemplo "obj_pozo0"
y borrar el "obj_pozo" y dejar nomas el numero y bueno eso se haría con todos tus pozos automaticamente
para hacerlo eliminas los primeros 8 caracteres del nombre usando string_delete()*/
global.nPozos=5;//numero de objetos pozo
global.Pozos=[ string_delete( object_get_name(object_index), 0, 8 ) ]=id;
[/gml]

Entonces en el objeto que quieras checar si los pozos están llenos haces esto.
[gml]
for(i=0; i<global.nPozos< i+=1)(
     if ( !global.Pozos.lleno ){
            //Aquí lo que se hace con el primer pozo vació.
            break;
     }
     //Aquí lo que se hace con los pozos llenos
}
[/gml]
Título: Re:Repetir acciones si no se cumple una condición.
Publicado por: francordoba en Febrero 02, 2013, 04:36:10 AM
Cita de: brunoxzx en Febrero 01, 2013, 09:47:28 PM
Wow una vez fui a una clase de programación (a la que nunca regrese) y el ejercicio que pusieron fue uno igual al que preguntas.

Bueno la respuesta está en un bucle, para esté caso un for, si no sabes como funciona buscala en el manual o en google.

Aunque bueno viendo esto supongo que tal vez tu problema no sean los bucles si no que no es posible llamar a objetos por su nombre.

La solución más elegante que se me ocurre es crear un array con los numeros de todos tus pozos, esto lo haría siguiendo estos pasos.

Crear un objeto llamado par_pozo(o como quieras) y asignar a todos los posos como padre a par pozo.

El evento padre de par_pozo pon esté código.
[gml]
/*La función object_get_name devuelve un string con el nombre de un objeto.
Lo que tienes que hacer es obtener el nombre del objeto del pozo, por ejemplo "obj_pozo0"
y borrar el "obj_pozo" y dejar nomas el numero y bueno eso se haría con todos tus pozos automaticamente
para hacerlo eliminas los primeros 8 caracteres del nombre usando string_delete()*/
global.nPozos=5;//numero de objetos pozo
global.Pozos=[ string_delete( object_get_name(object_index), 0, 8 ) ]=id;
[/gml]

Entonces en el objeto que quieras checar si los pozos están llenos haces esto.
[gml]
for(i=0; i<global.nPozos< i+=1)(
     if ( !global.Pozos.lleno ){
            //Aquí lo que se hace con el primer pozo vació.
            break;
     }
     //Aquí lo que se hace con los pozos llenos
}
[/gml]



Aquí hay algo que va mal porque al poner el "for" me marca algo en rojo. ¿Puede haber alguna errata?
Título: Re:Repetir acciones si no se cumple una condición.
Publicado por: francordoba en Febrero 02, 2013, 04:45:04 AM
Los nombres los obtuve con un array que además va llamando en el "for" a su variable interna de cada pozo.

Tuve que tirar de varias cosas y vuestra info y al final lo conseguí.

Gracias a todos por vuestro interés y vuestra paciencia y espero que esto ayude a mejorar a los makeros.
Título: Re:Repetir acciones si no se cumple una condición.(RESUELTO)
Publicado por: brunoxzx en Febrero 02, 2013, 07:59:24 AM
Cita de: francordoba en Febrero 02, 2013, 04:45:04 AM
Los nombres los obtuve con un array que además va llamando en el "for" a su variable interna de cada pozo.

Tuve que tirar de varias cosas y vuestra info y al final lo conseguí.

Gracias a todos por vuestro interés y vuestra paciencia y espero que esto ayude a mejorar a los makeros.
Que  bueno que lo resolviste  :-[. El problema del for fue que escribí un ">" en lugar de un ";", jeje el teclado estaba en ingles y se me paso.