casilleros libres/ocupados

Started by Hola, October 12, 2010, 11:31:20 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

DCelso

A ver si esto te vale. Son dos funciones. dados dos puntos que comparten una misma coordenada "Y" comprueba que no hay obstaculos en la matriz casillas. Y la segunda hace lo mismo pero con dos puntos que comparten una misma coordenada "X"

Function sepuedellegar_en_x(x_inicial,x_final,y)
private
   origen, destino;
begin
  if (x_inicial < x_final)
     origen=x_inicial;
     destino = x_final;
  else
     origen = x_final;
     destino =x_inicial;
  end
  FROM x = origen TO destino;
    IF ( casillas [ x ] [ y ] != 0 )
      RETURN FALSE; //si pilla un obstaculo, devuelve false, osea que no se puede realizar el movimiento
    END     
  END
 
  RETURN TRUE; //si llega a este punto es por que el camino está libre, es decir puede realizar el movimiento
end

Function sepuedellegar_en_y(y_inicial,y_final,x)
private
   origen, destino;
begin
  if (y_inicial < y_final)
     origen=y_inicial;
     destino = y_final;
  else
     origen = y_final;
     destino =y_inicial;
  end
  FROM y = origen TO destino;
    IF ( casillas [ x ] [ y ] != 0 )
      RETURN FALSE; //si pilla un obstaculo, devuelve false, osea que no se puede realizar el movimiento
    END     
  END
 
  RETURN TRUE; //si llega a este punto es por que el camino está libre, es decir puede realizar el movimiento
end
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

Hola

#16
Como llamo a esa funcion? if(sepuedellegar_en_y(x_inicial,x_final,x)==1) etc.,?

PD: Windgate, te he enviado un mensaje privado.

Windgate

Lo siento... Ese código me hace saltar las lágrimas, todo mayúsculas, sin comentarios, sin tabulados, sin espaciado, comprobaciones que pueden resumirse en una instrucción...

IF(BOARD[DESX][DESY]<>12 AND BOARD[DESX][DESY]<>1 AND BOARD[DESX][DESY]<>2 AND BOARD[DESX][DESY]<>3 AND BOARD[DESX][DESY]<>4 AND BOARD[DESX][DESY]<>5 AND BOARD[DESX][DESY]<>6)
IF(BOARD[DESX][DESY]<>7 AND BOARD[DESX][DESY]<>8 AND BOARD[DESX][DESY]<>9 AND BOARD[DESX][DESY]<>10 AND BOARD[DESX][DESY]<>11)


No me atrevo a meter mano, ¿Lo estás haciendo por tu cuenta o para un trabajo?, te lo digo por pedir ayuda a tu profesor personalmente... La solución está en usar un FROM, lo de DCelso sería perfecto.
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

DCelso

Quote from: Hola on October 14, 2010, 04:28:14 PM
Como llamo a esa funcion? if(sepuedellegar_en_y(x_inicial,x_final,x)==1) etc.,?

PD: Windgate, te he enviado un mensaje privado.
Pues mas o menos.
A ver, con ejemplo práctico, te encuentras en la casilla (2,1), hay un obstáculo en la casilla (4,1), y quieres llegar a la (5,1)
pues como ves la "y" permanece fija entonces estás buscando en la "x", así que llamarias a sepuedellegar_en_x.
La llamada sería la siguiente:

if (sepuede_llegar_en_x(2,5,1))
   // me muevo a la casilla (5,1)
else
  // muestro mensaje de error
end

Quote from: Windgate on October 14, 2010, 07:17:25 PM
Lo siento... Ese código me hace saltar las lágrimas, todo mayúsculas, sin comentarios, sin tabulados, sin espaciado, comprobaciones que pueden resumirse en una instrucción...

IF(BOARD[DESX][DESY]<>12 AND BOARD[DESX][DESY]<>1 AND BOARD[DESX][DESY]<>2 AND BOARD[DESX][DESY]<>3 AND BOARD[DESX][DESY]<>4 AND BOARD[DESX][DESY]<>5 AND BOARD[DESX][DESY]<>6)
IF(BOARD[DESX][DESY]<>7 AND BOARD[DESX][DESY]<>8 AND BOARD[DESX][DESY]<>9 AND BOARD[DESX][DESY]<>10 AND BOARD[DESX][DESY]<>11)


No me atrevo a meter mano, ¿Lo estás haciendo por tu cuenta o para un trabajo?, te lo digo por pedir ayuda a tu profesor personalmente... La solución está en usar un FROM, lo de DCelso sería perfecto.
ostia, que guapo el código, :D, Hola te recomiendo que le pases el bennuindent mío o de splinter. :D
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

Hola

Bueno, lo hice como dijo DCelso, hice la funcion y la llamada a la funcion, al principio no me funcionaba, tenia un problema con la variable del FROM, que siempre permanecia en cero, no realizaba comprobaciones y ya estaba escribiendo aqui el proximo mensaje preguntando como solucionarlo jeje, pero antes de enviar el mensaje me puse a probar una ultima cosa y me salio xD

if (x_inicial < x_final)
     origen=x_inicial;
     destino = x_final;
  else
     origen = x_final;
     destino =x_inicial;
  end


Eso en realidad yo lo habia cambiado por:

  ORIGEN=x_inicial;
  DESTINO=x_final;


Dejandolo asi, no me realizaba comprobaciones, lo unico que tuve que hacer para solucionar el problema es poner ORIGEN=x_inicial+1; y ahi funciono xd

Gracias a todos por su ayuda!  ;D me ha servido mucho.

Arcontus

Prueba el siguiente código:


TAMANOX = tamaño tablaX;
TAMANOY = tamaño tablaY;

PROCESS movimiento (int vector, int x,int y)
PRIVATE
    int indiceX;
    int indiceY;
    int bloqueado;

BEGIN
    //RESET variables
    bloqueado = 0;
    //Comprobamos si el movimiento es horizontal
    if (vector == 1)
        //Recorremos toda la tabla en horizontal desde la posicion indicada.
        for (indiceX = x; indiceX < TAMANOX; indiceX++)
            if (tabla[indiceX][indiceY] != 0)
            bloqueado++;
        END
    //El movimiento es vertical
    ELSE
        //Recorremos toda la tabla en vertical desde la posicion indicada.
        for (indiceY = y; indiceY < TAMANOY; indiceY++)
            if (tabla[indiceX][indiceY] != 0)
            bloqueado++;
        END
    END
    return bloqueado;
END


* Esta funcion retorna 0 en caso de no encontrar casillas ocupadas en dicho vector, y en caso de encontrar casillas ocupadas, el numero de estas.
* Si te interesa limitar el final del vector, pasa por parametros X1, y Y1 y cambias en el "FOR" TAMANO* por X1 o Y1, según te convenga.
* Si te interesa que se pueda hacer la comprobación al reves (descendente) tienes varias maneras de hacerlo. La más facil es añadir una nueva variable de control que ejecute el mismo código que el anterior, sustituyendo > por < y VARIABLE++ por VARIABLE--.

No lo he probado, pero en esencia es lo más sencillo que necesitas para poder hacer la verificación que pides.
También añado que deberías hechar un ojo a los distintos sistemas de bucles (for, while y loop) y entender en que casos se utilizan cada uno de ellos, es básico.

Espero haber servido de ayuda.

Saludos!
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

DCelso

Quote from: Hola on October 15, 2010, 02:19:57 PM
Bueno, lo hice como dijo DCelso, hice la funcion y la llamada a la funcion, al principio no me funcionaba, tenia un problema con la variable del FROM, que siempre permanecia en cero, no realizaba comprobaciones y ya estaba escribiendo aqui el proximo mensaje preguntando como solucionarlo jeje, pero antes de enviar el mensaje me puse a probar una ultima cosa y me salio xD

if (x_inicial < x_final)
     origen=x_inicial;
     destino = x_final;
  else
     origen = x_final;
     destino =x_inicial;
  end


Eso en realidad yo lo habia cambiado por:

  ORIGEN=x_inicial;
  DESTINO=x_final;


Dejandolo asi, no me realizaba comprobaciones, lo unico que tuve que hacer para solucionar el problema es poner ORIGEN=x_inicial+1; y ahi funciono xd

Gracias a todos por su ayuda!  ;D me ha servido mucho.
:), mucha razón tienes se me saltó el detallito de esquivar la casilla donde te encuentras :D,
Entonces para que el código funcione de izquierda a derecha y de derecha a izquierda debería quedar así
if (x_inicial < x_final)
     origen=x_inicial+1;
     destino = x_final;
  else
     origen = x_final;
     destino =x_inicial+1;
  end
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

Hola

Revivo el tema, tengo problemas con la comprobacion de casillas en diagonal.., esta bien puesto esto?

Function sepuedellegar_en_xy(POSX,DESX,POSY,VALOR,DESY)
private
   origen, destino;
   ORIGEN2, DESTINO2;
begin

  ORIGEN=POSX+VALOR;
  DESTINO=DESX;
  ORIGEN2=POSY+VALOR;
  DESTINO2=DESY;

  FROM VX=ORIGEN TO DESTINO;
  FROM VY=ORIGEN2 TO DESTINO2;

    IF ( BOARD [ VX ] [ VY ] != 0 )

      RETURN FALSE; //si pilla un obstaculo, devuelve false, osea que no se puede realizar el movimiento
    END
    END
  END

  RETURN TRUE; //si llega a este punto es por que el camino está libre, es decir puede realizar el movimiento
end


Para comprobar las diagonales, esta bien hecho ese  codigo¿

DCelso

#23

Function sepuedellegar_en_xy(x1,y1,x2,y2)
private
  origenx, destinox;
  origeny, destinoy;
  incremento;
  vx,vy;
begin
 if ( x1 < x2 )
   origenx =x1;
   origeny =y1;
   destinox =x2;
   destinoy =y2;
else
   origenx =x2;
   origeny =y2;
   destinox =x1;
   destinoy =y1;
 end

 if (origeny < destinoy )
   incremento = 1;
 else
   incremento = -1;
 end
 vy = origeny;
 FROM VX=ORIGENx TO DESTINOx;
   IF ( BOARD [ VX ] [ VY ] != 0 )
     RETURN FALSE; //si pilla un obstaculo, devuelve false, osea que no se puede realizar el movimiento
   END
   vy=vy+incremento;
 END
 RETURN TRUE; //si llega a este punto es por que el camino está libre, es decir puede realizar el movimiento
end
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

Windgate

DCelso, a lo tuyo le falta algún paréntesis, lo de Hola aisladamente lo veo bien, siempre y cuando no haya nombres de privadas/globales/procesos iguales o algo así se ve correcto.
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

DCelso

sip, es verdad, puto mayor que y menor que, que se creía el editor que eran inicio y o fin de secciones html :D.
En cuanto al código de hola, no está nada bien, no puedes hacer un from anidado porque recorres n*m veces la matriz.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

Hola

Gracias DCelso, funciono de maravilla.

DCelso

de na, ahora te falta entenderlo :D
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

Windgate

Dale un karma, ¿No ves que está abriendo el pico para comérselo?
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

DCelso

Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/