Juego del gato

Iniciado por m@o_614, 12 Abril 2012, 05:09 AM

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

m@o_614

muchas gracias s00rk ya me fije en donde me estaba equivocando en validar segunda fila no era i=1,j=1 era i=1,j=0 :o y ya le agregue tambien la diagonal invertida

int i,j,suma=0;
   for(i=0;i<MAX_FILA;i++)
   {
       if((gato[i][i])==X_ASCII)//VALIDAR DIAGONAL
          suma=suma+gato[i][i];
   }
   if(suma==264)
      printf("El ganador es el jugador X\n");

   for(i=2,j=0;j<MAX_COLUM;i--,j++)//VALIDA DIAGONAL INVERTIDA
   {
       if((gato[i][j]==X_ASCII))
          suma=suma+gato[i][j];
   }
   if(suma==264)
      printf("El ganador es el jugador X\n");

   for(i=0,j=0;j<MAX_COLUM;j++)//VALIDA LA PRIMERA FILA
   {
      if((gato[i][j])==X_ASCII)//aqui tambien me falta validar para O pero eso ya despues
         suma=suma+gato[i][j];
   }
   if(suma==264)
      printf("El ganador es el jugador X\n");

   for(i=1,j=0;j<MAX_COLUM;j++)//VALIDA SEGUNDA FILA
   {
       if((gato[i][j])==X_ASCII)
          suma=suma+gato[i][j];
   }
   if(suma==264)
      printf("El ganador es el jugador X\n");

   for(i=2,j=0;j<MAX_COLUM;j++)//VALIDA TERCER FILA
   {
       if(gato[i][j]==X_ASCII)
          suma=suma+gato[i][j];
   }
   if(suma==264)
      printf("El ganador es el jugador X\n");


todavia me faltan varias cosas más pero como todavia estoy un poco verde para programar voy a paso de tortuga :-\

s00rk

Algo que te falta ahi es terminar el metodo si es que gano y si no gano regresar la suma a 0, para en el siguiente chequeo tenga 0 y no lo que ya tenia anteriormente ya que de esa forma si en el primero se encontro una X, pero no e toda la diagonal suma ya tendra un valor y si en una fila estan todas las X, pero como suma ya tenia un valor pues ya con eso no encontrara un ganador.

Ejemplo:

if(suma == 264)
{
    // Mensaje de ganador
    return; // Termina el metodo o la funcion ..
}
suma = 0; // Regresamos suma a su valor original

m@o_614

pues aqui tengo el codigo, ahora ya compila bien a excepcion de dos errores que encontre, el primero

que las primeras veces que le meto X u O a la matriz me verifica perfectamente si hay ganador o no, pero a partir como del 5to turno ya no lo hace :-\ me aparece que el ganador es X, cuando en realidad no hay ganador

y el segundo que le implemente una bandera ganador para que el do-while me siga iterando mientras el numero de turnos sea menos o igual a 9 y la bandera sea igual a 0(osea que todavia no haya encontrado ganador)pero en vez de romper el ciclo inmediatamente cuando una de estas condiciones no se cumple me itera una vez más antes de salirse del ciclo.

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

#define MAX_FILA 3
#define MAX_COLUM 3
#define MAX_JUG 2
#define MAX_TURNO 9
#define O_ASCII 79
#define X_ASCII 88

void turno_jugador();
void imprimir_tablero(char gato[MAX_FILA][MAX_COLUM]);
int verificar_ganador(char gato[MAX_FILA][MAX_COLUM]);

int main()
{
    printf("Juego del Gato v1.0\n");
    turno_jugador();
    return 0;
}

void imprimir_tablero(char gato[MAX_FILA][MAX_COLUM])
{
    int i,j;
    for(i=0;i<MAX_FILA;i++)
    {
        for(j=0;j<MAX_COLUM;j++)
        {
            if((gato[i][j]=='X')||(gato[i][j]=='O'))
                printf("%c",gato[i][j]);
            else
               printf(" ");
               printf("|");
        }
        printf("\n");
           printf("______");
        printf("\n");
    }
}

int verificar_ganador(char gato[MAX_FILA][MAX_COLUM])
{
    int i,j,suma=0,ganador;

    for(i=0;i<MAX_FILA;i++)
    {
        for(j=0;j<MAX_COLUM;j++)
        {
            if((gato[i][j])==X_ASCII)//me falta validar para O tambien, pero eso despues
               suma=suma+gato[i][j];
        }
    }
     if(suma==264)
     {
         printf("El ganador es el jugador X\n");
         ganador=1;
     }
     else
        ganador=0;
     return ganador;
}
void turno_jugador()
{
    int fila,columna,i,turno,ganador;
    char jugador[]={'X','O'},letra;
    char gato[MAX_FILA][MAX_COLUM];
    turno=1;
    do
    {
        for(i=0;i<MAX_JUG;i++)
        {
            printf("Es turno del jugador %c\n",jugador[i]);
            printf("Dime la fila (1 a 3): ");
            scanf("%d",&fila);
            printf("Dime la columna(1 a 3): ");
            scanf("%d",&columna);
            letra=jugador[i];
            gato[fila-1][columna-1]=letra;
            imprimir_tablero(gato);
            ganador=verificar_ganador(gato);
            printf("Pulse enter para continuar...\n");
            getch();
            system("cls");
            turno++;
        }
    }while((turno<=MAX_TURNO)&&(!ganador));
}


de antemano gracias

s00rk

#13
El error de que aveces gana y no es verdad podria ser por esto mira imaginemos que nuestra tabla quedo asi:

X | X | O
O | X |

Aqui ya en el quinto movimienten tu codigo

Código (cpp) [Seleccionar]
for(i=0;i<MAX_FILA;i++)
    {
        for(j=0;j<MAX_COLUM;j++)
        {
            if((gato[i][j])==X_ASCII)//me falta validar para O tambien, pero eso despues
               suma=suma+gato[i][j];
        }
    }


llegara a encontrar las 3 X primero por lo que al final en ese turno obtendras suma = 264, lo que vendria siend el ganador, para evitar esto ese bucle deberia quedar asi:

Código (cpp) [Seleccionar]
for(i=0;i<MAX_FILA;i++)
    {
        for(j=0;j<MAX_COLUM;j++)
        {
            if((gato[i][j])==X_ASCII)//me falta validar para O tambien, pero eso despues
               suma=suma+gato[i][j];
        }
        if(suma == 264)
        {
            printf("El ganador es el jugador X\n");
            ganador=true;
        }
        suma = 0;
    }
if(ganador) // Esto para asi ya no seguir buscando si ya se encontro el ganador
    return true;


Luego tu error de que sigue dndo vuelta es por tu mismo while la variable ganador mejor tratala como bool y asi ya te funcionaria, junto con el codigo que te puse aqui corregido.