Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: binaryum en 25 Julio 2010, 06:42 am



Título: Intercambiar elementos de lugar en una matriz
Publicado por: binaryum en 25 Julio 2010, 06:42 am
Hola que tal , pues mi duda es esa tengo que hacer un "puzzle" de numeros para que el usuario los ordene en forma creciente y el espacio en blanco quede en la esquina inferior derecha ...

Esto es lo que llevo hasta ahora .

Esta hecho en Dev c++ , pero es C .

Código
  1.  
  2. #include <stdio.h>
  3. #include <conio.h>
  4. #include <stdlib.h>
  5. #include <time.h>
  6. #define  TAM 12
  7. void ordenado (int,int,int M[TAM][TAM]);
  8. void desordenar (int,int,int M[TAM][TAM]);
  9. void jugar (int,int,int M[TAM][TAM]);
  10. main ()
  11. {
  12.  int u=0;
  13.  int i,x,a=1,menu;
  14.  int M[TAM][TAM];
  15.  int columnas,filas;
  16.  
  17.  do
  18.  {
  19.  printf ("Introduzca las filas de la matriz:  ");
  20.  scanf  ("%d",&filas);
  21.  if(filas<3 || filas>12)
  22.        {
  23.            printf("\nError. El orden debe estar entre 3 y 12");
  24.            getch();
  25.            system("cls");
  26.        }
  27.  }
  28.  while (filas<3 || filas>12);
  29.  
  30.  do
  31.  {
  32.  printf ("\nIntroduzca las columnas de la matriz: ");
  33.  scanf  ("%d",&columnas);
  34.    if(columnas<3 || columnas>12)
  35.    {
  36.            printf("\nError. El orden debe estar entre 3 y 12");
  37.            getch();
  38.            system("cls");
  39.        }
  40.  }
  41.  while (columnas<3 || columnas >12);
  42.  
  43.  
  44. ordenado (filas,columnas,M);
  45.    printf ("\n\n");
  46.    desordenar (filas,columnas,M);
  47.    jugar (filas,columnas,M);
  48.  
  49.  
  50. getch ();
  51. }
  52. //-------------------------------------------------------------------------------
  53. void ordenado (int filas,int columnas, int M[TAM][TAM])
  54. {
  55.   int i,x,a=1;;
  56.  for (i=0;i<filas;i++)
  57.    {
  58.  for (x=0;x<columnas;x++)  
  59. {  
  60.                if ((i==filas-1) && (x==columnas-1))
  61. {
  62.  M[i][x]=0;      
  63.        }
  64.        else
  65. {
  66.                  M[i][x]=a;
  67.  a++;
  68.                }  
  69.            }
  70. }
  71.  
  72.   for (i=0;i<filas;i++)
  73.   {
  74.  
  75.     printf ("\n");
  76.     for (x=0;x<columnas;x++)
  77.  {    if ((i==filas-1) && (x==columnas-1))
  78.       {
  79. printf ("%4c",' ');  
  80.               }
  81.               else
  82.               printf ("%4d",M[i][x]);
  83.  
  84.  }
  85.  printf ("\n");
  86.   }
  87.  
  88. }
  89. //--------------------------------------------------------------------------------  
  90.  
  91. void desordenar (int filas,int columnas,int M[TAM][TAM])
  92.  
  93. {
  94.      srand (time(NULL));
  95.     int i,x,g,temp,y;
  96.     temp = (filas*columnas)-1;
  97.     for(i=0; i<filas; i++)
  98.    {
  99.      for(g=0; g<columnas; g++)
  100.      {
  101.        M[i][g] = 0;
  102.      }
  103.    }
  104.  
  105.    for(i=1; i<=temp; i++)
  106.   {
  107.      do
  108.     {
  109.      y = rand() % filas;
  110.      x = rand() % columnas;
  111.     }
  112.     while(M[y][x]);
  113.     M[y][x]=i;
  114.   }
  115.      printf("\n");  
  116.     for(i=0; i<filas; i++)
  117.     {
  118.       for(g=0; g<columnas; g++)
  119.       {
  120.         if (M[i][g]==0)
  121.         {
  122.       printf ("%4c",' ');  
  123.         }
  124.         else
  125.         {
  126.           printf("%4d",M[i][g]);
  127.         }
  128.       }
  129.         printf("\n\n");
  130.     }
  131. }
  132.  
  133.  
  134. //-----------------------------------------------------------------------
  135. void jugar(int filas, int columnas, int M[TAM][TAM])
  136. {
  137.    int movimiento=0;
  138.    int auxFila=0;
  139.    int auxColumna=0;
  140.    int aux=0;
  141.    int aux2=0;
  142.    double tiempoTotal=0;
  143.  
  144.    printf("\n\n");
  145.    do
  146.    {
  147.  
  148.  
  149.        for(int x=0; x<filas; x++)
  150.        {
  151.            for(int y=0; y<columnas; y++)
  152.            {
  153.                if(M[x][y]==0)
  154.                {
  155.                    printf("  \t");
  156.                    auxFila=x;
  157.                    auxColumna=y;
  158.                }
  159.                else
  160.                {
  161.                    printf("%d\t",M[x][y]);
  162.                }
  163.            }
  164.            printf("\n\n");                    
  165.        }
  166.  
  167.        do
  168.        {
  169.            movimiento=getch();
  170.        }while((movimiento!=72)&&(movimiento!=75)&&(movimiento!=77)&&(movimiento!=80));
  171.  
  172.        switch(movimiento)
  173.        {
  174.            case 72:
  175.            {
  176.                if(auxFila+1==filas)
  177.                {
  178.                    printf("Movimiento Invalido");
  179.                    getch();
  180.                }
  181.  
  182.                else
  183.                {
  184.                    aux2=auxFila+1;
  185.                    aux=M[auxFila][auxColumna];
  186.                    M[auxFila][auxColumna]=M[aux2][auxColumna];
  187.                    M[aux2][auxColumna]=aux;
  188.                }
  189.                break;
  190.            }
  191.  
  192.            case 77:
  193.            {
  194.                if(auxColumna-1==-1)
  195.                {
  196.                    printf("Movimiento Invalido");
  197.                    getch();
  198.                }
  199.  
  200.                else
  201.                {
  202.                    aux2=auxColumna-1;
  203.                    aux=M[auxFila][auxColumna];
  204.                    M[auxFila][auxColumna]=M[auxFila][aux2];
  205.                    M[auxFila][aux2]=aux;
  206.                }
  207.                break;
  208.            }
  209.  
  210.            case 75:
  211.            {
  212.                if(auxColumna+1==columnas)
  213.                {
  214.                    printf("Movimiento Invalido");
  215.                    getch();
  216.                }
  217.  
  218.                else
  219.                {
  220.                    aux2=auxColumna+1;
  221.                    aux=M[auxFila][auxColumna];
  222.                    M[auxFila][auxColumna]=M[auxFila][aux2];
  223.                    M[auxFila][aux2]=aux;
  224.                }
  225.                break;
  226.            }
  227.  
  228.            case 80:
  229.            {
  230.                if(auxFila-1==-1)
  231.                {
  232.                    printf("Movimiento Invalido");
  233.                    getch();
  234.                }
  235.                else
  236.                {
  237.                    aux2=auxFila-1;
  238.                    aux=M[auxFila][auxColumna];
  239.                    M[auxFila][auxColumna]=M[aux2][auxColumna];
  240.                    M[aux2][auxColumna]=aux;
  241.                }
  242.                break;
  243.            }
  244.        }
  245.        system("cls");
  246.    } while(!ordenado(filas,columnas,M));
  247.  
  248.    printf("\nFelicidades has ganado!!!!");
  249. }
  250.  
  251.  

Cuando trato de compilar me da este error

in function void jugar (int,int,int(*)[12])
could no convert ordenado (filas,columnas,M) to bool
in argument to unary !

Por favor hay alguien que me pueda ayudar ?


Título: Re: Intercambiar elementos de lugar en una matriz
Publicado por: do-while en 25 Julio 2010, 07:34 am
¡Buenas!

El problema esta en la definicion de la funcion ordenado:
Código
  1. void ordenado (int filas,int columnas, int M[TAM][TAM])
  2. {
  3.   int i,x,a=1;;
  4.  for (i=0;i<filas;i++)
  5.    {
  6.  for (x=0;x<columnas;x++)  
  7. {  
  8.                if ((i==filas-1) && (x==columnas-1))
  9. {
  10.  M[i][x]=0;      
  11.        }
  12.        else
  13. {
  14.                  M[i][x]=a;
  15.  a++;
  16.                }  
  17.            }
  18. }
  19.  
  20.   for (i=0;i<filas;i++)
  21.   {
  22.  
  23.     printf ("\n");
  24.     for (x=0;x<columnas;x++)
  25.  {    if ((i==filas-1) && (x==columnas-1))
  26.       {
  27. printf ("%4c",' ');  
  28.               }
  29.               else
  30.               printf ("%4d",M[i][x]);
  31.  
  32.  }
  33.  printf ("\n");
  34.   }
  35.  
  36. }
  37.  

Que es de tipo void, y la has definido para inicializar la matriz, pero luego, al parecer estas intentando utilizarla para comprobar si se ha terminado el juego, lo cual no es correcto.

¡Saludos!


Título: Re: Intercambiar elementos de lugar en una matriz
Publicado por: binaryum en 25 Julio 2010, 16:22 pm
Tienes razón. Y entonces me ayudarías con alguna condición para comprobar si el juego esta hecho ? por favor , no se me ocurre más nada


Título: Re: Intercambiar elementos de lugar en una matriz
Publicado por: do-while en 25 Julio 2010, 18:35 pm
¿¿¿¿¿¿¿Como???????

Estoy emepezando a pensar que este codigo no lo has escrito tu. Si lo hubieses echo, sabrias perfectamente que es lo que tienes que hacer para corregirlo, ya que es bien sencillo (solo requiere cambiar un sentencia y añadir una funcion). En la explicacion que te he dado antes tambien se encuentra la solucion.

¡Saludos!


Título: Re: Intercambiar elementos de lugar en una matriz
Publicado por: mk_137 en 25 Julio 2010, 22:15 pm
Tienes razón. Y entonces me ayudarías con alguna condición para comprobar si el juego esta hecho ? por favor , no se me ocurre más nada
xDDD
para no ocurrirsete nada te has currado el programa...