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

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Juego 4 en linea. Ayuda!!!
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 2 [3] Ir Abajo Respuesta Imprimir
Autor Tema: Juego 4 en linea. Ayuda!!!  (Leído 10,945 veces)
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Juego 4 en linea. Ayuda!!!
« Respuesta #20 en: 7 Junio 2013, 02:30 am »

Algunos comentarios:

Código
  1. scanf(" \n%d",&dim);
En la cadena de formato " \n%d" no es necesario utilizar " \n" ya que la función lo primero que hace es descartar el espacio blanco (tabulador, avance de linea, etc). Solo es necesario cuando se utilizan los especificadores "%c" y "%[]" ya que con ellos el descarte no sucede.

Código
  1. scanf (" \n%d",&dim);
  2.  
  3. /* ... */
  4.  
  5. char matriz[dim][dim];
Si van a utilizar un array declarado en esa forma hay que asegurarse de que el compilador soporte el estándar C99 y se compile en ese modo (a veces sucede).

Código
  1. char matriz[dim][dim];
  2.  
  3. /* ... */
  4.  
  5. for (i = 1; i <= dim; i++){
  6.   for (j = 1; j <= dim; j++){
  7.      matriz[i][j] = '.';
  8.      printf("%c ", matriz[i][j]);
  9.   }
  10.  
  11.   printf("\n");
  12. }
En C y C los indices de los arrays inician en 0 y terminan en N-1 donde N es el numero de elementos. Hay que cambiar el par de bucles a:
Código
  1. char matriz[dim][dim];
  2.  
  3. /* ... */
  4.  
  5. for (i = 0; i < dim; i++){
  6.   for (j = 0; j < dim; j++){
  7.      matriz[i][j] = '.';
  8.      fputs(". ", stdout); /* Imprime ". " en la salida estandar */
  9.   }
  10.  
  11.   printf("\n");
  12. }

Un saludo


En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
KaL3o

Desconectado Desconectado

Mensajes: 60



Ver Perfil
Re: Juego 4 en linea. Ayuda!!!
« Respuesta #21 en: 7 Junio 2013, 22:52 pm »

hay varios apartes que se repiten, seria bueno utilizar funciones, reduciriaas varias lineas de codigo

salu2 :)


En línea

Todos los caminos se vuelven a juntar. Pero nunca de la misma forma.
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Juego 4 en linea. Ayuda!!!
« Respuesta #22 en: 9 Junio 2013, 23:02 pm »

Algunos comentarios:
........................................
Si van a utilizar un array declarado en esa forma hay que asegurarse de que el compilador soporte el estándar C99 y se compile en ese modo (a veces sucede).

Yo al menos llevo un tiempito usándolos en el Code::Blocks sin problemas.

Código
  1. char matriz[dim][dim];
  2.  
  3. /* ... */
  4.  
  5. for (i = 1; i <= dim; i++){
  6.   for (j = 1; j <= dim; j++){
  7.      matriz[i][j] = '.';
  8.      printf("%c ", matriz[i][j]);
  9.   }
  10.  
  11.   printf("\n");
  12. }
En C y C los indices de los arrays inician en 0 y terminan en N-1 donde N es el numero de elementos. Hay que cambiar el par de bucles a:
Código
  1. char matriz[dim][dim];
  2.  
  3. /* ... */
  4.  
  5. for (i = 0; i < dim; i++){
  6.   for (j = 0; j < dim; j++){
  7.      matriz[i][j] = '.';
  8.      fputs(". ", stdout); /* Imprime ". " en la salida estandar */
  9.   }
  10.  
  11.   printf("\n");
  12. }

Un saludo

Sí, estoy de acuerdo contigo. Pero yo lo estoy haciendo "a conciencia", puesto que las líneas de i=0 y j=0 se rellenarán para la numeración de las casillas.

 Y la dimensión de la matriz en mi último post ya estaba corregida a dim+1. De todas formas, gracias nuevamente por la atención prestada.

Saluditos! .... ..
« Última modificación: 12 Junio 2013, 17:15 pm por leosansan » En línea

mathias_vg

Desconectado Desconectado

Mensajes: 39


Ver Perfil
Re: Juego 4 en linea. Ayuda!!!
« Respuesta #23 en: 11 Junio 2013, 17:23 pm »

Buenas! finalmente luego de unas cuantas horas podido hacer el juego. Lo posteo abajo para que me puedan corregir algunas cosas las cuales yo no me doy cuenta debido a que soy bastante nuevo en esto.

leosansan muchas gracias, me ha sido de gran ayuda tus consejos.


Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define DIM 16
  4. int inicializar_tablero(char tablero[][DIM],int);
  5. int juegan_O_(char tabla[][DIM],int,int);
  6. int juegan_X_(char tablero[][DIM],int,int);
  7. int main()
  8. {
  9.    int n=0,i,j,x,resto=1,k=0,jugador,partida,victoria=0;
  10.    char d;
  11.    printf("\n\n\n     JUEGO CONECTA CUATRO\n\n\n\n\n\n\n");
  12.    printf("       Nueva partida (S/N): ");
  13.    do
  14.    {
  15.        scanf("%c",&d);
  16.        system("cls");
  17.        if (d=='n' || d=='N')
  18.        {
  19.            return 1;
  20.        }
  21.        if (d!='s' && d!='S')
  22.            printf("\nOpcion incorrecta. Elija: s / n  ");
  23.    }while (d!='s' && d!='S');
  24.    volver:
  25.     printf("\n\nIngresa la dimension del tablero de juego(4-15): ");
  26.    do
  27.    {
  28.        scanf (" %d",&x);
  29.        system("cls");
  30.        if (x<4 || x>15)
  31.            printf("\nOpcion no valida. Ingresa la dimension (4-15): ");
  32.    } while (x<4 || x>15);
  33.    system("cls");
  34.    char tablero[DIM][DIM];
  35.    printf("\n ELIJA JUGADOR\n\n\n");
  36.    printf("\n\n  1) JUGADOR 1 (X)\n");
  37.    printf("\n\n  2) JUGADOR 2 (O)\n");
  38.    elegir:
  39.    scanf("%d",&jugador);
  40.    system("cls");
  41.    if ((jugador!=1) && (jugador!=2))
  42.    {
  43.        printf("\nError: Los jugadores posibles son 1 y 2 ");
  44.        goto elegir;
  45.    }
  46.    do
  47.    {
  48.        inicializar_tablero(tablero,x);
  49.        while ((resto<=(x*x)) && (victoria!=1))
  50.        {
  51.            if (jugador==1)
  52.            {
  53.                jugador++;
  54.               juegan_X_(tablero,x,n);
  55.               for (i=1;i<=x;i++)
  56.           {
  57.     for (j=1;j<=x;j++)
  58. {
  59. if ((tablero[i][j]=='X') && ((tablero[i][j+1])=='X') && ((tablero[i][j+2])=='X') && ((tablero[i][j+3])=='X'))
  60. {
  61. victoria = 1;
  62. }
  63. else if ((tablero[i][j]=='X') && ((tablero[i+1][j])=='X') && ((tablero[i+2][j])=='X') && ((tablero[i+3][j])=='X'))
  64. {
  65. victoria = 1;
  66. }
  67. else if ((tablero[i][j]=='X') && ((tablero[i+1][j-1])=='X') && ((tablero[i+2][j-2])=='X') && ((tablero[i+3][j-3])=='X'))
  68. {
  69. victoria = 1;
  70. }
  71. else if ((tablero[i][j]=='X') && ((tablero[i+1][j+1])=='X') && ((tablero[i+2][j+2])=='X') && ((tablero[i+3][j+3])=='X'))
  72. {
  73. victoria = 1;
  74. }
  75. }
  76.   }
  77.               if (victoria == 1)
  78.               {
  79.               printf("\nJUGADOR 1 GANA!!!\n");
  80.               }
  81.               else
  82.               {
  83.               resto++;
  84.               }
  85.            }
  86.            else if (jugador == 2)
  87.            {
  88.                jugador--;
  89. juegan_O_(tablero,x,n);
  90. for (i=1;i<=x;i++)
  91.           {
  92.     for (j=1;j<=x;j++)
  93. {
  94. if ((tablero[i][j]=='O') && ((tablero[i][j+1])=='O') && ((tablero[i][j+2])=='O') && ((tablero[i][j+3])=='O'))
  95. {
  96. victoria = 1;
  97. }
  98. else if ((tablero[i][j]=='O') && ((tablero[i+1][j])=='O') && ((tablero[i+2][j])=='O') && ((tablero[i+3][j])=='O'))
  99. {
  100. victoria = 1;
  101. }
  102. else if ((tablero[i][j]=='O') && ((tablero[i+1][j-1])=='O') && ((tablero[i+2][j-2])=='O') && ((tablero[i+3][j-3])=='O'))
  103. {
  104. victoria = 1;
  105. }
  106. else if ((tablero[i][j]=='O') && ((tablero[i+1][j+1])=='O') && ((tablero[i+2][j+2])=='O') && ((tablero[i+3][j+3])=='O'))
  107. {
  108. victoria = 1;
  109. }
  110. }
  111.   }
  112.               if (victoria == 1)
  113.               {
  114.               printf("\nJUGADOR 2 GANA!!!\n");
  115.               }
  116.               else
  117.               {  
  118.                resto++;
  119.               }
  120.            }
  121.        if (resto > (x*x) && (victoria!=1))
  122.         {
  123.         printf("\n\nEMPATE\n\n");
  124.            }
  125.        }
  126.    }while ((resto<=(x*x)) && (victoria!=1));
  127.    resto = 1;
  128.    victoria = 0;
  129.    printf("\nPara jugar nuevamente presione 1: ");
  130.    scanf("%d",&partida);
  131.    system("cls");
  132.    if (partida == 1)
  133.    {
  134.     goto volver;
  135.    }
  136.    system("PAUSE");
  137. }
  138. int inicializar_tablero(char tablero[DIM][DIM],int x)
  139. {
  140. int i,j;
  141. for (i=1; i<=x; i++)
  142. {
  143. for (j=1;j<=x; j++)
  144. {
  145. printf("%c ",tablero[i][j]='.');
  146. }
  147. printf("\n");
  148. }
  149.  
  150. }
  151. int juegan_X_(char tablero[DIM][DIM],int x,int n)
  152. {
  153. int i,j,k;
  154. do
  155.    {
  156.        printf("\nJuega JUGADOR 1: ");
  157.                    scanf ("%d",&n);
  158.        if (n<1 || n>x)
  159.        {
  160.            printf("Error: las columnas posibles son de 1 a %d",x);
  161.        }  
  162. else if (tablero[1][n]!='.')
  163. {
  164. printf("\nError: la columna ya esta llena.\n ");
  165.     }
  166.    }while((n<1 || n>x) || (tablero[1][n]!='.'));
  167. for (k=x;k>=1;k--)
  168.    {
  169.            if (tablero[k][n]!='.')
  170.                continue;
  171.            else
  172.            {
  173.                tablero[k][n]='X';
  174.                break;
  175.            }
  176.    }
  177.       system("cls");  
  178.   printf("\nUltima jugada X: Columna %d\n",n);      
  179.    printf("\n");
  180.    for (i=1;i<=x;i++)
  181.    {
  182.        for (j=1;j<=x;j++)
  183.        {
  184.            printf ("%c ",tablero[i][j]);
  185.  
  186.        }
  187.        printf("\n");
  188.    }
  189. }
  190. int juegan_O_(char tablero[DIM][DIM],int x,int n)
  191. {
  192. int i,j,k;
  193. do
  194.    {
  195.        printf("\nJuega JUGADOR 2: ");
  196.                    scanf ("%d",&n);
  197.        if (n<1 || n>x)
  198.        {
  199.            printf("Error: las columnas posibles son de 1 a %d",x);
  200.        }  
  201. else if (tablero[1][n]!='.')
  202. {
  203. printf("\nError: la columna ya esta llena.\n ");
  204.     }
  205.    }while((n<1 || n>x) || (tablero[1][n]!='.'));
  206. for (k=x;k>=1;k--)
  207.    {
  208.            if (tablero[k][n]!='.')
  209.                continue;
  210.            else
  211.            {
  212.                tablero[k][n]='O';
  213.                break;
  214.            }
  215.    }
  216.       system("cls");    
  217.   printf("\nUltima jugada O: Columna %d\n",n);    
  218.    printf("\n");
  219.    for (i=1;i<=x;i++)
  220.    {
  221.        for (j=1;j<=x;j++)
  222.        {
  223.            printf ("%c ",tablero[i][j]);
  224.  
  225.        }
  226.        printf("\n");
  227.    }
  228. }
  229.  
En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Juego 4 en linea. Ayuda!!!
« Respuesta #24 en: 11 Junio 2013, 19:40 pm »

hay varios apartes que se repiten, seria bueno utilizar funciones, reducirias varias lineas de codigo

salu2 :)

Pues la verdad que tienes razón y como simple ejercicio voy a rehacer el código usando funciones, o sea modular, para que no se repitan líneas de código más allá de las imprescindibles.

Y ahora que mathias_vg a publicado su código, posteo el mío. Y como una imagen vale más que mil palabras ahí va:


   

Observar que he tenido en cuenta el "detallito" de que si el usuario introduce por error una letra en lugar de un número no entre en un bucle.  ;)

Conste que hay una dimensión de la matriz por usar, todo a su momento, como el tema del color. ¿Te animas a una partidita?:


Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include<locale.h>
  4.  
  5.  
  6. /**************  FUNCIONES  **************/
  7. char** asig_memoria( int dim_plus);
  8. void tamanyo_consola (char **matriz,int dim_plus);
  9. void jugada(char **matriz,int dim_plus,int jugador, int color_juego);
  10. void imprimir(char **matriz,int dim_plus,int color_juego);
  11. void comprobar_ganador (char **matriz , int jugador, int x, int y, int dim_plus, int color_jueg);
  12. void ganador (char** matriz,int jugador, int dim_plus, int color_juego,int gana_empata);
  13. void contador(int* cont,char** matriz,int jugador, int dim_plus, int color_juego);
  14. void liberar_mem_matriz( char** matriz, int dim_plus);
  15. void salir( char** matriz, int dim_plus);
  16.  
  17. /**************  FUNCION MAIN   **************/
  18.  
  19. int main()
  20. {
  21.    setlocale(LC_ALL, "Spanish");
  22.    int color_juego=0,dim_plus=0;
  23.    char d,**matriz;
  24.    int i=0,j=0,dim=0,movimientos=0,k=0,jugador=1,gana_empata=0;
  25.    printf("\n\n\tIngresa la dimensión del tablero de juego (4-10):");
  26.    fflush (stdout);
  27.    do
  28.    {
  29.        scanf ("%d",&dim);
  30.        if (dim<4 || dim>10 )
  31.        {
  32.            printf("\n\n\t\tOpción no valida.\n\n\t\tIngresa la dimensión (4-10): ");
  33.            fflush (stdout);
  34.        }
  35.  
  36.        while (getchar()!='\n');
  37.    }while (dim<4 || dim>10);
  38.    dim_plus=dim+1;
  39.    matriz = asig_memoria( dim_plus );
  40.    for (i=1;i<dim_plus;i++)
  41.        for (j=1;j<dim_plus;j++)
  42.            matriz[i][j]=' ';
  43.    tamanyo_consola (matriz, dim_plus);
  44.    imprimir( matriz, dim_plus, color_juego);
  45.    while (movimientos<=(dim*dim))
  46.    {
  47.        jugada( matriz, dim, jugador, color_juego);
  48.        imprimir( matriz, dim_plus, color_juego);
  49.        if (jugador==1)
  50.            jugador=2;
  51.        else
  52.            jugador=1;
  53.        movimientos++;
  54.        if (movimientos==dim*dim)
  55.            ganador (matriz,jugador,dim_plus,  color_juego,gana_empata);
  56.    }
  57.    system("PAUSE");
  58.    return 0;
  59. }
  60. /**************  FUNCION JUGADA  **************/
  61. void jugada(char **matriz,int dim_plus,int jugador,int color_juego)
  62. {
  63.    int x=0,y=0,flag=0;
  64.    char simbolo[]={'X','O'};
  65.    do
  66.    {
  67.        do
  68.        {
  69.            flag=0;
  70.            printf("\nJUGADOR %d (%c): ",jugador,simbolo[jugador-1]);
  71.            fflush (stdout);
  72.            scanf ("%d",&y);
  73.            while (getchar()!='\n');
  74.            if (y<1 || y>dim_plus)
  75.                puts("Opción no valida.\nIngresa (4-10)");
  76.        }while(y<1 || y>dim_plus);
  77.        for (x=dim_plus;x>=0;x--)/*<==este for es mejorable*/
  78.        {
  79.            if (matriz[x][y]!=' ' && x!=0)
  80.                continue;
  81.            else if (x==0)
  82.            {
  83.                puts("¡Ya se llego al limite!.\nIntroduzca otro valor.");
  84.                flag=1;
  85.            }
  86.            else
  87.            {
  88.                matriz[x][y]=simbolo[jugador-1];
  89.                break;
  90.            }
  91.        }
  92.    }while (flag==1);
  93.    comprobar_ganador (matriz,jugador,x, y,dim_plus, color_juego);
  94. }
  95. /**************  FUNCION TAMAÑO DE LA CONSOLA  **************/
  96. void tamanyo_consola (char **matriz,int dim_plus)
  97. {
  98.    char tamanyo_consola2[80];
  99.    int tam_x=0,tam_y=0;
  100.    tam_x=3.8*dim_plus; /* con estos valores puedes*/
  101.    tam_y=2*dim_plus ;/*cambiar el tamaño de la consola*/
  102.    sprintf(tamanyo_consola2, "MODE %d,%d", tam_x, tam_y);
  103.    system(tamanyo_consola2);
  104.    system ("cls");
  105. }
  106. /**************  FUNCION ASIGNACION DE MEMORIA  **************/
  107. char **asig_memoria(int dim_plus )
  108. {
  109.    int i;
  110.    char** matriz;
  111.    matriz = malloc( dim_plus * sizeof *matriz );
  112.    for( i = 0; i < dim_plus; ++i )
  113.         matriz[i] = malloc( dim_plus * sizeof **matriz );
  114.   return matriz;
  115. }
  116. /**************  FUNCION IMPRIMIR  **************/
  117. void imprimir(char **matriz,int dim_plus,int color_juego)
  118. {
  119.    int i=0,j=0;
  120.    system ("cls");
  121.    for (i=0;i<dim_plus;i++)
  122.    {
  123.        for (j=1;j<dim_plus;j++)
  124.        {
  125.            if (i==0)
  126.                {
  127.                    printf ("[%d] ",j);
  128.                    fflush (stdout);
  129.                }
  130.  
  131.            else
  132.                {
  133.                    printf ("(%c) ",matriz[i][j]);
  134.                    fflush (stdout);
  135.                }
  136.        }
  137.        puts("");
  138.    }
  139. }
  140. /**************  FUNCION COMPROBAR GANADOR  **************/
  141. void comprobar_ganador (char **matriz , int jugador, int x, int y,int dim_plus,int color_juego)
  142. {
  143.    int k=1,cont=1;
  144.    for (k=1;k<5;k++)
  145.    {
  146.        if ( x+k <= dim_plus && y+k <= dim_plus && matriz[x][y]==matriz[x+k][y+k])
  147.            contador (&cont, matriz,jugador,dim_plus,  color_juego);
  148.        else
  149.            break;
  150.    }
  151.    for (k=1;k<5;k++)
  152.    {
  153.        if ( x+k > 0 && y+k > 0 && matriz[x][y]==matriz[x-k][y-k])
  154.            contador (&cont, matriz,jugador,dim_plus,  color_juego);
  155.        else
  156.            break;
  157.    }
  158.    cont=1;
  159.    for (k=1;k<5;k++)
  160.    {
  161.        if ( x+k <= dim_plus && y+k > 0 && matriz[x][y]==matriz[x+k][y-k])
  162.            contador (&cont, matriz,jugador,dim_plus,  color_juego);
  163.        else
  164.            break;
  165.    }
  166.    for (k=1;k<5;k++)
  167.    {
  168.        if ( x+k > 0 && y+k <= dim_plus && matriz[x][y]==matriz[x-k][y+k])
  169.            contador (&cont, matriz,jugador,dim_plus,  color_juego);
  170.        else
  171.            break;
  172.    }
  173.    cont=1;
  174.    for (k=1;k<5;k++)
  175.    {
  176.        if ( x+k <= dim_plus && matriz[x][y]==matriz[x+k][y])
  177.            contador (&cont, matriz,jugador,dim_plus,  color_juego);
  178.        else
  179.            break;
  180.    }
  181.     cont=1;
  182.     for (k=1;k<5;k++)
  183.    {
  184.        if ( y+k <= dim_plus && matriz[x][y]==matriz[x][y+k])
  185.            contador (&cont, matriz,jugador,dim_plus,  color_juego);
  186.        else
  187.            break;
  188.    }
  189.    for (k=1;k<5;k++)
  190.    {
  191.        if (y+k > 0 && matriz[x][y]==matriz[x][y-k] )
  192.            contador (&cont, matriz,jugador,dim_plus,  color_juego);
  193.        else
  194.            break;
  195.    }
  196. }
  197. /**************  FUNCION LIBERAR MEMORIA  **************/
  198. void liberar_mem_matriz( char** matriz, int dim_plus )
  199. {
  200.   int i;
  201.   for( i = 0; i < dim_plus; ++i )
  202.      free( matriz[i] );
  203.   free( matriz );
  204. }
  205. /**************  FUNCION CONTADOR   **************/
  206. void contador(int* cont,char** matriz,int jugador, int dim_plus, int color_juego)
  207. {
  208.    int gana_empata=1;
  209.    *cont=+*cont+1;
  210.    if (*cont==4)
  211.    {
  212.        imprimir( matriz, dim_plus+1, color_juego);
  213.        ganador (matriz,jugador,dim_plus,  color_juego,gana_empata);
  214.    }
  215. }
  216. /**************  FUNCION GANADOR   **************/
  217. void ganador (char** matriz,int jugador, int dim_plus, int color_juego,int gana_empata)
  218. {
  219.    if (gana_empata==1)
  220.        printf ("Ganó el JUGADOR %d\n",jugador);
  221.    else if (gana_empata==0)
  222.        puts("EMPATE");
  223.    else
  224.        puts("¡ERROR!");
  225.    puts ("Hasta lueguito.");
  226.    salir( matriz, dim_plus );
  227. }
  228. /**************  FUNCION SALIR  **************/
  229. void salir( char** matriz, int dim_plus )
  230. {
  231.    int i;
  232.    for( i = 0; i < dim_plus; ++i )
  233.        free( matriz[i] );
  234.    free( matriz );
  235.    system ("pause");
  236.    exit (0);
  237. }
  238. /**************  FIN  **************/
  239.  

Próximamente habrán más novedades/variantes del /los juegos, tanto del Conecta-4 como del 4 en línea.

Por supuesto que serán bienvenidas las críticasy/o sugerencias.

Ya adelanto que la intención es que tenga color y que se pueda elegir entre seguir jugando o salir. Detallitos que espero hagan más sugerente el/los jueguitos.

Y sí, ya sé que lo he "complicado" con tanta función pero de eso iba el "envite" deKaL3o . ;)


Saluditos!.
« Última modificación: 31 Diciembre 2013, 11:58 am por leosansan » En línea

mathias_vg

Desconectado Desconectado

Mensajes: 39


Ver Perfil
Re: Juego 4 en linea. Ayuda!!!
« Respuesta #25 en: 11 Junio 2013, 19:57 pm »

Me podrian decir porque entra en bucle cuando elijo un caracter? Que es lo que tengo que modificar?

Muchas gracias
En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Juego 4 en linea. Ayuda!!!
« Respuesta #26 en: 11 Junio 2013, 23:31 pm »

Me podrían decir porque entra en bucle cuando elijo un caracter? Que es lo que tengo que modificar?


Ya sabía que tarde o temprano te darías cuanta por ti mismo. Se debe a que el caracter, no utilizado porque el scanf no lo reconoce, ya que el espera un int, se queda en el bufer y en la próxima llamada al scanf éste toma automáticamente el valor del carcater que quedo en el bufer  y y así sucesivamente  entrando por ello en un bucle.

Fíjate e los detalles de mi código:

Código
  1. do
  2.    {
  3.        scanf ("%d",&dim);
  4.        if (dim<4 || dim>10 )
  5.        {
  6.            printf("\n\n\t\tOpción no valida.\n\n\t\tIngresa la dimensión (4-10): ");
  7.            fflush (stdout);
  8.        }
  9.  
  10.        while (getchar()!='\n'); /*<==limpio el buffer e impido entrar en un bucle*/
  11.    }while (dim<4 || dim>10);

Eso en los scanf de tipos numéricos, no hace falta cuando son de tipo char.


Saluditos! .... ..
« Última modificación: 12 Junio 2013, 07:37 am por leosansan » En línea

mathias_vg

Desconectado Desconectado

Mensajes: 39


Ver Perfil
Re: Juego 4 en linea. Ayuda!!!
« Respuesta #27 en: 12 Junio 2013, 15:05 pm »

Gracias leosansan, ahora, te pregunto, hay alguna manera de hacerlo sin tener que utilizar la funcion getchar? ya que no la dimos en clase y no se si la puedo utilizar.
algo como transformar el caracter de entrada en numero y asi que me marque el error?

Saludos
En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Juego 4 en linea. Ayuda!!!
« Respuesta #28 en: 12 Junio 2013, 16:08 pm »

Gracias leosansan, ahora, te pregunto, hay alguna manera de hacerlo sin tener que utilizar la funcion getchar? ya que no la dimos en clase y no se si la puedo utilizar.
algo como transformar el caracter de entrada en numero y así que me marque el error?


Si sólo fuera un caracter podrías hacer uso de atoi, y aún así habría que añadir la condición de >0 y <15, pero como ves el "15" no es un caracter sino una cadena, con lo que no valdría el uso de dicha función y, en principio lo que se me ocurre a bote proto, sería  usar una función como "strol". Pero se me hace difícil entender que no uses getchar, que es una función muy usada de la librería stdio y, a cambio, te metas con funciones de la librería string que conllevan más cosas para lograr el objetivo.

Usa getchar.

Es más, en varios compiladores -e.j. Dev-C++- es una función que se aprende al tiempo que el uso de main o printf, pues si no la ponen al final del código el programa se ejecuta y se cierra de un golpe y, en ese caso, se usa getchar "como freno" para "ver" la consola antes de que ésta se cierre.



Saluditos!.
     
En línea

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

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines