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

Saludos
Tengo un problema con mi codigo del Juego del Gato que estoy haciendo, el programa me tiene que inicializar la matriz vacia, y despues cuando le pido al usuario que ingrese la posición de la fila y la columna me tiene que imprimir la letra(X u O) en la casilla.Pero mi codigo por cada vez que le pide al usuario la posicion me las imprime en tableros diferentes en vez de en uno solo

#define MAX_FILA 3
#define MAX_COLUM 3
#define MAX_JUG 2
#define MAX_TURNO 9

void turno_jugador();
void imprimir_tablero(char letra, int fila, int columna);

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

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

void turno_jugador()
{
    int fila,columna,i,turno;
    char jugador[]={'X','O'},letra;
    do
    {
        turno=1;
        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];
            imprimir_tablero(letra,fila,columna);
            turno++;
        }
    }while(turno<=MAX_TURNO);
}


y no tengo idea de como modificarlo
de antemano gracias

Ferno

Es porque estás creando tantos tableros como turnos existen. Cada vez que entras a la función "imprimir_tablero" estás creando una nueva matriz (en este caso un nuevo tablero).
Para solucionarlo, debés crear el tablero matriz en la función "turno_jugador" y pasar la matriz como parámetro en la función "imprimir_tablero".

durasno

#2
Hola!  algunos errores y cosas para mejorar:
1º en la funcion turno_jugador() al inicializar turno=1 dentro del do-while lo que estas haciendo es generar un ciclo infinito, si bien turno se incremento dentro del for, al salir del for, turno se vuelve a inicializar en 1 por ende nunca termina. Deberias hacerlo fuera del do-while.

2º printf("%c",letra,gato[j]);
¿por que en los printf de la funcion imprimir_tablero() le pasas como argumento el arreglo gato? si no lo estas utilizando para nada no es necesario ponerlo

3º  if(j<MAX_COLUM)
              printf("|");
La condicion del if no es necesaria, esa misma condicion esta en el for. Solo basta con poner printf("|"); Al igual q if(i<MAX_FILA)

4º el programa pide filas y columnas del 1 a 3, osea el usuario va ingresar un numero entre 1 y 3, pero los arreglos se inician en 0, en algun momento deberias restarle 1 a esos numeros ingresado por el usuario; sino no se va a imprimir bien

5º Lo mas importante es lo que dijo Ferno, deberias pasar una matriz a la funcion imprimir_tablero() pero antes(o despues ) debes guardar "letra" en la matriz. Ademas debes cambiar esta condicion:
           if((fila==i)&&(columna==j))
              printf("%c",letra,gato[j]);
por una donde puedas imprimir todas la letras en el tablero y no solo una

Cualquier cosa segui preguntando, saludos
Ahorrate una pregunta, lee el man

m@o_614

saludos

gracias ferno y durasno estuve checando las modificaciones que tenía que hacerle al código pero no pude hacer la mas importante, no pude mandar la matriz de nuevo a la función imprimir_matriz aqui esta el codigo

#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

void turno_jugador();
void imprimir_tablero(char letra, int fila, int columna);

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

void imprimir_tablero(char letra, int fila, int columna)
{
   ??????
}

void turno_jugador()
{
    int fila,columna,i,j,turno;
    char jugador[]={'X','O'},letra;
     for(i=0;i<MAX_FILA;i++)//cree la matriz en la función turno_jugador.
    {
        for(j=0;j<MAX_COLUM;j++)
        {
            if((fila-1==i)&&(columna-1==j))
               printf("%c",letra);
            else
               printf(" ");
               printf("|");
        }
        printf("\n");
           printf("______");
        printf("\n");
    }
    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];
            imprimir_tablero();//aqui ya no supe como mandarle la matriz
            turno++;
        }
    }while(turno<=MAX_TURNO);
}

durasno

Hola! nose porque pusiste las dos funciones en una, o tipiaste mal??

Tomando como ejemplo el primero programa que hiciste solo necesitas un par de cambios:
#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

void turno_jugador();
void imprimir_tablero(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");
    }
}

void turno_jugador()
{
    int fila,columna,i,turno=1;
    char jugador[]={'X','O'},letra;
    char gato[MAX_FILA][MAX_COLUM];
    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; // guardo la letra del jugador en la matriz
            imprimir_tablero(gato); // paso la matriz a la funcion
            turno++;
        }
    }while(turno<=MAX_TURNO);
}


Cambie el prototipo de la funcion imprimir_tablero().
Defini una matriz en turno_jugador() donde le guardo la letra correspondiente.
Y cambie la condicion de imprimir las letras

Saludos
Ahorrate una pregunta, lee el man

s00rk

Yo le agregaria ahi en el codigo un chequeo que en la posicion que se decea ingresar que este vacia o que no exista una X u O, y si en tal posicion existe alguna de ellas vuelva a pedir la posicion.

durasno

Claro eso seria optimizar el codigo pero primero lo basico xD. Ademas de lo que dijo s00rk tambien podrias comprobar que el usuario no ingrese un numero menor a 1 y mayor a 3

Saludos
Ahorrate una pregunta, lee el man

s00rk

#7
Bueno aqui yo hice el propio aunque aun me falto hacer el codigo para checar si hubi un ganador hehehe! xD
Solo puse que siempre regrese 0, pero ahi se ocupa solo checar la tabla y pues que recorra y ya si encuentra un ganador pues regresa el numero del jugador 1 si el ganador es el X o 2 si el ganador es el O. Por ahora pues debo salir so lo hice rapido, si tengo tiempo luego pues hago la parte que me falto si es que alguien no la hace por aca xP

Código (cpp) [Seleccionar]
#include <iostream>
using namespace std;

#define MAX_TURNO 9
#define COLUMNA 3
#define FILA 3

void MostrarTabla(char TABLA[FILA][COLUMNA]);
int ChecarGanador(char TABLA[FILA][COLUMNA]);

int main()
{
char TABLA[FILA][COLUMNA];
int turno = 1, fila, columna, ganador = 0;
bool bandera = false;
MostrarTabla(TABLA);

do{
ganador = ChecarGanador(TABLA);
if(ganador != 0)
{
cout << "El Ganador es el JUGADOR [ " << ganador << " ]" << endl;
break;
}
cout << "Turno del jugador: " << ((turno%2 == 0) ? "2" : "1") << endl;
do{
bandera = false;
do{
cout << "Selecciona Fila (1 - 3) : ";
cin >> fila;
}while(fila > 3 && fila < 1);
do{
cout << "Selecciona Columna (1 - 3) : ";
cin >> columna;
}while(columna > 3 && columna < 1);
if(TABLA[fila-1][columna-1] != -52)
{
bandera = true;
cout << "Esta posicion ya fue seleccionada" << endl;
}else
TABLA[fila-1][columna-1] = ((turno%2 == 0) ? 'O' : 'X');

}while(bandera);
MostrarTabla(TABLA);
turno++;
}while(MAX_TURNO >= turno);

if(ganador == 0)
{
cout << "Empate!! ;D" << endl;
}
cout << "Fin del Juego!" << endl;
cin.get();cin.get();
return 0;
}

void MostrarTabla(char TABLA[FILA][COLUMNA])
{
cout << endl << "----------" << endl;
for(int x = 0; x < FILA; x++)
{
for(int xx = 0; xx < COLUMNA; xx++)
{
cout << "| " << ((TABLA[x][xx] != -52) ? TABLA[x][xx] : ' ');
}
cout << "|" << endl;
}
cout << "----------" << endl;
}

int ChecarGanador(char TABLA[FILA][COLUMNA])
{
int p1 = 0, p2 = 0;

// Horizontal
for(int x = 0; x < FILA; x++)
{
for(int xx = 0; xx < COLUMNA; xx++)
{
if(TABLA[x][xx] == 'X')
p1++;
else if(TABLA[x][xx] == 'O')
p2++;
}
if(p1 == 3)
return 1;
else if(p2 == 3)
return 2;
else{
p1 = 0;
p2 = 0;
}
}
// Vertical
for(int x = 0; x < COLUMNA; x++)
{
for(int xx = 0; xx < FILA; xx++)
{
if(TABLA[xx][x] == 'X')
p1++;
else if(TABLA[xx][x] == 'O')
p2++;
}
if(p1 == 3)
return 1;
else if(p2 == 3)
return 2;
else{
p1 = 0;
p2 = 0;
}
}

// Diagonales
if(TABLA[0][0] == 'X' && TABLA[1][1] == 'X' && TABLA[2][2] == 'X')
return 1;
else if(TABLA[0][0] == 'O' && TABLA[1][1] == 'O' && TABLA[2][2] == 'O')
return 2;
else if(TABLA[0][2] == 'X' && TABLA[1][1] == 'X' && TABLA[2][0] == 'X')
return 1;
else if(TABLA[0][2] == 'O' && TABLA[1][1] == 'O' && TABLA[2][0] == 'O')
return 2;

return 0;
}

m@o_614

saludos, no pude postear el resto del codigo antes  por falta de tiempo, pero lo que intente hacer fue validar cuando hay un ganador pero tengo problemas por que no se como hacer que cheque todas las condiciones al mismo tiempo

#define MAX_FILA 3
#define MAX_COLUM 3
#define MAX_JUG 2
#define MAX_TURNO 9
#define O_ASCII 237
#define X_ASCII 264

void turno_jugador();
void imprimir_tablero(char gato[MAX_FILA][MAX_COLUM]);
void 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");
    }
}

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

    for(i=0,j=0;j<MAX_COLUM;j++)//VALIDA LA PRIMERA FILA
    {
        if((suma+=gato[i][j])==X_ASCII)//aqui tambien me falta validar para O pero eso ya despues
           printf("El ganador es el jugador X\n");
    }
    for(i=1,j=1;j<MAX_COLUM;j++)//VALIDA LA SEGUNDA FILA
    {
        if((suma+=gato[i][j])==X_ASCII)
           printf("El ganador es el jugador X\n");
    }
    for(i=2,j=2;j<MAX_COLUM;j++)
    {
        if(suma+=gato[i][j]==X_ASCII)
           printf("El ganador es el jugador X\n");//VALIDAR LA TERCERA FILA
    }/*para sacar las columnas solo inviertes el gato[j][i]*/

}
void turno_jugador()
{
    int fila,columna,i,turno=1;
    char jugador[]={'X','O'},letra;
    char gato[MAX_FILA][MAX_COLUM];
    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);
            verificar_ganador(gato);
            printf("Pulse enter para continuar...\n");
            getch();
            system("cls");
            turno++;
        }
    }while(turno<=MAX_TURNO);
}


gracias

s00rk

El error es en eso que haces con la suma deberia ser asi:

Código (c++) [Seleccionar]

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

    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++;
    }
if(suma == 3)
    printf("El ganador es el jugador X\n");


Bueno y pues ya sabes el resto  hehehe, lo unico que te faltaria seria la diagonal invertida ;D