elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Curso de javascript por TickTack


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ayuda con programa urgente!
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 2 3 4 [5] 6 Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda con programa urgente!  (Leído 26,664 veces)
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Ayuda con programa urgente!
« Respuesta #40 en: 30 Diciembre 2013, 14:54 pm »

A mí tampoco me va leo. ¿No tendrás activado el fpermissive?

El error se debe a que has declarado una matriz de 27 elementos por columna, tu le has puesto 27 elementos +caracter nulo.

¿Dónde se mira lo del fpermissive?.

En todo caso la matriz sería de 24x28 para incluir el caracter nulo, aunque luego en la impresión se iría hasta<27, como está, teniendo en cuenta que empezamos a contar de cero.

Pero es muy raro. Tengo activado el modo -Wall y el -pedantic  y no me "canta" nada, ni warnings. :rolleyes: :rolleyes: :rolleyes:

Espero noticias.


Saluditos! ..... !!!!        

REEDITO: No, no tengo activado el modo fpermissive.

Lo raro es que lo ejecuté tanto en Code::Blocks como en Dev-C++ y ninguno se "quejo".

Pero bueno, no deja de ser un error y ya lo he corregido en todos los post.

Gracias por la observación. ;) ;) ;)




« Última modificación: 30 Diciembre 2013, 15:52 pm por leosansan » En línea

vangodp


Desconectado Desconectado

Mensajes: 455



Ver Perfil
Re: Ayuda con programa urgente!
« Respuesta #41 en: 30 Diciembre 2013, 19:54 pm »

a mi si me funciono guardando en .c


En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Ayuda con programa urgente!
« Respuesta #42 en: 4 Enero 2014, 00:01 am »

Añado un código que te resuelve el laberinto buscando la ruta más corta:



Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <windows.h>
  5.  
  6. #define INIX 1
  7. #define INIY 1
  8. #define FINX 22
  9. #define FINY 25
  10. #define MAX_X 24
  11. #define MAX_Y 28
  12.  
  13. void mostrar(char a[][MAX_Y],char *msg);
  14. void color (int n);
  15.  
  16. typedef struct cord
  17. {
  18.    int x,y;
  19. } Cord;
  20.  
  21. typedef struct nodo
  22. {
  23.    int Distancia;
  24.    Cord Posicion;
  25.    char Calculado;
  26.    struct nodo* anterior;
  27. } Nodo;
  28.  
  29. char buscarSolucion(char mapa[][MAX_Y],Cord Ini,Cord Fin);
  30. void MarcarNodo(Nodo* Actual,Nodo* Otro);
  31.  
  32. int main ()
  33. {
  34.  
  35.    char a[MAX_X][MAX_Y]=
  36.    {
  37.        "000000000000000000000000000",
  38.        "012222222222222222222222220",
  39.        "022020200020002000000000020",
  40.        "022202022020202000000000020",
  41.        "020000000020202000000000020",
  42.        "020222220020220200022222220",
  43.        "022000000000000200020000020",
  44.        "022222222222200200020000020",
  45.        "022200000000200222222222000",
  46.        "022222222200200000020002020",
  47.        "022200000020222222222222220",
  48.        "022222222200200000000000020",
  49.        "020000000000222222222222220",
  50.        "022000022200200000000000020",
  51.        "020000000000200222222222220",
  52.        "022222222222222200000000020",
  53.        "020000000000000222222202020",
  54.        "020000000000000200000202020",
  55.        "022222222222222200000202020",
  56.        "000002000000000200002222220",
  57.        "020222222222222222222200000",
  58.        "020000000000000000000222220",
  59.        "022222222222222222222220010",
  60.        "000000000000000000000000000"
  61.    };
  62.    mostrar(a,"LABERINTO");
  63.  
  64.    Cord Inicio;
  65.    Inicio.x = INIX;
  66.    Inicio.y = INIY;
  67.  
  68.    Cord Final;
  69.    Final.x = FINX;
  70.    Final.y = FINY;
  71.  
  72.    buscarSolucion(a,Inicio,Final);
  73.  
  74.    return 0;
  75. }
  76.  
  77. void mostrar(char a[][MAX_Y],char *msg)
  78. {
  79.    system ("cls");
  80.    int i,j;
  81.    for( i=0; i<MAX_X; i++)
  82.    {
  83.        for( j=0; j<MAX_Y-1; j++)
  84.        {
  85.            if ((i==FINX && j==FINY) ||(i==INIX && j==INIY))
  86.                color(215);
  87.            else if (a[i][j]=='X')
  88.                color(125);
  89.            else if (a[i][j]=='0')
  90.                color(175);
  91.            else
  92.                color(7);
  93.            printf("%c ",a[i][j]);
  94.            fflush(stdout);
  95.        }
  96.        putchar('\n');
  97.    }
  98.    color(7);
  99.    printf ("\n\t\t%s\n\n",msg);
  100.    system ("pause");
  101. }
  102.  
  103. void color (int n)
  104. {
  105.    SetConsoleTextAttribute(GetStdHandle (STD_OUTPUT_HANDLE), n );
  106. }
  107.  
  108. char buscarSolucion(char mapa[][MAX_Y],Cord Ini,Cord Fin)
  109. {
  110.    if (Ini.x == Fin.x && Ini.y == Fin.y)
  111.    {
  112.        return 1;
  113.    }
  114.    Cord Actual;
  115.    Actual.x = Ini.x;
  116.    Actual.y = Ini.y;
  117.  
  118.    Nodo* Totales[MAX_X][MAX_Y];
  119.  
  120.    int Nodos = 0;
  121.    int i = 0;
  122.    int j = 0;
  123.  
  124.    for (; i < MAX_X; i++)
  125.    {
  126.        for (j = 0; j < MAX_Y; j++)
  127.        {
  128.            if (mapa[i][j] != '0')
  129.            {
  130.                Totales[i][j] = (Nodo*) malloc(sizeof(Nodo));
  131.                Totales[i][j]->anterior = 0;
  132.                Totales[i][j]->Calculado = 0;
  133.                Totales[i][j]->Distancia = -1;
  134.                Totales[i][j]->Posicion.x = i;
  135.                Totales[i][j]->Posicion.y = j;
  136.                Nodos++;
  137.            }
  138.            else Totales[i][j] = 0;
  139.        }
  140.    }
  141.  
  142.    Totales[Ini.x][Ini.y]->Distancia = 0;
  143.  
  144.    Cord Min;
  145.  
  146.   //mapa[Actual.x][Actual.y] = 'X';
  147.  
  148.    while ((Actual.x != Fin.x || Actual.y != Fin.y) && Nodos != 0)
  149.    {
  150.        // Izquierda
  151.  
  152.        if (Totales[Actual.x-1][Actual.y] && Totales[Actual.x-1][Actual.y]->Calculado == 0)
  153.        {
  154.            MarcarNodo(Totales[Actual.x][Actual.y],Totales[Actual.x-1][Actual.y]);
  155.        }
  156.  
  157.        // Derecha
  158.  
  159.        if (Totales[Actual.x+1][Actual.y] && Totales[Actual.x+1][Actual.y]->Calculado == 0)
  160.        {
  161.            MarcarNodo(Totales[Actual.x][Actual.y],Totales[Actual.x+1][Actual.y]);
  162.        }
  163.  
  164.        // Abajo
  165.  
  166.        if (Totales[Actual.x][Actual.y-1] && Totales[Actual.x][Actual.y-1]->Calculado == 0)
  167.        {
  168.            MarcarNodo(Totales[Actual.x][Actual.y],Totales[Actual.x][Actual.y-1]);
  169.        }
  170.  
  171.        // Arriba
  172.  
  173.        if (Totales[Actual.x][Actual.y+1] && Totales[Actual.x][Actual.y+1]->Calculado == 0)
  174.        {
  175.           MarcarNodo(Totales[Actual.x][Actual.y],Totales[Actual.x][Actual.y+1]);
  176.        }
  177.  
  178.        Totales[Actual.x][Actual.y]->Calculado = 1; //Marcado!
  179.  
  180.        // Buscando un valor de referencia al minimo
  181.  
  182.        for (i = 0; i < MAX_X; i++)
  183.        {
  184.            for (j = 0; j < MAX_Y; j++)
  185.            {
  186.                if (Totales[i][j] && Totales[i][j]->Calculado == 0 && Totales[i][j]->Distancia != -1)
  187.                {
  188.                    Min.x = i;
  189.                    Min.y = j;
  190.                    i = 25;
  191.                    j = 29;
  192.                }
  193.            }
  194.        }
  195.  
  196.        // Buscando la distancia minima
  197.  
  198.        for (; i < MAX_X; i++)
  199.        {
  200.            for (j = 0; j < MAX_Y; j++)
  201.            {
  202.                if (Totales[i][j] && Totales[i][j]->Distancia < Totales[Min.x][Min.y]->Distancia
  203.                    && Totales[i][j]->Distancia != -1 && Totales[i][j]->Calculado == 0)
  204.                {
  205.                    Min.x = i;
  206.                    Min.y = j;
  207.                }
  208.            }
  209.        }
  210.        Actual.x = Min.x;
  211.        Actual.y = Min.y;
  212.        Nodos--;
  213.    }
  214.  
  215.    Nodo* Cosa = Totales[Actual.x][Actual.y];
  216.  
  217.    while (Cosa)
  218.    {
  219.        Actual.x = Cosa->Posicion.x;
  220.        Actual.y = Cosa->Posicion.y;
  221.        mapa[Actual.x][Actual.y] = 'X';
  222.        Cosa = Cosa->anterior;
  223.    }
  224.  
  225.    // borrar
  226.  
  227.    for (i = 0; i < 24; i++)
  228.    {
  229.        for (j = 0; j < 28; j++)
  230.        {
  231.            free(Totales[i][j]);
  232.        }
  233.    }
  234.  
  235.    mostrar(mapa,"Prueba");
  236.  
  237.    return (Nodos != 0);
  238. }
  239.  
  240. void MarcarNodo(Nodo* Actual,Nodo* Otro)
  241. {
  242.    if (Otro->Distancia == -1)
  243.    {
  244.        Otro->Distancia = Actual->Distancia+1;
  245.        Otro->anterior = Actual;
  246.    }
  247.    else if (Actual->Distancia+1 < Otro->Distancia)
  248.    {
  249.        Otro->Distancia = Actual->Distancia+1;
  250.        Otro->anterior = Actual;
  251.    }
  252. }
« Última modificación: 4 Enero 2014, 01:14 am por amchacon » En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
vangodp


Desconectado Desconectado

Mensajes: 455



Ver Perfil
Re: Ayuda con programa urgente!
« Respuesta #43 en: 4 Enero 2014, 02:45 am »

¡waaa eso ya es tecnología punta!
Tengo echo unos pinitos jaja, pero no es nada comparado a esto. XD
Tampoco es a colores como lo de leo y el tuyo.
Un par de ajustes y lo subo si prometéis no reír de mi. ><
Ando algo desanimado pero estoy en ello. :)
Saludos  ;-)

En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Ayuda con programa urgente!
« Respuesta #44 en: 4 Enero 2014, 13:30 pm »

Tampoco es a colores como lo de leo y el tuyo.
Los colores los he copiado totalmente del código de Leo, es un artista.

Y por último, me falta añadir una función que te busca una ruta aleatoria (sin repetir casillas):



Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <windows.h>
  5.  
  6. #define INIX 1
  7. #define INIY 1
  8. #define FINX 22
  9. #define FINY 25
  10. #define MAX_X 24
  11. #define MAX_Y 28
  12.  
  13. void mostrar(char a[][MAX_Y],char *msg);
  14. void color (int n);
  15.  
  16. typedef struct cord
  17. {
  18.    int x,y;
  19. } Cord;
  20.  
  21. typedef struct nodo
  22. {
  23.    int Distancia;
  24.    Cord Posicion;
  25.    char Calculado;
  26.    struct nodo* anterior;
  27.   // struct nodo* siguiente;
  28. } Nodo;
  29.  
  30. char buscarSolucion(char mapa[][MAX_Y],Cord Ini,Cord Fin);
  31. char buscarSolucionAleatoria(char mapa[][MAX_Y],Cord Ini,Cord Fin);
  32. void MarcarNodo(Nodo* Actual,Nodo* Otro);
  33.  
  34. int main ()
  35. {
  36.  
  37.    char a[MAX_X][MAX_Y]=
  38.    {
  39.        "000000000000000000000000000",
  40.        "012222222222222222222222220",
  41.        "022020200020002000000000020",
  42.        "022202022020202000000000020",
  43.        "020000000020202000000000020",
  44.        "020222220020220200022222220",
  45.        "022000000000000200020000020",
  46.        "022222222222200200020000020",
  47.        "022200000000200222222222000",
  48.        "022222222200200000020002020",
  49.        "022200000020222222222222220",
  50.        "022222222200200000000000020",
  51.        "020000000000222222222222220",
  52.        "022000022200200000000000020",
  53.        "020000000000200222222222220",
  54.        "022222222222222200000000020",
  55.        "020000000000000222222202020",
  56.        "020000000000000200000202020",
  57.        "022222222222222200000202020",
  58.        "000002000000000200002222220",
  59.        "020222222222222222222200000",
  60.        "020000000000000000000222220",
  61.        "022222222222222222222220010",
  62.        "000000000000000000000000000"
  63.    };
  64.    mostrar(a,"LABERINTO");
  65.   srand(time(0));
  66.    Cord Inicio;
  67.    Inicio.x = INIX;
  68.    Inicio.y = INIY;
  69.  
  70.    Cord Final;
  71.    Final.x = FINX;
  72.    Final.y = FINY;
  73.  
  74.    buscarSolucion(a,Inicio,Final);
  75.  
  76.   while(1) buscarSolucionAleatoria(a,Inicio,Final);
  77.  
  78.    return 0;
  79. }
  80.  
  81. void mostrar(char a[][MAX_Y],char *msg)
  82. {
  83.    system ("cls");
  84.    int i,j;
  85.    for( i=0; i<MAX_X; i++)
  86.    {
  87.        for( j=0; j<MAX_Y-1; j++)
  88.        {
  89.            if ((i==FINX && j==FINY) ||(i==INIX && j==INIY))
  90.                color(215);
  91.            else if (a[i][j]=='X')
  92.                color(125);
  93.            else if (a[i][j]=='0')
  94.                color(175);
  95.            else
  96.                color(7);
  97.            printf("%c ",a[i][j]);
  98.            fflush(stdout);
  99.        }
  100.        putchar('\n');
  101.    }
  102.    color(7);
  103.    printf ("\n\t\t%s\n\n",msg);
  104.    system ("pause");
  105. }
  106.  
  107. void color (int n)
  108. {
  109.    SetConsoleTextAttribute(GetStdHandle (STD_OUTPUT_HANDLE), n );
  110. }
  111.  
  112. char buscarSolucionAleatoria(char Mapa[][MAX_Y],Cord Ini,Cord Fin)
  113. {
  114.        char mapa[MAX_X][MAX_Y];
  115.    if (Ini.x == Fin.x && Ini.y == Fin.y)
  116.    {
  117.        return 1;
  118.    }
  119.    Cord Actual;
  120.    Actual.x = Ini.x;
  121.    Actual.y = Ini.y;
  122.  
  123.    Nodo* Totales[MAX_X][MAX_Y];
  124.    int i = 0;
  125.    int j = 0;
  126.  
  127.    for (; i < MAX_X; i++)
  128.    {
  129.        for (j = 0; j < MAX_Y; j++)
  130.        {
  131.            mapa[i][j] = Mapa[i][j];
  132.            if (mapa[i][j] != '0')
  133.            {
  134.                Totales[i][j] = (Nodo*) malloc(sizeof(Nodo));
  135.                Totales[i][j]->anterior = 0;
  136.                Totales[i][j]->Calculado = 0;
  137.                Totales[i][j]->Distancia = -1;
  138.                Totales[i][j]->Posicion.x = i;
  139.                Totales[i][j]->Posicion.y = j;
  140.            }
  141.            else Totales[i][j] = 0;
  142.        }
  143.    }
  144.  
  145.    Cord Min;
  146.  
  147.    int Posibilidades = 0;
  148.    Nodo* Aux[4];
  149.  
  150.    while ((Actual.x != Fin.x || Actual.y != Fin.y))
  151.    {
  152.  
  153.        // Izquierda
  154.  
  155.        Posibilidades = 0;
  156.  
  157.        if (Totales[Actual.x-1][Actual.y] && Totales[Actual.x-1][Actual.y]->Calculado == 0)
  158.        {
  159.            Aux[0] = Totales[Actual.x-1][Actual.y];
  160.            Posibilidades++;
  161.        }
  162.  
  163.        // Derecha
  164.  
  165.        if (Totales[Actual.x+1][Actual.y] && Totales[Actual.x+1][Actual.y]->Calculado == 0)
  166.        {
  167.            Aux[Posibilidades] = Totales[Actual.x+1][Actual.y];
  168.            Posibilidades++;
  169.        }
  170.  
  171.        // Abajo
  172.  
  173.        if (Totales[Actual.x][Actual.y-1] && Totales[Actual.x][Actual.y-1]->Calculado == 0)
  174.        {
  175.            Aux[Posibilidades] = Totales[Actual.x][Actual.y-1];
  176.            Posibilidades++;
  177.        }
  178.  
  179.        // Arriba
  180.  
  181.        if (Totales[Actual.x][Actual.y+1] && Totales[Actual.x][Actual.y+1]->Calculado == 0)
  182.        {
  183.           Aux[Posibilidades] = Totales[Actual.x][Actual.y+1];
  184.           Posibilidades++;
  185.        }
  186.  
  187.       Totales[Actual.x][Actual.y]->Calculado = 1; //Marcado!
  188.  
  189.        if (Posibilidades == 0)
  190.        {
  191.            if (!Totales[Actual.x][Actual.y]->anterior) return 0;
  192.  
  193.            int aux_x = Actual.x;
  194.            Actual.x = Totales[Actual.x][Actual.y]->anterior->Posicion.x;
  195.            Actual.y = Totales[aux_x][Actual.y]->anterior->Posicion.y;
  196.        }
  197.        else if (Posibilidades == 1)
  198.        {
  199.                char mapa[MAX_X][MAX_Y];Aux[0]->anterior = Totales[Actual.x][Actual.y];
  200.            Actual.x = Aux[0]->Posicion.x;
  201.            Actual.y = Aux[0]->Posicion.y;
  202.        }
  203.        else
  204.        {
  205.            int n = rand()%Posibilidades;
  206.            Aux[n]->anterior = Totales[Actual.x][Actual.y];
  207.            Actual.x = Aux[n]->Posicion.x;
  208.            Actual.y = Aux[n]->Posicion.y;
  209.        }
  210.    }
  211.    Nodo* Cosa = Totales[Actual.x][Actual.y];
  212.  
  213.    while (Cosa)
  214.    {
  215.        Actual.x = Cosa->Posicion.x;
  216.        Actual.y = Cosa->Posicion.y;
  217.        mapa[Actual.x][Actual.y] = 'X';
  218.        Cosa = Cosa->anterior;
  219.    }
  220. //&mostrar(mapa,"Ruta aleatoria");
  221.    // borrar
  222.  
  223.    for (i = 0; i < 24; i++)
  224.    {
  225.        for (j = 0; j < 28; j++)
  226.        {
  227.            free(Totales[i][j]);
  228.        }
  229.    }
  230.  
  231.    mostrar(mapa,"Ruta aleatoria");
  232.  
  233.    return 1;
  234. }
  235.  
  236. char buscarSolucion(char Mapa[][MAX_Y],Cord Ini,Cord Fin)
  237. {
  238.    char mapa[MAX_X][MAX_Y];
  239.    if (Ini.x == Fin.x && Ini.y == Fin.y)
  240.    {
  241.        return 1;
  242.    }
  243.    Cord Actual;
  244.    Actual.x = Ini.x;
  245.    Actual.y = Ini.y;
  246.  
  247.    Nodo* Totales[MAX_X][MAX_Y];
  248.  
  249.    int Nodos = 0;
  250.    int i = 0;
  251.    int j = 0;
  252.  
  253.    for (; i < MAX_X; i++)
  254.    {
  255.        for (j = 0; j < MAX_Y; j++)
  256.        {
  257.            mapa[i][j] = Mapa[i][j];
  258.            if (mapa[i][j] != '0')
  259.            {
  260.                Totales[i][j] = (Nodo*) malloc(sizeof(Nodo));
  261.                Totales[i][j]->anterior = 0;
  262.                Totales[i][j]->Calculado = 0;
  263.                Totales[i][j]->Distancia = -1;
  264.                Totales[i][j]->Posicion.x = i;
  265.                Totales[i][j]->Posicion.y = j;
  266.                Nodos++;
  267.            }
  268.            else Totales[i][j] = 0;
  269.        }
  270.    }
  271.  
  272.    Totales[Ini.x][Ini.y]->Distancia = 0;
  273.  
  274.    Cord Min;
  275.  
  276.   //mapa[Actual.x][Actual.y] = 'X';
  277.  
  278.    while ((Actual.x != Fin.x || Actual.y != Fin.y) && Nodos != 0)
  279.    {
  280.        // Izquierda
  281.  
  282.        if (Totales[Actual.x-1][Actual.y] && Totales[Actual.x-1][Actual.y]->Calculado == 0)
  283.        {
  284.            MarcarNodo(Totales[Actual.x][Actual.y],Totales[Actual.x-1][Actual.y]);
  285.        }
  286.  
  287.        // Derecha
  288.  
  289.        if (Totales[Actual.x+1][Actual.y] && Totales[Actual.x+1][Actual.y]->Calculado == 0)
  290.        {
  291.            MarcarNodo(Totales[Actual.x][Actual.y],Totales[Actual.x+1][Actual.y]);
  292.        }
  293.  
  294.        // Abajo
  295.  
  296.        if (Totales[Actual.x][Actual.y-1] && Totales[Actual.x][Actual.y-1]->Calculado == 0)
  297.        {
  298.            MarcarNodo(Totales[Actual.x][Actual.y],Totales[Actual.x][Actual.y-1]);
  299.        }
  300.  
  301.        // Arriba
  302.  
  303.        if (Totales[Actual.x][Actual.y+1] && Totales[Actual.x][Actual.y+1]->Calculado == 0)
  304.        {
  305.           MarcarNodo(Totales[Actual.x][Actual.y],Totales[Actual.x][Actual.y+1]);
  306.        }
  307.  
  308.        Totales[Actual.x][Actual.y]->Calculado = 1; //Marcado!
  309.  
  310.        // Buscando un valor de referencia al minimo
  311.  
  312.        for (i = 0; i < MAX_X; i++)
  313.        {
  314.            for (j = 0; j < MAX_Y; j++)
  315.            {
  316.                if (Totales[i][j] && Totales[i][j]->Calculado == 0 && Totales[i][j]->Distancia != -1)
  317.                {
  318.                    Min.x = i;
  319.                    Min.y = j;
  320.                    i = 25;
  321.                    j = 29;
  322.                }
  323.            }
  324.        }
  325.  
  326.        // Buscando la distancia minima
  327.  
  328.        for (; i < MAX_X; i++)
  329.        {
  330.            for (j = 0; j < MAX_Y; j++)
  331.            {
  332.                if (Totales[i][j] && Totales[i][j]->Distancia < Totales[Min.x][Min.y]->Distancia
  333.                    && Totales[i][j]->Distancia != -1 && Totales[i][j]->Calculado == 0)
  334.                {
  335.                    Min.x = i;
  336.                    Min.y = j;
  337.                }
  338.            }
  339.        }
  340.        Actual.x = Min.x;
  341.        Actual.y = Min.y;
  342.        Nodos--;
  343.    }
  344.  
  345.    Nodo* Cosa = Totales[Actual.x][Actual.y];
  346.  
  347.    while (Cosa)
  348.    {
  349.        Actual.x = Cosa->Posicion.x;
  350.        Actual.y = Cosa->Posicion.y;
  351.        mapa[Actual.x][Actual.y] = 'X';
  352.        Cosa = Cosa->anterior;
  353.    }
  354.  
  355.    // borrar
  356.  
  357.    for (i = 0; i < 24; i++)
  358.    {
  359.        for (j = 0; j < 28; j++)
  360.        {
  361.            free(Totales[i][j]);
  362.        }
  363.    }
  364.  
  365.    mostrar(mapa,"Ruta mas corta");
  366.  
  367.    return (Nodos != 0);
  368. }
  369.  
  370. void MarcarNodo(Nodo* Actual,Nodo* Otro)
  371. {
  372.    if (Otro->Distancia == -1)
  373.    {
  374.        Otro->Distancia = Actual->Distancia+1;
  375.        Otro->anterior = Actual;
  376.    }
  377.    else if (Actual->Distancia+1 < Otro->Distancia)
  378.    {
  379.        Otro->Distancia = Actual->Distancia+1;
  380.        Otro->anterior = Actual;
  381.    }
  382. }

El código está chapurreado en pocos tiempo y no es ni bonito ni elegante. Pero funciona perfecto que es lo que importa.

Las dos funciones hacen cosas parecidas:

- Modelan el laberinto en un grafo (sin aristas, puesto que sabemos que todos los nodos tienen siempre 4 conexiones (izquierda,derecha,arriba  y abajo) ).
- Realizan una adaptación de algún algoritmo de grafos. Para el de la ruta más corta es Dijkstra:
Dikstra]http://es.wikipedia.org/wiki/Algoritmo_de_Dijkstra]Dikstra

Y para el de la ruta aleatoria uso una modificación del DFS (Depth First Search). La modificación esque elige las ramas aleatoriamente:
http://es.wikipedia.org/wiki/B%C3%BAsqueda_en_profundidad

El algoritmo finaliza cuando llegan al vértice final, una vez allí "van hacia atrás" pintando el camino hasta el inicio.
« Última modificación: 4 Enero 2014, 13:33 pm por amchacon » En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
vangodp


Desconectado Desconectado

Mensajes: 455



Ver Perfil
Re: Ayuda con programa urgente!
« Respuesta #45 en: 4 Enero 2014, 16:08 pm »

Que dice jaja es un peazo de código jeje
Para que no repitiera el camino, y digo camino sin salida fue hacer una especie de backup del trayecto XD
Primero hice una for para contar todos los números 2 que hay. después  hice un par de tablas con esa cantidad, una para x y una para y.
luego un contador y y le fue grabando a cada vuelta el valor de la posición actual.
Bien...eso solo se activa cuando el punto se encuentra con números 1, o sea ya explorado.
Entonces en ese momento empieza una cuenta atrás del contador y voy imprimiendo lo que había guardado en backupx y backupy :D
Funciona de perfectamente y es capaz de hacer el personaje volver por todo el camino.
Para marcar ese camino lo relleno con ceros, o sea que se vuelve hasta la primera intercesión hasta encontrar un 2 nuevamente y lo rellena el camino sin salida con ceros para no meterse mas por ahí XDD

hay unos bugcitos jaja

Pero bueno, no soy tan bueno con los punteros jaja
Pero hace el apaño.

Bueno lo pongo aquí:
No se compara con el vuestro pero llego al final.
tampoco le hice que se rompiera el bucle así que si me lo vaes a echar como fallo arreglad vosotros jajaja

Código
  1. #include <iostream>
  2. #include <windows.h>
  3. #include <stdio.h>
  4. #include <time.h>
  5.  
  6. # define udir mapa[y-1][x]
  7. # define ldir mapa[y][x-1]
  8. # define rdir mapa[y][x+1]
  9. # define ddir mapa[y+1][x]
  10. # define po mapa[y][x]
  11. using namespace std;
  12.  
  13. const int TAMY = 29;
  14. const int TAMX = 29;
  15.  
  16. int contapasos = 0;
  17.  
  18. void mostrar(char mapa[TAMY][TAMX]){
  19. system ("cls");
  20.  
  21.     for(int y=0;y<29;y++)
  22.     {
  23.     for(int x=0;x<29;x++)
  24.     {
  25.     printf("%c",mapa[y][x]);
  26.     //Sleep(5);
  27.     }
  28.     printf("\n");
  29.     //Sleep(5);
  30.     }
  31.  
  32. }
  33.  
  34. int rand4 (){
  35. srand(time(NULL));
  36. int n = (0 + rand() % 4);
  37. return n;
  38. }
  39.  
  40. void go_up ( char mapa[TAMY][TAMX], int &x , int &y ){
  41. po = '1';
  42. y--;
  43. po = 'X';
  44. }
  45.  
  46. void go_le ( char mapa[TAMY][TAMX], int &x , int &y ){
  47. po = '1';
  48. x--;
  49. po = 'X';
  50. }
  51.  
  52. void go_ri ( char mapa[TAMY][TAMX], int &x , int &y ){
  53. po = '1';
  54. x++;
  55. po = 'X';
  56. }
  57.  
  58. void go_do ( char mapa[TAMY][TAMX], int &x , int &y ){
  59. po = '1';
  60. y++;
  61. po = 'X';
  62. }
  63.  
  64.  
  65. int main (){
  66. //variables iniciales
  67. int pasos = 0;
  68. bool nodir = true;
  69. bool fin = true;
  70. int x = 1; //posicion x inicial
  71. int y = 1; //posicion y inicial
  72. int rand;
  73. char mapa[TAMY][TAMX]={
  74.   //0123456789012345678901234567
  75. "000000000000000000000000000",//0
  76. "020222222222222222222222220",//1
  77. "020200000000000000000000020",//2
  78. "020222222222222200000000020",//3
  79. "020200000000000000000000020",//4
  80. "020222222222222200022222220",//5
  81. "020000000000000200020000020",//6
  82. "020222222222200200000000020",//7
  83. "020200000000200222222222020",//8
  84. "020222222200200000000002020",//9
  85. "020000000200222222222222020",//10
  86. "022222220200000000000000020",//11
  87. "020000020200222222222222220",//12
  88. "020000022200200000000000000",//13
  89. "000000000000200222222222220",//14
  90. "022222222222200200000000020",//15
  91. "020000000000000222222202020",//16
  92. "020000000000000200000202020",//17
  93. "022222222222222200000202020",//18
  94. "000000000000000000000202220",//19
  95. "022222222222222222222200000",//20
  96. "020000000000000000000000000",//21
  97. "02222222222222222222222FIN0",//22
  98. "000000000000000000000000000" //23
  99.  
  100. };
  101. //obtenr cantidad maxima de pasos pocibles.
  102. for ( int fory = 0; fory <= TAMY; fory++  ){
  103. for ( int forx = 0; forx <= TAMX; forx++  ){
  104. if ( mapa[fory][forx] == '2' )
  105. pasos++;
  106. }
  107. }
  108. int xbackup[pasos];
  109. int ybackup[pasos];
  110.  
  111.  
  112. while ( fin ){
  113. while ( udir == '1' || ldir == '1' || rdir == '1' || ddir == '1' ){
  114. if ( udir == '2' || ldir == '2' || rdir == '2' || ddir == '2' ){
  115. break;
  116. }
  117.  
  118. contapasos--;
  119. mapa[y][x]='0';
  120. x = xbackup[contapasos];
  121. y = ybackup[contapasos];
  122. mapa[y][x]='X';
  123. mostrar( mapa );
  124. Sleep ( 100 );
  125. }
  126.  
  127. contapasos++;
  128. xbackup[contapasos]= x;
  129. ybackup[contapasos]= y;
  130.  
  131. if( udir == '2' || ldir == '2' || rdir == '2' || ddir == '2' ){
  132.  
  133. do{
  134.  
  135. rand = rand4();
  136.  
  137.  
  138. if ( udir == '2' && ldir != '2' && rdir != '2' && ddir != '2' ){
  139. go_up( mapa, x, y );
  140. break;
  141. }
  142. else if ( udir != '2' && ldir == '2' && rdir != '2' && ddir != '2' ){
  143. go_le( mapa, x, y );
  144. break;
  145. }
  146. else if ( udir != '2' && ldir != '2' && rdir == '2' && ddir != '2' ){
  147. go_ri( mapa, x, y );
  148. break;
  149. }
  150. else if ( udir != '2' && ldir != '2' && rdir != '2' && ddir == '2' ){
  151. go_do( mapa, x, y );
  152. break;
  153. }
  154.  
  155. else if ( rand == 0 ){
  156. if ( udir == '0' || udir == '1' ){
  157. nodir = true;
  158. break;
  159. }
  160. else {
  161. go_up( mapa, x, y );
  162. nodir = false;
  163. }
  164.  
  165. }
  166. else if ( rand == 1 ){
  167. if ( ldir == '0' || ldir == '1' ){
  168. nodir = true;
  169. break;
  170. }
  171. else {
  172. go_le( mapa, x, y );
  173. nodir = false;
  174. }
  175.  
  176. }
  177. else if ( rand == 2 ){
  178. if ( rdir == '0' || rdir == '1' ){
  179. nodir = true;
  180. break;
  181.  
  182. }
  183. else {
  184. go_ri( mapa, x, y );
  185. nodir = false;
  186. }
  187.  
  188. }
  189. else if ( rand == 3 ){
  190. if ( ddir == '0' || ddir == '1' ){
  191. nodir = true;
  192. break;
  193. }
  194. else {
  195. go_do( mapa, x, y );
  196. nodir = false;
  197. }
  198.  
  199. }
  200.  
  201. }while( nodir );//FIN DOWHILE
  202.  
  203. }//FIN IF
  204. mostrar( mapa );
  205. Sleep ( 100 );
  206. }//FIN DEL LOOP
  207.  
  208. }
  209.  
  210.  

Otra cosa, que me gusta ver la x andando por el mapa jaja
Asi puedo analizar lo que va haciendo XD
As veces se queda un rato parado en una intercesión, eso lo hace hasta que obtiene un numero aleatorio correcto.
Podía mejorarlo pero bua lo dejo así que soy mu vaguito XD
Como dije no es como el vuestro pero me sirve.
Saludos a todos, me lo paso bomba con esos códigos  ;-)

Como diga que no anda os grabo un video jajaj
Otra cosa que tengo problemas es con la declaracion de las tablas.
No se por que demonios tengo que poner un numero mayor que lo que voy usar.
creo que es por los ceros, a lo mejor si sustituyo los 0 po X o otra cosa.
Creo que es así por que creo que termina la tabla con char( 0 ) no?
Si saben por que, pasa eso me gustaría saber si declaro char tabla[10]
no le puedo meter de 0 a 9 por que me dice no sequela de fpermisive los webos.
Me parece que en el caso de char la ultima letra es 0 no es ¿así?
La cosa es que veo vuestro código funcionar y el mio pues no anda.
es raro pero me esta pasando pffff
« Última modificación: 4 Enero 2014, 16:18 pm por vangodp » En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Ayuda con programa urgente!
« Respuesta #46 en: 4 Enero 2014, 16:29 pm »

Código
  1. int rand4 (){
  2. srand(time(NULL));
  3. int n = (0 + rand() % 4);
  4. return n;
  5. }
El srand debe usarse UNA SOLA VEZ preferentemente al principio. De lo contrario obtendrás siempre los mismos números (ya que no ha pasado el suficiente tiempo como para que cambie la semilla).

Citar
Como diga que no anda os grabo un video jajaj
Otra cosa que tengo problemas es con la declaracion de las tablas.
No se por que demonios tengo que poner un numero mayor que lo que voy usar.
El problema es el uso de comillas, si pones comillas el compilador te añade automáticamente un caracter nulo al final. Para que no te lo añadiera tendrías que ponerlos letra a letra con las comillas simples ' '.

Aumenta en uno el tamaño y listo. Eso es lo que he hecho en mi código.
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
vangodp


Desconectado Desconectado

Mensajes: 455



Ver Perfil
Re: Ayuda con programa urgente!
« Respuesta #47 en: 4 Enero 2014, 17:24 pm »

Pues gracias man, me lo imaginaba pero no tenia certeza XD  ;-)
En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Ayuda con programa urgente!
« Respuesta #48 en: 14 Enero 2014, 10:07 am »

;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-)

¡¡¡Pedazo de código amchacon!!!!. Está visto que te lo has currado de lo lindo.

Antes que nada GRACIAS. Es un código muy pero que muy interesante, al menos para mí. Me recuerda que tengo que ponerme las pilas en el tema de estructuras, listas y muy especialmente en arboles, facilita mucho las cosas.

Como comprobarás por mi código final, yo me apaño, creo que bastante bien, con los arrays. Y es que el mundo de donde vengo se pierde en el tiempo. Era una época en que lo más que habían para estas cosas eran los arrays y, en todo caso, los famosos sprites. Eso sí, tenían capacidades gráficas y de sonido de forma nativa, nada de librerías externas ni cosas por el estilo. Sin duda era mucho más fácil programar un ping-pong o un break. La verdad que en ese sentido el C me decepciona ya que las librerías gráficas, al menos las que he ojeado, son todo un *oñazo y poco intuitivas. Pero en fin, es lo que hay.

Y vamos a lo que vamos, a comentar y realizar observaciones, que no críticas -no entra en mi ánimo ni mucho menos- sobre los códigos y métodos usados en vuestros códigos.

Repito querido amigo Mikel Angelo, son sólo observaciones, no quiero que te lo tomes o mal ni las veas como críticas. ;) ;) ;)


Añado un código que te resuelve el laberinto buscando la ruta más corta:


Pues va a ser que no. Algo tendrás que revisar porque no da exactamente la ruta más corta: casi, casi, pero no.

Y como muestra dos botones:




Los colores los he copiado totalmente del código de Leo, es un artista.

No es para tanto. Además lo explique, creo que meridianamente clarito, en el tema de GAMA DE COLORES, tema que aconsejo a todo el que quiera darle un poco de vidilla a sus códigos.

- Realizan una adaptación de algún algoritmo de grafos. Para el de la ruta más corta es Dijkstra:
Dikstra]http://es.wikipedia.org/wiki/Algoritmo_de_Dijkstra]Dikstra
Y para el de la ruta aleatoria uso una modificación del DFS (Depth First Search). La modificación esque elige las ramas aleatoriamente:
http://es.wikipedia.org/wiki/B%C3%BAsqueda_en_profundidad


La verdad es que el tema de grafos es, como diría, espeso, eso es. Lo tuve que dominar en profundidad en su momento, tanto por haberlo dado en la asignatura correspodiente de Álgebra como por las múltiples aplicaciones en otras asignaturas, como Regulación Automática, Administración de Empresas,Procesos químicos, Economía,etc.

Pero siempre me dejo un mal regusto, me parece primitivo en los tiempos que corren con el uso de los ordenadores. Así que me voy a poner a ello y voy a desarrollar mi propio sistema para determinar el camino más corto entre dos puntos, que se note que soy Ingeniero y que hacemos honor al nombre: ingeniar, innovar.

 No es moco de pavo el problemita pero si pillo un par de días, la familia ocupa casi todo el tiempo, pero el problema tiene unas implicaciones la mar de interesantes, como la búsqueda del camino más corto entre dos puntos en un viaje en coche, o la mejor ruta para el reparto de mercancías entre dos puntos/ciudades, entre otros muchos casos.

Y respecto al uso del DFS (Depth First Search)  



comentar que el problema que nos traemos entre manos, que no es baladí, es algo más complejo ya que implica que el árbol cierre y/o conecte buena parte de las subramas de las ramas principales y que el origen y fin sean los nodos extremos, es decir que se cierren las ramas por abajo en un punto final, amén de las comentadas interconexciones entre subramas. Vamos que es bastante más complejo que un simple árbol como el que muestra la figura y las modificaciones que abría que hacer al susodicho método DFS son de tal envergadura que yo me pondría, y me voy a poner, a desarrollar un nuevo método.

Lo de pintar el camino hacia atrás ni me molesto porque es como algo obvio.


vangodp, querido amigo, ahora voy a por ti. ;) ;) ;)

.................................................................
Funciona de perfectamente y es capaz de hacer el personaje volver por todo el camino.
.........................................
hay unos bugcitos jaja
.................................................................

A veces se queda un rato parado en una intercesión, eso lo hace hasta que obtiene un numero aleatorio correcto.
Podía mejorarlo pero bua lo dejo así que soy mu vaguito XD
.............................................................................
Como diga que no anda os grabo un video jajaj
Otra cosa que tengo problemas es con la declaracion de las tablas.
..............................................
La cosa es que veo vuestro código funcionar y el mio pues no anda.
es raro pero me esta pasando pffff

Por vídeos que no quede esta vez. ;) ;) ;)

* Por un lado debes dejar un espacio en blanco al lado de %c del printf que te dibuja el laberinto. Tal como lo tienes sale demasiado pegado en horizontal y no se ve bien.

* ¿Intentas provocar un ataque de epilepsia a los usuarios?. Es insufrible el que cada vez que camines por el laberinto se redibuje toda la matriz, eso trae como consecuencia un parpadeo incesante de la imagen que hace difícil seguir el movimiento de la casilla en cuestión. Observa si no:



En cambio más separaditos y con color:


Código
  1. #include <iostream>
  2. #include <windows.h>
  3. #include <stdio.h>
  4. #include <time.h>
  5.  
  6. # define udir mapa[y-1][x]
  7. # define ldir mapa[y][x-1]
  8. # define rdir mapa[y][x+1]
  9. # define ddir mapa[y+1][x]
  10. # define po mapa[y][x]
  11. using namespace std;
  12.  
  13. const int TAMY = 24;
  14. const int TAMX = 28;
  15.  
  16. int contapasos = 0;
  17. void mostrar(char mapa[TAMY][TAMX]);
  18. void color (int n);
  19. int gotoxy(int x, int y);
  20.  
  21. void mostrar(char mapa[TAMY][TAMX]){
  22. system ("cls");
  23.    int x,y;
  24.     for( y=0;y<TAMY;y++)
  25.     {
  26.     for( x=0;x<TAMX-1;x++)
  27.     {
  28.     if ((y==TAMY-2 && x==TAMX-3) ||(x==1 && y==1))
  29.                color(195);
  30.            else if (x==0 || y==0 || x==TAMX-2 || y==TAMY-1)
  31.                color(125);
  32.            else if (mapa[y][x]=='0')
  33.                color(175);
  34.            else if (mapa[y][x]=='X'){
  35.              mapa[y][x]='2';
  36.              color(7);
  37.            }
  38.            else if (mapa[y][x]=='1'){
  39.              mapa[y][x]='1';
  40.              color(215);
  41.            }
  42.            else
  43.              color(7);
  44.            printf("%c ",mapa[y][x]);
  45.            fflush(stdout);
  46.  
  47.     //Sleep(5);
  48.     }
  49.     color(7);
  50.     putchar('\n');
  51.     //Sleep(5);
  52.     }
  53.  
  54. }
  55.  
  56.  int rand4 (){
  57. int n = (0 + rand() % 4);
  58. return n;
  59. }
  60.  
  61. void go_up ( char mapa[TAMY][TAMX], int &x , int &y ){
  62. po = '1';
  63. y--;
  64. po = 'X';
  65. }
  66.  
  67. void go_le ( char mapa[TAMY][TAMX], int &x , int &y ){
  68. po = '1';
  69. x--;
  70. po = 'X';
  71. }
  72.  
  73. void go_ri ( char mapa[TAMY][TAMX], int &x , int &y ){
  74. po = '1';
  75. x++;
  76. po = 'X';
  77. }
  78.  
  79. void go_do ( char mapa[TAMY][TAMX], int &x , int &y ){
  80. po = '1';
  81. y++;
  82. po = 'X';
  83. }
  84.  
  85.  
  86. int main (){
  87. //variables iniciales
  88. srand(time(NULL));
  89. system ("pause");
  90. int pasos = 0;
  91. bool nodir = true;
  92. bool fin = true;
  93. int x = 1; //posicion x inicial
  94. int y = 1; //posicion y inicial
  95. int rand;
  96. char mapa[TAMY][TAMX]={
  97.   //0123456789012345678901234567
  98. "000000000000000000000000000",//0
  99. "020222222222222222222222220",//1
  100. "020200000000000000000000020",//2
  101. "020222222222222200000000020",//3
  102. "020200000000000000000000020",//4
  103. "020222222222222200022222220",//5
  104. "020000000000000200020000020",//6
  105. "020222222222200200000000020",//7
  106. "020200000000200222222222020",//8
  107. "020222222200200000000002020",//9
  108. "020000000200222222222222020",//10
  109. "022222220200000000000000020",//11
  110. "020000020200222222222222220",//12
  111. "020000022200200000000000000",//13
  112. "000000000000200222222222220",//14
  113. "022222222222200200000000020",//15
  114. "020000000000000222222202020",//16
  115. "020000000000000200000202020",//17
  116. "022222222222222200000202020",//18
  117. "000000000000000000000202220",//19
  118. "022222222222222222222200000",//20
  119. "020000000000000000000000000",//21
  120. "0222222222222222222222222F0",//22
  121. "000000000000000000000000000" //23
  122.  
  123. };
  124. //obtenr cantidad maxima de pasos pocibles.
  125. for ( int fory = 0; fory <= TAMY; fory++  ){
  126. for ( int forx = 0; forx <= TAMX; forx++  ){
  127. if ( mapa[fory][forx] == '2' )
  128. pasos++;
  129. }
  130. }
  131. int xbackup[pasos];
  132. int ybackup[pasos];
  133.  
  134.  
  135. while ( fin ){
  136. while ( udir == '1' || ldir == '1' || rdir == '1' || ddir == '1' ){
  137. if ( udir == '2' || ldir == '2' || rdir == '2' || ddir == '2' ){
  138. break;
  139. }
  140.  
  141. contapasos--;
  142. mapa[y][x]='0';
  143. x = xbackup[contapasos];
  144. y = ybackup[contapasos];
  145. mapa[y][x]='X';
  146. mostrar( mapa );
  147. //Sleep ( 100 );
  148. }
  149.  
  150. contapasos++;
  151. xbackup[contapasos]= x;
  152. ybackup[contapasos]= y;
  153.  
  154. if( udir == '2' || ldir == '2' || rdir == '2' || ddir == '2' ){
  155.  
  156. do{
  157.  
  158. rand = rand4();
  159.  
  160.  
  161. if ( udir == '2' && ldir != '2' && rdir != '2' && ddir != '2' ){
  162. go_up( mapa, x, y );
  163. break;
  164. }
  165. else if ( udir != '2' && ldir == '2' && rdir != '2' && ddir != '2' ){
  166. go_le( mapa, x, y );
  167. break;
  168. }
  169. else if ( udir != '2' && ldir != '2' && rdir == '2' && ddir != '2' ){
  170. go_ri( mapa, x, y );
  171. break;
  172. }
  173. else if ( udir != '2' && ldir != '2' && rdir != '2' && ddir == '2' ){
  174. go_do( mapa, x, y );
  175. break;
  176. }
  177.  
  178. else if ( rand == 0 ){
  179. if ( udir == '0' || udir == '1' ){
  180. nodir = true;
  181. break;
  182. }
  183. else {
  184. go_up( mapa, x, y );
  185. nodir = false;
  186. }
  187.  
  188. }
  189. else if ( rand == 1 ){
  190. if ( ldir == '0' || ldir == '1' ){
  191. nodir = true;
  192. break;
  193. }
  194. else {
  195. go_le( mapa, x, y );
  196. nodir = false;
  197. }
  198.  
  199. }
  200. else if ( rand == 2 ){
  201. if ( rdir == '0' || rdir == '1' ){
  202. nodir = true;
  203. break;
  204.  
  205. }
  206. else {
  207. go_ri( mapa, x, y );
  208. nodir = false;
  209. }
  210.  
  211. }
  212. else if ( rand == 3 ){
  213. if ( ddir == '0' || ddir == '1' ){
  214. nodir = true;
  215. break;
  216. }
  217. else {
  218. go_do( mapa, x, y );
  219. nodir = false;
  220. }
  221.  
  222. }
  223.  
  224. }while( nodir );//FIN DOWHILE
  225.  
  226. }//FIN IF
  227. mostrar( mapa );
  228. Sleep ( 100 );
  229. }//FIN DEL LOOP
  230.  
  231. }
  232. void color (int n)
  233. {
  234.        SetConsoleTextAttribute(GetStdHandle (STD_OUTPUT_HANDLE), n );
  235. }
  236.  

** ¿Y como evitas el parpadeo?. Sencillo, dibujas una sola vez la matriz y ya no refrescas más la pantalla con el system("pause") cada vez que haces un movimiento. Lo que haces es aprovechar que la matriz está dibujada y sobre esa misma matriz mueves la casilla.

** ¿Y cómo diablos consigues que se mueva la casilla sin cambiar la matriz?.  Sencillo, con una función de las API de Windows que permite situar el cursor en cualquier posición de la pantalla y escribir, e incluso sobrescribir, en un punto determinado. La función que realiza tal cometido es "goto", así como la función "color" es la encargada de dar color. Te pongo un vídeo de muestra, no te preocupes que todos duran menos de un minuto- y el código que te muestra cómo hacer lo que te comento:



Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <windows.h>
  5. #define FIL 7
  6. #define COL 8
  7.  
  8. void color (int n);
  9. int gotoxy(int x, int y);
  10.  
  11. int main (){
  12.  
  13.  int i=0,j=0,k=0,fil=1,col=1;
  14.  char a[7][8];
  15.  system ("pause");
  16.  system ("cls");
  17.  for (i=0;i<15;i++){
  18.    gotoxy (10+2*i,10);
  19.    printf ("*" );
  20.  }
  21.  Sleep (2000);
  22.  for (i=0;i<15;i++){
  23.    Sleep (250);
  24.    gotoxy (10+2*i,10);
  25.    printf ("X" );
  26.  }
  27.  
  28.  
  29.  
  30.  puts("\n\n");
  31.  system ("pause");
  32.  system ("cls");
  33.  for (i=0;i<27;i++)
  34.    printf ( "* ");
  35.  putchar ('\n');
  36.  for (i=0;i<27;i++){
  37.    Sleep(150);
  38.    gotoxy (2*i,0);
  39.    printf ( "X ");
  40.  }
  41.  for (i=0;i<27;i++){
  42.    Sleep(100);
  43.    gotoxy (2*i,4);
  44.    printf ( "X");
  45.  }
  46.  for (i=0;i<6;i++){
  47.    for (j=0;j<6;j++){
  48.      gotoxy (2*j+6,i+6);
  49.      printf ( "* ");
  50.    }
  51.  }
  52.  for (i=0;i<6;i++){
  53.    for (j=0;j<6;j++){
  54.      Sleep(250);
  55.      gotoxy (2*j+6,i+6);
  56.      printf ( "X");
  57.    }
  58.  }
  59.  putchar ('\n');
  60.  system ("pause");
  61.  system ("cls");
  62.  for (i=0;i<7;i++){
  63.    a[i][7]='\0';
  64.    for (j=0;j<7;j++){
  65.      if(j>=i-1 && j<i+1 && j>0 && j<6 && i<6)
  66.        a[i][j]='X';
  67.      else if(i==0 || j==0 || i==6 || j==6 )
  68.        a[i][j]='*';
  69.      else
  70.        a[i][j]='0';
  71.    }
  72.  }
  73.  putchar ('\n');
  74.  for (i=0;i<7;i++){
  75.    a[i][7]='\0';
  76.    for (j=0;j<7;j++){
  77.      if((i==j || j==i-1) && i>0 && j<6 && j>0 && i<6)
  78.        a[i][j]='X';
  79.      else if(i==0 || j==0 || i==6 || j==6 )
  80.        a[i][j]='*';
  81.      else
  82.        a[i][j]='0';
  83.    }
  84.  }
  85.  gotoxy (0,10);
  86.  for (i=0;i<7;i++){
  87.    for (j=0;j<7;j++){
  88.      printf ("%c ",a[i][j]);
  89.    }
  90.    putchar ('\n');
  91.  }
  92.  system ("pause");
  93.  /*for (i=0;i<7;i++){
  94.     a[i][7]='\0';
  95.     for (j=0;j<7;j++){
  96.       if (i==0 || j==0 || i==6 || j==6 )
  97.         a[i][j]='*';
  98.       else if (i>=j)
  99.         a[i][j]='X';
  100.       else
  101.         a[i][j]='0';
  102.     }
  103.   }*/
  104.  for (i=0;i<7;i++)
  105.    printf ("%s\n",a[i]);
  106.  system ("pause");
  107.  gotoxy (0,0);
  108.  
  109.  for (i=0;i<7;i++){
  110.    for (j=0;j<7;j++){
  111.      printf ("%c ",a[i][j]);
  112.    }
  113.    putchar ('\n');
  114.  }
  115.  fil=1,col=1;
  116.  while  (1){
  117.    Sleep(1000);
  118.    if (fil==FIL-2 && col==COL-3){
  119.      gotoxy (2*col,fil);
  120.      printf("%c ",'F');
  121.      break;
  122.    }
  123.    else if (a[fil+1][col]=='X' && fil<FIL){
  124.      color(215);
  125.      gotoxy (2*col,fil);
  126.      printf("%c ",'F');fil++;
  127.    }
  128.    else if (a[fil][col+1]=='X' && col<COL){
  129.      color(215);
  130.      gotoxy (2*(col),fil);
  131.      printf("%c ",'F');col++;
  132.    }
  133.    else if (a[fil-1][col]=='X' && fil>0){
  134.      color(215);
  135.      gotoxy (2*(col),fil);
  136.      printf("%c ",'F');fil--;
  137.    }
  138.    else if (a[fil][col-1]=='X' && col>0){
  139.      color(215);
  140.      gotoxy (2*col,fil);
  141.      printf(" %c ",'F');col--;
  142.    }
  143.  }
  144.  color(7);
  145.  gotoxy (0,30);
  146.  printf ( "Final!");
  147.  putchar ('\n');
  148.  return 0;
  149. }
  150.  
  151. void color (int n)
  152. {
  153.        SetConsoleTextAttribute(GetStdHandle (STD_OUTPUT_HANDLE), n );
  154. }
  155.  
  156.  
  157. int gotoxy(int x, int y)
  158. {
  159.   COORD coord;
  160.   HANDLE h_stdout;
  161.  
  162.   coord.X = x;
  163.   coord.Y = y;
  164.  
  165.   if ((h_stdout = GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE)
  166.      return 0;
  167.  
  168.   if (SetConsoleCursorPosition(h_stdout, coord) == 0)
  169.      return 0;
  170.  
  171.   return 1;
  172. }
  173.  

Como ves es sencillo pero muy efectivo, Todo es jugar con las coordenadas de goto(x,y). Y al respecto te hago una observación, el ordenador usa como ejes coordenados el horizontal superior como eje OX y el vertical izquierdo como eje OY, de forma que el origen de coordenada está en el vértice superior izquierdo de la pantalla, como ya imagino sabrás. Eso provoca una pequeña distorsión y/o problema a la hora de escribir en pantalla con la mencionada función goto(x,y) y es que las coordenadas x,y se corresponden con los índices i,j o, como en tu caso, x,y. Observa que en la matriz normalmente al poner (i,j) la i es para las filas y la y para las columnas. Ahí es donde tienes que tener cuidado ya que las filas, osea la i, se corresponde en pantalla con la Y del goto(x,y), mientras la j se corresponde con la x.

* En cuanto a la declaración de las tablas mencionarte que tenías un problema al indicar la fila y columna final. por eso tenías que sobredimensionarlas. En los códigos que te paso ya he corregido ese problema.


* Efectivamente tienes un pequeño bug principal. Si te fijas en la imagen y  vídeo siguientes quedan unos "1" sin "pintar":


Eso que a primera vista parece un problema nimio resulta que es un problema realmente vital. Se pone de manifiesto al aplicarle yo el que la pantalla no parpadee con el uso del goyo(x,y). Observa el vídeo:



Código
  1. #include <iostream>
  2. #include <windows.h>
  3. #include <stdio.h>
  4. #include <time.h>
  5.  
  6. # define udir mapa[y-1][x]
  7. # define ldir mapa[y][x-1]
  8. # define rdir mapa[y][x+1]
  9. # define ddir mapa[y+1][x]
  10. # define po mapa[y][x]
  11. using namespace std;
  12.  
  13. const int TAMY = 24;
  14. const int TAMX = 28;
  15.  
  16. int contapasos = 0;
  17. void mostrar(char mapa[TAMY][TAMX]);
  18. void color (int n);
  19. int gotoxy(int x, int y);
  20.  
  21. void mostrar(char mapa[TAMY][TAMX]){
  22. system ("cls");
  23.    int x,y;
  24.     for( y=0;y<TAMY;y++)
  25.     {
  26.     for( x=0;x<TAMX-1;x++)
  27.     {
  28.     if ((y==TAMY-2 && x==TAMX-3) ||(x==1 && y==1))
  29.                color(195);
  30.            else if (x==0 || y==0 || x==TAMX-2 || y==TAMY-1)
  31.                color(125);
  32.            else if (mapa[y][x]=='0')
  33.                color(175);
  34.            else if (mapa[y][x]=='X'){
  35.              mapa[y][x]='2';
  36.              color(7);
  37.            }
  38.            else if (mapa[y][x]=='1'){
  39.              mapa[y][x]='1';
  40.              color(215);
  41.            }
  42.            else
  43.              color(7);
  44.            printf("%c ",mapa[y][x]);
  45.            fflush(stdout);
  46.  
  47.     //Sleep(5);
  48.     }
  49.     color(7);
  50.     putchar('\n');
  51.     //Sleep(5);
  52.     }
  53.  x=1,y=1;
  54.  while  (1){
  55.    Sleep(250);
  56.    if (y==TAMY-2 && x==TAMX-3 ){
  57.      gotoxy (2*x,y);
  58.      mapa[y][x]='1';
  59.      printf("%c ",'X');
  60.      break;
  61.    }
  62.    else if (mapa[y+1][x]=='2' && y<TAMY){
  63.      color(215);
  64.      gotoxy (2*x,y);
  65.      mapa[y][x]='1';
  66.      printf("%c ",'X');y++;
  67.    }
  68.    else if (mapa[y][x+1]=='2' && x<TAMX){
  69.      color(215);
  70.      mapa[y][x]='1';
  71.      gotoxy (2*(x),y);
  72.      printf("%c ",'X');x++;
  73.    }
  74.    else if (mapa[y-1][x]=='2' && y>0){
  75.      color(215);
  76.      mapa[y][x]='1';
  77.      gotoxy (2*(x),y);
  78.      printf("%c ",'X');y--;
  79.    }
  80.    else if (mapa[y][x-1]=='2' && x>0){
  81.      color(215);
  82.      mapa[y][x]='1';
  83.      gotoxy (2*x,y);
  84.      printf(" %c ",'X');x--;
  85.    }
  86.  }
  87.    color(55);
  88.    gotoxy (45,33);
  89.    printf ("\n\t¡¡¡FINAL!!!\t\t\n\n");
  90.    color(7);
  91.    system ("pause");
  92. }
  93.  
  94.  int rand4 (){
  95. int n = (0 + rand() % 4);
  96. return n;
  97. }
  98.  
  99. void go_up ( char mapa[TAMY][TAMX], int &x , int &y ){
  100. po = '1';
  101. y--;
  102. po = 'X';
  103. }
  104.  
  105. void go_le ( char mapa[TAMY][TAMX], int &x , int &y ){
  106. po = '1';
  107. x--;
  108. po = 'X';
  109. }
  110.  
  111. void go_ri ( char mapa[TAMY][TAMX], int &x , int &y ){
  112. po = '1';
  113. x++;
  114. po = 'X';
  115. }
  116.  
  117. void go_do ( char mapa[TAMY][TAMX], int &x , int &y ){
  118. po = '1';
  119. y++;
  120. po = 'X';
  121. }
  122.  
  123.  
  124. int main (){
  125. //variables iniciales
  126. srand(time(NULL));
  127. system ("pause");
  128. int pasos = 0;
  129. bool nodir = true;
  130. bool fin = true;
  131. int x = 1; //posicion x inicial
  132. int y = 1; //posicion y inicial
  133. int rand;
  134. char mapa[TAMY][TAMX]={
  135.   //0123456789012345678901234567
  136. "000000000000000000000000000",//0
  137. "020222222222222222222222220",//1
  138. "020200000000000000000000020",//2
  139. "020222222222222200000000020",//3
  140. "020200000000000000000000020",//4
  141. "020222222222222200022222220",//5
  142. "020000000000000200020000020",//6
  143. "020222222222200200000000020",//7
  144. "020200000000200222222222020",//8
  145. "020222222200200000000002020",//9
  146. "020000000200222222222222020",//10
  147. "022222220200000000000000020",//11
  148. "000000020200222222222222220",//12
  149. "000000022200200000000000000",//13
  150. "000000000000200222222222220",//14
  151. "022222222222200200000000020",//15
  152. "020000000000000222222202020",//16
  153. "020000000000000200000202020",//17
  154. "022222222222222200000202020",//18
  155. "000000000000000000000202220",//19
  156. "022222222222222222222200000",//20
  157. "020000000000000000000000000",//21
  158. "0222222222222222222222222F0",//22
  159. "000000000000000000000000000" //23
  160.  
  161. };
  162. //obtenr cantidad maxima de pasos pocibles.
  163. for ( int fory = 0; fory <= TAMY; fory++  ){
  164. for ( int forx = 0; forx <= TAMX; forx++  ){
  165. if ( mapa[fory][forx] == '2' )
  166. pasos++;
  167. }
  168. }
  169. int xbackup[pasos];
  170. int ybackup[pasos];
  171.  
  172.  
  173. while ( fin ){
  174. while ( udir == '1' || ldir == '1' || rdir == '1' || ddir == '1' ){
  175. if ( udir == '2' || ldir == '2' || rdir == '2' || ddir == '2' ){
  176. break;
  177. }
  178.  
  179. contapasos--;
  180. mapa[y][x]='0';
  181. x = xbackup[contapasos];
  182. y = ybackup[contapasos];
  183. mapa[y][x]='X';
  184. mostrar( mapa );
  185. //Sleep ( 100 );
  186. }
  187.  
  188. contapasos++;
  189. xbackup[contapasos]= x;
  190. ybackup[contapasos]= y;
  191.  
  192. if( udir == '2' || ldir == '2' || rdir == '2' || ddir == '2' ){
  193.  
  194. do{
  195.  
  196. rand = rand4();
  197.  
  198.  
  199. if ( udir == '2' && ldir != '2' && rdir != '2' && ddir != '2' ){
  200. go_up( mapa, x, y );
  201. break;
  202. }
  203. else if ( udir != '2' && ldir == '2' && rdir != '2' && ddir != '2' ){
  204. go_le( mapa, x, y );
  205. break;
  206. }
  207. else if ( udir != '2' && ldir != '2' && rdir == '2' && ddir != '2' ){
  208. go_ri( mapa, x, y );
  209. break;
  210. }
  211. else if ( udir != '2' && ldir != '2' && rdir != '2' && ddir == '2' ){
  212. go_do( mapa, x, y );
  213. break;
  214. }
  215.  
  216. else if ( rand == 0 ){
  217. if ( udir == '0' || udir == '1' ){
  218. nodir = true;
  219. break;
  220. }
  221. else {
  222. go_up( mapa, x, y );
  223. nodir = false;
  224. }
  225.  
  226. }
  227. else if ( rand == 1 ){
  228. if ( ldir == '0' || ldir == '1' ){
  229. nodir = true;
  230. break;
  231. }
  232. else {
  233. go_le( mapa, x, y );
  234. nodir = false;
  235. }
  236.  
  237. }
  238. else if ( rand == 2 ){
  239. if ( rdir == '0' || rdir == '1' ){
  240. nodir = true;
  241. break;
  242.  
  243. }
  244. else {
  245. go_ri( mapa, x, y );
  246. nodir = false;
  247. }
  248.  
  249. }
  250. else if ( rand == 3 ){
  251. if ( ddir == '0' || ddir == '1' ){
  252. nodir = true;
  253. break;
  254. }
  255. else {
  256. go_do( mapa, x, y );
  257. nodir = false;
  258. }
  259.  
  260. }
  261.  
  262. }while( nodir );//FIN DOWHILE
  263.  
  264. }//FIN IF
  265. mostrar( mapa );
  266. Sleep ( 100 );
  267. }//FIN DEL LOOP
  268.  
  269. }
  270. void color (int n)
  271. {
  272.        SetConsoleTextAttribute(GetStdHandle (STD_OUTPUT_HANDLE), n );
  273. }
  274.  
  275. int gotoxy(int x, int y)
  276. {
  277.   COORD coord;
  278.   HANDLE h_stdout;
  279.  
  280.   coord.X = x;
  281.   coord.Y = y;
  282.  
  283.   if ((h_stdout = GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE)
  284.      return 0;
  285.  
  286.   if (SetConsoleCursorPosition(h_stdout, coord) == 0)
  287.      return 0;
  288.  
  289.   return 1;
  290. }
  291.  

y mira como se "pega" en la rama horizontal. No puede retroceder como sería lo normal y es por lo que te comenté, ese "1" no lo has cambiado al hacer el recorrido y la casilla que se mueve la detecta como errónea:


¿Y yo?.


La verdad es que poca cosa, aunque interesantes, es que con tanta fiestas y familia alrededor no he tenido tiempo pá ná.

Pero bueno, algo si que he adelantado.

La principal novedad que he introducido es el hecho de no trabajar ya con una matriz predefinida en el código, eso era como demasiado fácil. Ahora la matriz se genera de forma aleatoria.

Para hacer el código más rico, introduzco una variables, de nombres peso, c_peso y peso_i, que permiten jugar a poner más o menos 2=camino o 0=pared. Además aseguro que la matriz generada tenga al menos una solución, cosa que si la genero aleatoriamente de forma total no ocurriría la mayor parte de las veces. Y la salida que busco es "UNA", dejo para un posterior código, como ya comenté más arriba, el desarrollo de un método que me permita elegir el camino con menor coste.

 Sí, digo bien, con menor coste ya que pueden haber varias soluciones que del principio al final recorran el mismo número de casillas pero con distinto coste. ¿Que qué es eso del coste?. Ni más ni menos que el número de cambios de dirección en el camino. Imaginaos que vais de una ciudad a otra, el camino óptimo será el que tenga menos "curvas", que en este caso se traduce por el menor número de cambios de dirección. No vale eso de abajo. derecha una y otra vez si puedes ir recto hacia abajo y luego directo a la derecha sin tomar curvas en medio.

Y un vídeo de un minutito que muestra el código en acción y después el código:



Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <windows.h>
  5. #define COL 28
  6. #define FIL 27
  7.  
  8. void mostrar(char a[][COL],char *msg);
  9. void rellenar_laberinto (char  a[][COL], char b[][COL]);
  10. void color (int n);
  11. int gotoxy(int x, int y);
  12. void mostrar_despacio(char a[][COL],char b[][COL],char *msg);
  13.  
  14. int main (){
  15.  char a[FIL][COL],b[FIL][COL];
  16.  int i,j,x,y,incre_i,incre_j,cont=0,peso=0,c_peso=0,peso_i,flag=0;
  17.  srand((unsigned) time(NULL));
  18.  while (flag==0){
  19.  for( i=0;i<FIL;i++) {
  20.    for( j=0;j<COL-1;j++) {
  21.      if (i==0 || j==0 || i==FIL || j==COL-2)
  22.        a[i][j]=b[i][j]='*';
  23.      else
  24.        a[i][j]=b[i][j]='0';
  25.    }
  26.  }
  27.  a[1][1]='I';
  28.  a[FIL-2][COL-3]='F';
  29.  i=1,j=1;peso=12 ,c_peso=9,peso_i=3;
  30.  while (1){
  31.    x=rand()%peso;
  32.    if (x<peso_i)
  33.      incre_i=-1;
  34.    else if (x>=peso_i && x<c_peso)
  35.      incre_i=1;
  36.    else if (x>=c_peso && x<peso)
  37.      incre_i=0;
  38.    y=rand()%peso;
  39.      if (y<peso_i)
  40.        incre_j=-1;
  41.      else if (y>=peso_i && y<c_peso)
  42.        incre_j=1;
  43.      else if (y>=c_peso && y<peso)
  44.        incre_j=0;
  45.      if (((incre_i!=incre_j) && (incre_i!=-incre_j))  &&(a[i+incre_i][j+incre_j]=='0'  )
  46.        && (i>0 && i<FIL+1 && j>0  && j<COL-2)){
  47.        if ((i+incre_i>0) && (j+incre_j>0) && (i+incre_i<FIL) && (j+incre_j<COL-1)){
  48.          i+=incre_i;
  49.          j+=incre_j;
  50.        if ((i==FIL-1 && j==COL-2)||(i==FIL-3 && j==COL-3)){
  51.            a[i][j]='X';
  52.            flag++;
  53.            break;
  54.          }
  55.        else if ((i==2 && j==1) || (i==1 && j==2))
  56.          a[i][j]='X';
  57.        else if ((a[i][j]=='0' &&
  58.          (a[i+1][j]=='0' && a[i-1][j]=='0' && a[i][j+1]=='0' ) ||
  59.          (a[i+1][j]=='0' && a[i-1][j]=='0' && a[i][j-1]=='0' ) ||
  60.          (a[i][j+1]=='0' && a[i][j-1]=='0' && a[i+1][j]=='0' ) ||
  61.          (a[i][j+1]=='0' && a[i][j-1]=='0' && a[i-1][j]=='0' ))){
  62.            a[i][j]='X';
  63.            cont=0;
  64.          }
  65.        else {
  66.          i-=incre_i;
  67.          j-=incre_j;
  68.          cont++;
  69.          if (cont == 10)
  70.          break;
  71.          }
  72.        }
  73.      }
  74.    }
  75.  }
  76.  rellenar_laberinto (a, b);
  77.  //mostrar(b,"LABERINTO COLOR: ***ESTO ES OTRA COSA***");
  78.  for( i=0;i<FIL;i++)
  79.    for( j=0;j<COL-1;j++)
  80.      if (a[i][j]=='X')
  81.        b[i][j]='X';
  82.  //mostrar(b,"\tUNA SOLUCION");
  83.  system ("pause");
  84.  mostrar_despacio(a,b,"DESPACITO");
  85.  return 0;
  86. }
  87.  
  88. void rellenar_laberinto (char  a[][COL], char b[][COL]){
  89.  int i,j,x,peso=6 ,c_peso=3;
  90.  for( i=0;i<FIL;i++) {
  91.    for( j=0;j<COL-1;j++) {
  92.      if (i==0 || j==0 || i==FIL-1 || j==COL-2)
  93.        b[i][j]='*';
  94.      else if (a[i][j]=='X')
  95.        b[i][j]='2';
  96.      else {
  97.        x=rand()%peso;
  98.        if (x<peso-c_peso && x>=0)
  99.          b[i][j]='0';
  100.        else if (x>=peso-c_peso && x<peso)
  101.        b[i][j]='2';
  102.        b[1][1]='I';
  103.        b[FIL-2][COL-3]='F';
  104.      }
  105.    }
  106.  }
  107.  b[1][1]='I';
  108.  b[FIL-2][COL-3]='F';
  109. }
  110.  
  111. void mostrar(char mat[][COL],char *msg){
  112.  int i,j;
  113.  system ("cls");
  114.  system ("pause");
  115.  for( i=0;i<FIL;i++) {
  116.    for( j=0;j<COL-1;j++) {
  117.      if ((i==FIL-2 && j==COL-3) ||(i==1 && j==1))
  118.        color(195);
  119.      else if (i==0 || j==0 || i==FIL-1 || j==COL-2)
  120.        color(125);
  121.      else if (mat[i][j]=='0')
  122.        color(175);
  123.      else if (mat[i][j]=='X')
  124.        color(215);
  125.      else
  126.        color(7);
  127.      printf("%c ",mat[i][j]);
  128.      fflush(stdout);
  129.    }
  130.    putchar('\n');
  131.  }
  132.  color(55);
  133.  printf ("\n\n\nt%s\t\t\n\n",msg);
  134.  color(7);
  135.  system ("pause");
  136. }
  137.  
  138. void mostrar_despacio(char a[][COL],char b[][COL],char *msg){
  139.  int i,j,fil,col;
  140.  a[1][1]='X',a[FIL-2][COL-3]='X';
  141.  system ("cls");
  142.  for( i=0;i<FIL;i++)
  143.    for( j=0;j<COL-1;j++)
  144.      if (a[i][j]=='X')
  145.        b[i][j]='2';
  146.      else continue;
  147.  //mostrar(b,"\tcon doses");
  148.  system ("cls");
  149.  for( i=0;i<FIL;i++) {
  150.    for( j=0;j<COL-1;j++) {
  151.      if ((i==FIL-2 && j==COL-3) ||(i==1 && j==1))
  152.          color(195);
  153.      else if (i==0 || j==0 || i==FIL-1 || j==COL-2)
  154.        color(125);
  155.      else if (b[i][j]=='0')
  156.        color(175);
  157.      else if (a[i][j]=='X'){
  158.        b[i][j]='2';
  159.        color(7);
  160.      }
  161.      else
  162.        color(7);
  163.        printf("%c ",b[i][j]);
  164.        fflush(stdout);
  165.      }
  166.      putchar('\n');
  167.    }
  168.  
  169.  fil=1,col=1;
  170.  while  (1){
  171.    Sleep(1000);
  172.    if (fil==FIL-2 && col==COL-3 ){
  173.      gotoxy (2*col,fil);
  174.      a[fil][col]='0';
  175.      printf("%c ",'X');
  176.      break;
  177.    }
  178.    else if (a[fil+1][col]=='X' && fil<FIL){
  179.      color(215);
  180.      gotoxy (2*col,fil);
  181.      a[fil][col]='0';
  182.      printf("%c ",'X');fil++;
  183.    }
  184.    else if (a[fil][col+1]=='X' && col<COL){
  185.      color(215);
  186.      a[fil][col]='0';
  187.      gotoxy (2*(col),fil);
  188.      printf("%c ",'X');col++;
  189.    }
  190.    else if (a[fil-1][col]=='X' && fil>0){
  191.      color(215);
  192.      a[fil][col]='0';
  193.      gotoxy (2*(col),fil);
  194.      printf("%c ",'X');fil--;
  195.    }
  196.    else if (a[fil][col-1]=='X' && col>0){
  197.      color(215);
  198.      a[fil][col]='0';
  199.      gotoxy (2*col,fil);
  200.      printf(" %c ",'X');col--;
  201.    }
  202.  }
  203.  color(55);
  204.  gotoxy (45,28);
  205.  printf ("\n\t%s\t\t\n\n",msg);
  206.  color(7);
  207.  system ("pause");
  208. }
  209.  
  210.  
  211. void color (int n){
  212.  SetConsoleTextAttribute(GetStdHandle (STD_OUTPUT_HANDLE), n );
  213. }
  214.  
  215. int gotoxy(int x, int y){
  216.  COORD coord;
  217.  HANDLE h_stdout;
  218.  coord.X = x;
  219.  coord.Y = y;
  220.  if ((h_stdout = GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE)
  221.    return 0;
  222.  if (SetConsoleCursorPosition(h_stdout, coord) == 0)
  223.    return 0;
  224.  return 1;
  225. }
  226.  

Espero les haya gustado las observaciones y aportaciones.

Todo ha sido con ánimo constructivo, insisto. Nada de críticas, sólo observaciones.

Y espero que no decaiga el ánimo en el tema y sigamos juntos aprendiendo cositas.


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


« Última modificación: 14 Enero 2014, 15:45 pm por leosansan » En línea

vangodp


Desconectado Desconectado

Mensajes: 455



Ver Perfil
Re: Ayuda con programa urgente!
« Respuesta #49 en: 14 Enero 2014, 15:10 pm »

joe leo! Que laburo te has pillao jeje.
Voy a por las gafas para echar un ojo ^^  ;-)
En línea

Páginas: 1 2 3 4 [5] 6 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
AYUDA CON PROGRAMA EN PASCAL, ES UN URGENTE
Ejercicios
juanf03 0 3,741 Último mensaje 15 Noviembre 2006, 01:25 am
por juanf03
Programa perdido y ayuda urgente
Dudas Generales
Diaf96 6 3,448 Último mensaje 24 Abril 2011, 21:33 pm
por Diaf96
PROGRAMA EN PYTHON AYUDA URGENTE
Scripting
viki_297 1 3,187 Último mensaje 15 Junio 2012, 03:22 am
por criskapunk
AYUDA URGENTE CON UN PROGRAMA C++
Programación C/C++
Ruth_cu 1 2,005 Último mensaje 12 Enero 2015, 04:16 am
por MCKSys Argentina
Ayuda urgente pls | Busco un programa con el que ganar siempre
Programación General
!BART 0 2,403 Último mensaje 1 Marzo 2021, 23:55 pm
por !BART
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines