Si te planto el código sin más no vas a aprender nada de nada... Si al menos pusieses dónde te quedas, o qué es lo que no sabes... Porque no tienen mucha, mucha dificultad... ¿Los has intentado? ¿Qué errores te da? ¿Dónde te atascas?
Aun así te pongo el último.
Código c:
Ver original#include<stdio.h>
enum jugador{A=-1, B=1};
unsigned tresenraya(unsigned tabla[3][3], unsigned jug){
unsigned ganador = 0;
if(tabla[0][0] == jug){
if(tabla[1][0] == jug && tabla[2][0] == jug)
ganador = jug;
else
if(tabla[1][1] == jug && tabla[2][2] == jug)
ganador = jug;
else
if(tabla[0][1] == jug && tabla[0][2] == jug)
ganador = jug;
}
if(tabla[1][1] == jug){
if(tabla[2][0] == jug && tabla[0][2] == jug)
ganador = jug;
else
if(tabla[0][1] == jug && tabla[2][1] == jug)
ganador = jug;
else
if(tabla[1][0] == jug && tabla[1][2] == jug)
ganador = jug;
}
if(tabla[2][2] == jug){
if(tabla[2][1] == jug && tabla[2][0] == jug)
ganador = jug;
else
if(tabla[1][2] == jug && tabla[0][2] == jug)
ganador = jug;
}
return ganador;
}
void validaJugada(unsigned tabla[3][3], unsigned jugador){
char c;
unsigned fil, col;
if(jugador == A)
c = 'A';
else
c = 'B';
printf("\nJugador %c introduzca su jugada (fila<espacio>columna): ", c
); -- fil;
-- col;
if(tabla[fil][col] != 0)
fil = 3;
while(fil<0 || fil>2 || col<0 || col>2){
printf("\nERROR: Jugada incorrecta. Intentelo de nuevo jugador %c: ", c
); -- fil;
-- col;
if(tabla[fil][col] != 0)
fil = 3;
}
tabla[fil][col] = jugador;
}
void imprimeTablero(unsigned tabla[3][3]){
unsigned i, j;
printf("\n\n TABLERO DE JUEGO:\n"); for(i=0; i<3; ++i){
for(j=0; j<3; ++j)
if(tabla[i][j] == 1)
else
if(tabla[i][j] == -1)
else
}
}
int main(){
unsigned fil, col, jugador, tabla [3][3], i=1;
char c;
for(fil=0; fil<3; ++fil)
for(col=0; col<3; ++col)
tabla[fil][col] = 0;
do{
jugador = A;
imprimeTablero(tabla);
validaJugada(tabla, jugador);
if(tresenraya(tabla, jugador) == 0){
if(i<5){
jugador = B;
imprimeTablero(tabla);
validaJugada(tabla, jugador);
}
else
i = 9;
}
++i;
}while(tresenraya(tabla, jugador) == 0 && i<6);
imprimeTablero(tabla);
if(i == 10)
printf("\n\nEmpate, no hay mas movimientos posibles."); else
if(jugador == A)
printf("\n\nEnhorabuena jugador A, has ganado."); else
printf("\n\nEnhorabuena jugador B, has ganado.");
printf("\n\nPulse <enter> para finalizar...\n"); while(c!='\n'){
}
return 0;
}
En el enunciado no ponía nada así que he supuesto el tres en raya básico, en el que no se pueden mover fichas, si sí se pueden mover bastaría con cuando cada uno haya puesto sus tres fichas (3 iteraciones de bucle) crear otro bucle en el que al usuario se le pida primeramente qué ficha desea desplazar (se compruebe si es suya o no) y a qué posición desea desplazarla (y se compruebe si está ocupada o no). Una tontería vamos.
El enunciado no pide ni las funciones validaJugada( ), ni imprimeTablero( ), si las quitas, el rendimiento será mucho mayor y te evitarás muchísimas líneas, disminuyendo hasta el main( ), pero claro, tendrás que ser "adivino" para ver cómo va el juego cuando juegues y pasar de todo si te meten entradas no válidas.
Puestos a validar habría que validar que metiesen carácteres en vez de números, pero bueno, no tengo ganas... xD.
He añadido un parámetro a tresenraya( ) para que no tenga que preguntar cada vez si es 1 o si es -1, sólo debería preguntar si es el último jugador que introdujo la ficha. Si A acaba de meter ficha, ya sabemos que B no ha ganado, lo acabamos de comprobar antes y no ha metido ninguna ficha, qué tontería... Si no te gusta pues le quitas el parámetro y preguntas por ambos.
Estoy totalmente abierto a discusión en cuanto al rendimiento de tresenraya( ), se podría haber metido un booleano "Ganador" para no hacer más preguntas una vez que sabes que hay ganador, pero como dicha situación se va a dar una única vez, no merece la pena meter una pregunta más por cada vez que la llamemos... Hombre, lo que sí está claro es que podríamos haber metido "breaks" a mansalva y la mejora sería increíble, pero soy partidario del C estructurado.