Autor
|
Tema: Juego del gato (Leído 22,542 veces)
|
m@o_614
Desconectado
Mensajes: 389
|
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 if(j<MAX_COLUM) } if(i<MAX_FILA) } } 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): "); printf("Dime la columna(1 a 3): "); letra=jugador[i]; imprimir_tablero(letra,fila,columna); turno++; } }while(turno<=MAX_TURNO); }
y no tengo idea de como modificarlo de antemano gracias
|
|
|
En línea
|
|
|
|
Ferno
Desconectado
Mensajes: 375
|
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".
|
|
|
En línea
|
|
|
|
durasno
Desconectado
Mensajes: 373
|
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
|
|
« Última modificación: 13 Abril 2012, 02:14 am por durasno »
|
En línea
|
Ahorrate una pregunta, lee el man
|
|
|
m@o_614
Desconectado
Mensajes: 389
|
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)) else } } 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): "); printf("Dime la columna(1 a 3): "); letra=jugador[i]; imprimir_tablero();//aqui ya no supe como mandarle la matriz turno++; } }while(turno<=MAX_TURNO); }
|
|
|
En línea
|
|
|
|
durasno
Desconectado
Mensajes: 373
|
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')) else } } } 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): "); printf("Dime la columna(1 a 3): "); 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
|
|
|
En línea
|
Ahorrate una pregunta, lee el man
|
|
|
s00rk
Desconectado
Mensajes: 195
|
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.
|
|
|
En línea
|
|
|
|
durasno
Desconectado
Mensajes: 373
|
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
|
|
|
En línea
|
Ahorrate una pregunta, lee el man
|
|
|
s00rk
Desconectado
Mensajes: 195
|
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 #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; }
|
|
« Última modificación: 14 Abril 2012, 07:02 am por s00rk »
|
En línea
|
|
|
|
m@o_614
Desconectado
Mensajes: 389
|
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')) else } } } 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): "); printf("Dime la columna(1 a 3): "); letra=jugador[i]; gato[fila-1][columna-1]=letra; imprimir_tablero(gato); verificar_ganador(gato); printf("Pulse enter para continuar...\n"); turno++; } }while(turno<=MAX_TURNO); }
gracias
|
|
|
En línea
|
|
|
|
s00rk
Desconectado
Mensajes: 195
|
El error es en eso que haces con la suma deberia ser asi: 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
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Juego Gato Inteligente.
Programación C/C++
|
xcoverdalex
|
5
|
7,873
|
2 Septiembre 2010, 15:00 pm
por xcoverdalex
|
|
|
Juego Gato
Java
|
Lain0x
|
2
|
9,916
|
22 Marzo 2011, 05:43 am
por sapito169
|
|
|
juego del gato
Java
|
m@o_614
|
4
|
5,125
|
8 Mayo 2012, 22:04 pm
por m@o_614
|
|
|
Ayuda con el juego del gato
Programación C/C++
|
Dieux Rablia
|
3
|
3,874
|
20 Mayo 2012, 18:59 pm
por Dieux Rablia
|
|
|
Recomendad un juego al gato.
« 1 2 3 »
Juegos y Consolas
|
Saberuneko
|
21
|
30,558
|
19 Junio 2012, 13:40 pm
por Saberuneko
|
|