encontrar el ultimo valor de la matriz recorrida

Iniciado por caos, 3 Marzo 2014, 21:05 PM

0 Miembros y 1 Visitante están viendo este tema.

caos

Buenos dias, yo soy nuevo en el ámbito de C, he empezado a programar hace relativamente poco, he visto en otro tema algo similar a esto, pero no consigo que el programa me diga el ultimo valor de la tabla que ha recorrido  una bola.

El programa quiero que conste de una matriz de ceros y unos, donde los ceros son espacios en blanco y los unos obstáculos.

  int matriz[10][10]={
  {0,0,0,0,0,0,0,0,0,0},
  {0,1,0,0,1,0,0,0,1,0},
  {0,1,0,1,0,0,0,1,0,0},
  {0,1,0,0,0,0,1,0,0,0},
  {0,0,0,0,0,0,0,0,0,1},
  {0,1,1,1,1,0,0,0,1,0},
  {0,0,0,0,0,0,0,1,0,0},
  {0,0,0,0,0,0,1,0,0,0},
  {0,0,0,0,0,1,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0},
  };

una vez tenemos esto se tiene que tirar una "bola" desde la parte superior de la tabla y que llegue a la parte inferior de la misma, evadiendo los obstáculos según se ha declarado anteriormente si es derecha o izquierda. Tengo este texto:

                         while(i<49){
                            if (matriu[i+1][j]==0)
      matriz[++i][j]=cont++;
    else if (direccion=='D' || direccion=='d' && matriu[i][j+1]==0 )
      matriz[i][++j];
    else if (direccion=='D' || direccion=='d' && matriu[i][j+1]==1 )
      matriz[i][--j];
    else if (direccion=='I' || direccion=='i' && matriu[i][j-1]==0)
      matriz[i][--j];
    else if (direccion=='I' || direccion=='i' && matriu[i][j-1]==1)
      matriz[i][++j];[/table]


A partir de aqui no encuentro la forma de que el programa me diga cual es la ultima coordenada de la matriz conde llega una "bola" que ha sido lanzada desde la parte superior.

Agradezco sus comentarios :)


People95

Jordiiii te pillé jajajaja, suerte con esto!

leosansan

#2
Cita de: People95 en  3 Marzo 2014, 21:20 PM
Jordiiii te pillé jajajaja, suerte con esto!

Pues parece que si va a tener suerte.

Añades justo la línea del printf que te indico en el código e incluyes la nueva variable "colum_final" en la función pelota:


Código (cpp) [Seleccionar]

  void pelota (int matriu[50][50]){

int inicio,i,j,cont=0,colum_final;   /** NUEVA VARIABLE **/
.....................................
   else if (direccion=='I' || direccion=='i' && matriu[i][j-1]==1)
     matriu[i][++j]=cont++;
 }
 colum_final=j+1; /** ESTA VARIABLE **/
 for(i=0;i<50;i++)
 {
    printf("\t\t");
    for(j=0;j<50;j++)
     {
        if(matriu[i][j]==1)
           printf("X ");
        else if(matriu[i][j]==0 )
           printf(". ");
        else
           printf("%d ",matriu[i][j]-2);
    }
    printf("\n");
 }
 printf ("\n\t\tColumna Final= %d\n",colum_final); /** <==ESTA LINEA **/
}

void cambiartabla (int matriu[50][50]){


Por cierto, mirar donde salen los errores y warnings y veréis que os sobran multitud de variables no usadas y falta el return 0 de la función main, entre otras lindeces.

¡¡¡¡ Saluditos! ..... !!!!



caos

leosansan, te agradezco la aportación, me ha ayudado en cantidad, muchas gracias   ;D

leosansan

Cita de: caos en  3 Marzo 2014, 23:23 PM
leosansan, te agradezco la aportación, me ha ayudado en cantidad, muchas gracias   ;D

De nada amigo Jordi, aquí estamos para eso, ayudar dentro de nuestras posibilidades y más cuando se ha currado previamente.

¡¡¡¡ Saluditos! ..... !!!!



Yoel Alejandro

Sería muy interesante hacer la animación de la pelota rebotando (refrescamiento de pantalla cuadro a cuadro y con pausa entre ellos), al estilo de un videojuego  :laugh:

¿alguien se atreve?
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)

leosansan

Cita de: yoel_alejandro en  5 Marzo 2014, 21:24 PM
Sería muy interesante hacer la animación de la pelota rebotando (refrescamiento de pantalla cuadro a cuadro y con pausa entre ellos), al estilo de un videojuego  :laugh:

¿alguien se atreve?

¿Me estas llamando gallina?.

Es una broma, ¡¡¡Ehhh...!!!.

Algo rápido que esto cada vez se parece más a una competición de partidas de ajedrez contra reloj.
Insisto, rápido y hecho a bote pronto sin tan siquiera analizar en profundidad el código:

Código (cpp) [Seleccionar]

#include <stdio.h>
#include <windows.h>

void imprimir (int matriu[50][50]);
void pelota (int matriu[50][50]);
void cambiartabla (int matriu[50][50]);

int main()
{
//system( "MODE 110,150");
int num;
int matriu[50][50]={
{0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0},
{0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
};

while(num!=5)
{
printf("\n");
   printf("Que acci\xa2n desea realizar:\n");
printf("\t1.- Mostrar la tabla.\n");
printf("\t2.- Tirar una bola.\n");
printf("\t3.- Tirar 20 bolas.\n");
printf("\t4.- Cambiar la tabla.\n");
printf("\t5.- Salida.\n");
scanf("%d",&num);
switch(num)
{
case 1:
       imprimir (matriu);
break;
case 2:
pelota (matriu);
break;
case 3:
printf("caso 3\n");
break;
case 4:
cambiartabla (matriu);
break;
case 5:
printf("Adios.\n");
printf("\n");
break;
default:
printf("El n\xA3mero introducido no pertenece al menos, int\x82ntelo de nuevo.\n");
}
}
return 0;
}


void imprimir (int matriu[50][50]){
int i,j;
for (i = 0; i < 50; i++){
for (j = 0; j < 50; j++){
     if(matriu[i][j]==1)
       printf("X");
     else
       printf(".");
   }
printf ("\n");
}
}

void pelota (int matriu[50][50]){

int inicio,i,j,cont=0,colum_final;
char direccion;

do{
   printf("\nIntroducir el n\xA3mero de columna por el cual desea lanzar la primera bola (1-50): ");
   scanf("%d",&inicio);
 }while(inicio>=51);
 inicio--;

 do{
   printf("\nEn caso de encontrarse con un obst\xAculo, en que direcci\xA2n\nquiere que se dirija la bola, derecha (D-d) o izquierda (I-i): ");
   scanf(" %c", &direccion);
 }while(direccion!='D' && direccion!='d' && direccion!='I' && direccion!='i');

 i=0,j=inicio,cont=2;
 matriu[i][j]=cont++;

 while(i<49){
   if (j==-1)
   matriu[i][++j]=cont++;
   else if (j==50)
 matriu[i][--j]=cont++;
   else if (matriu[i+1][j]==0)
     matriu[++i][j]=cont++;
   else if ((direccion=='D' || direccion=='d') && matriu[i][j+1]==0 )
     matriu[i][++j]=cont++;
   else if ((direccion=='D' || direccion=='d') && matriu[i][j+1]==1 )
     matriu[i][--j]=cont++;
   else if ((direccion=='I' || direccion=='i') && matriu[i][j-1]==0)
     matriu[i][--j]=cont++;
   else if ((direccion=='I' || direccion=='i') && matriu[i][j-1]==1)
     matriu[i][++j]=cont++;
 }
 colum_final=j+1;
 system ("cls");
 gotoxy (0,0);
 for(i=0;i<50;i++)
 {
    for(j=0;j<50;j++)
     {
        if(matriu[i][j]==1){
          color (191);
          gotoxy (j,i);
          printf("X");
          color (7);
        }

        else {
          color (114);
          gotoxy (j,i);
          printf(".");
          color (7);
        }
    }
    printf("\n");
 }
 gotoxy (0,0);
 for(i=0;i<50;i++)
 {
    for(j=0;j<50;j++)
     {
       if(matriu[i][j]!=1  && matriu[i][j]!=0){
          color (206);
          gotoxy (j,i);
          printf("%d",0);
          color (7);
          Sleep (750);
        }
    }
    printf("\n");
 }
 printf ("\n\t\tColumna Final= %d\n",colum_final);
}


void cambiartabla (int matriu[50][50]){

int i,j,fila,columna;
char seguir;
while(seguir!=2)
{
printf("\n");
   printf("Presiona 1 si quieres seguir cambiando valores.\n");
printf("Presiona 2 si quieres ver la tabla.\n");
scanf("%c",&seguir);
switch(seguir)
{
case '1':

do{
             printf("\nIntroducir la fila del valor que quieres cambiar (1-50): ");
             scanf("%d",&columna);
             printf("\nIntroducir la columna del valor que quieres cambiar (1-50): ");
             scanf("%d",&fila);

}while(columna>=51 && fila>=51 );
         i=columna,j=fila;
         if (matriu[i][j] == 0)
           matriu[i][j] = 1;
         break;

case '2':

         for(i=0;i<49;i++)
           for(j=0;j<48;j++)
             if (matriu[i][j]==1 && matriu[i+1][j+1]==1 && matriu[i][j+2]==1)
           puts("ERROR NO SE HA HECHO NINGUN CAMBIO");
           matriu[columna][fila] = 0;

       for(i=0;i<50;i++)
       {
          ///printf("\t\t");
           for(j=0;j<50;j++)
           {
              if(matriu[i][j]==1)
                 printf("X  ");
              else if(matriu[i][j]==0 )
                 printf(".  ");
          }
          printf("\n");
       }
       break;
     default:
printf("El n\xA3mero introducido es incorrecto.\n");

}
}
}

/***********************************************/
           /***   FUNCION COLOR   ***/
 /***********************************************/

void color (int n)
{
       SetConsoleTextAttribute(GetStdHandle (STD_OUTPUT_HANDLE), n );
}

/***********************************************/
           /***   FUNCION GOTOXY   ***/
 /***********************************************/

int gotoxy(int x, int y)
{
  COORD coord;
  HANDLE h_stdout;
  coord.X = x;
  coord.Y = y;
  if ((h_stdout = GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE)
     return 0;
  if (SetConsoleCursorPosition(h_stdout, coord) == 0)
     return 0;
  return 1;
}



Elegid 2=partida y ahí introducir los datos, columna de lanzamiento y desvío derecha o izquierda, a no ser que se cierre y tiende al otro lado.

El resultado, para verlo en movimiento,es  ejecutando el programa:



¡¡¡¡ Saluditos! ..... !!!!



Yoel Alejandro

#7
COOL !!!!!!!!!!!

Mira, tengo que hacerle unos ajustes para correrlo en Linux pues como sabes no sirve windows.h. En particular, cambiar los métodos color() y gotoxy() que controlan aspectos de la terminal, para que funcionen en base a secuencias de escape.

Por cierto una curiosidad, ¿por qué no codificaste esos métodos basados en servicios de BIOS, que es como creo están implementados en conio (hasta donde tengo recuerdo, con los viejos compiladores de Borland 16bits y 32bits que usé alguna vez para Windows)?

Leo, se me ocurre que una forma de ampliar el programa, sería habilitar las teclas de flecha, para uno poder conducir la pelota por en medio de los obstáculos, algo como mini-pinball. Me ofrecería a hacer algo de esa parte, puesto que ya tú ya hiciste lo primero, jeje (complementarnos en vez de competir) ....
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)

leosansan

#8
Cita de: yoel_alejandro en  6 Marzo 2014, 16:38 PM
COOL !!!!!!!!!!!
...................................................
Leo, se me ocurre que una forma de ampliar el programa, sería habilitar las teclas de flecha, para uno poder conducir la pelota por en medio de los obstáculos, algo como mini-pinball. Me ofrecería a hacer algo de esa parte, puesto que ya tú ya hiciste lo primero, jeje (complementarnos en vez de competir) ....


¡¡¡Eso es hacer trampas!!!

Desde que encuentre un hueco me pongo a ello. Lo que pasa es que las API de Windows son muy .... muy ...oscuras.

Podía haber usado conio2.h, que tengo instalada y en alguna que otra ocasión uso,  para el color y el gotoxy ......pero paso de regresar al pasado.

Perdona que no ponga nada en Linux pero ya pase por el MS-DOS y paso de dar ni un pasito atrás, con perdón para sus seguidores.


¡¡¡¡ Saluditos! ..... !!!!



Yoel Alejandro

#9
Jajaja, ¿MS-DOS?. De buena intención te digo que deberías aventurarte a conocer el Linux, cuando lo domines no querrás dejarlo. Te voy a poner un ejemplo, quieres inspeccionar en el directorio actual todos los ficheros cuyo nombre empieza con "abc" y hayan sido modificados hace menos de 10m. Con una simple orden bash (la consola de Linux):

find . -name "abc*" -mmin -10

¿y cómo lo harías así de rápido en Win?

Bueno pero volviendo al tema, al final quedé un poco frustrado porque no logré el comportamiento deseado. Me hubiera gustado que la bola siguiera un movimiento continuo en una dirección dada y al pulsar una tecla de flecha cambiara la dirección. Pero esto tiene un inconveniente, y es que la pulsación de dichas flechas sería asíncrona, es decir, no sabes cuándo va a suceder. Si haces algo como:

Sleep(500);
c = getch();

sería un error porque se quedaría "colgado" tras cada movimiento pidiendo tecla.

Lo ideal aquí sería un "servicio" o "demonio", es decir un programa que corre paralelo al principal, en segundo  plano, y su labor sería inspeccionar si hay caracteres no leídos en el búfer de teclado. En ese caso, los extrae e interpreta: si es un carácter de flecha, cambia la dirección de la bola. Si no hay caracteres disponibles no hacer nada.

Hasta lo que tengo entendido la función getch() no funciona de este modo porque es "bloqueante", es decir bloquea el programa llamador hasta que se reciba un carácter. En los sistemas conformes a POSIX este comportamiento se puede modificar para que espere un tiempo dado y de no recibir carácter en ese lapso, devuelva al programa principal. En Windows realmente no se cómo se pude imitar este comportamiento (aunque de seguro se puede), imagino que un manera sería crear un "servicio" que inspeccione continuamente el teclado y deposite los caracteres en un búfer virtual. De esta manera al no recibir tecla se bloquearía el programa servicio y no el programa principal.

Finalmente, y para curar en salud, elegí quitar la pausa y pedir tecla siempre  :rolleyes:
O sea, la pelotita se mueve sólo un paso a la vez. Tienes que teclear y teclear para moverla por todo el tablero. Por otro lado, y como no recuerdo la codificación de la teclas de flecha en Windows, decidí hacerlo con las teclas del teclado numérico:

8:  arriba
2:  abajo
4:  izq
6:  der

Si sabes los códigos de las teclas de flecha en Win, modifica el programa en la parte de getch(). En Linux (como es conforme al estándar ECMA) estas teclas se codifican de manera diferente, como "secuencias de escape". De hecho, es bueno saber que supuestamente el único sistema que no acepta secuencias de escape es Windows (?!), o sea, Win es la excepción y no la regla (aunque esa "excepción" copa el 90% del mercado!)

Volviendo al tema, el juego termina cuando hayas alcanzado la fila inferior del tablero, o te hayas excedido del máximo posible de movimientos (le puse un límite de 100, jeje). Sería bueno modificar el tablero para hacer una especie de laberinto ...

El código es multiplataforma, se puede compilar en Linux y en Windows. Para el primer caso debes definir la macro _LINUX, y para el segundo define _WIN. Lo más cómodo es por supuesto en la orden de compilación:

Windows: gcc -o tablero tablero.c -D_WIN
Linux:   gcc -o tablero tablero.c -D_LINUX


Pruébalo y me comentas si le añadimos o quitamos algo (sólo modifiqué la opción 2 del programa, no toqué ni la 3 ni la 4).

NOTA. El parámetro blocked parece redundante (no hace nada) pero está porque en un principio quería hacer que al quedarse bloqueado pidiera tecla para cambiar la dirección, pero como comenté anteriormente no pude al menos en este primer intento.

Aquí el código fuente (pastebin): http://pastebin.com/fDweNAsf
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)