Siguiendo con el tema de :
[C] Duda TATETIen ese tema puse un codigo para Generar un Arbol de N niveles apartir de una jugada inicial
Ahora toca evaluar todos los nodos (Juegos) para asi poder decidir el mejor movimiento
Dada las siguientes definiciones y estructuras:
#define UNKNOW 0 //Nobody win yet
#define O_WIN 1
#define X_WIN 2
#define DRAW 3
#define ERROR 4
struct tablero {
uint8_t juego[3][3];
};
Hice esta funcion que evalua las 3 Filas , 3 Columnas y 2 Diagonales. Adicional evaluar si es empate, si todavia nadie gana y si existe alguna discrepancia en el tablero
La pregunta aqui es, ¿Existe una forma mas eficiente de hacer esto?
Me refiero a que se me hace bastante pesado evaluar todas las lineas xD..
NOTA: No he compilado el codigo por lo que puedw tener errores.
uint8_t estatus_juego(struct tablero *t) {
uint8_t e; //Estatus a devolver
register uint8_t i = 0,j = 0;
uint8_t contador_X,contador_O,casilla;
bool continuar = true;
//Procedemos a validar las 3 Lineas horizontales
i = 0;
while(continuar && i < 3) {
j = 0;
casilla = t->juego[i][j];
j++;
while(continuar && j < 3 && ) {
if(casilla != t->juego[i][j] || !t->juego[i][j]) {
continuar = false;
}
j++;
}
if(continuar){
//si continuar sigue siendo true en este punto el jugador casilla Gana y ya no es necesario evaluar los otros casos
continuar = false; // Establemos continuar como false para que ya no entre al ciclo siguiente
}
else {
//En caso de que continuar sea false, significa que debemos seguir evaluando las lineas restantes
continuar = true // Establemos continuar como true para que si entre al ciclo siguiente
}
i++;
}
if(continuar) {
//Continuamos la evaluacion de las lineas Verticales
i = 0;
while(continuar && i < 3) {
j = 0;
casilla = t->juego[j][i];
j++;
while(continuar && j < 3) {
if(casilla != t->juego[j][i] || !t->juego[j][i] ) {
continuar = false;
}
j++;
}
if(continuar){
//si continuar sigue siendo true en este punto el jugador casilla Gana y ya no es necesario evaluar los otros casos
continuar = false; // Establemos continuar como false para que ya no entre al ciclo siguiente
}
else {
//En caso de que continuar sea false, significa que debemos seguir evaluando las lineas restantes
continuar = true // Establemos continuar como true para que si entre al ciclo siguiente
}
i++;
}
if(continuar) { //Evaluamos las lineas Diagonales
casilla = t->juego[0][0];
if(casilla == t->juego[1][1] && casilla == t->juego[2][2] && casilla != 0) {
if(casilla == 'X') {
e = X_WIN;
}
else {
e = O_WIN;
}
}
else {
casilla = t->juego[0][2];
if(casilla == t->juego[1][1] && casilla == t->juego[2][0] && casilla != 0) {
if(casilla == 'X') {
e = X_WIN;
}
else {
e = O_WIN;
}
}
else {
//Todavia nadie gana o es empate en caso de que ya no queden casillas libres
contador_X = 0;
contador_O = 0;
i = 0;
while(i < 3) {
j = 0;
while(j < 3) {
if(t->juego[i][j] == 'X') {
contador_X++;
}
else {
if(t->juego[i][j] == 'O') {
contador_O++;
}
}
j++;
}
i++;
}
if(abs(contador_O
-contador_X
) > 1) { //ERROR de Tablero, no es posible que un jugador tenga 2 o mas 'fichas' que el otro en el tablero
e = ERROR;
}
else {
if(contador_X+contador_O < 9) {
e = UNKNOW;
}
else {
e = DRAW;
}
}
}
}
}
else {
//En este punto evaluamos quien gano
if(casilla == 'X') {
e = X_WIN;
}
else {
e = O_WIN;
}
}
}
else {
//En este punto evaluamos quien gano
if(casilla == 'X') {
e = X_WIN;
}
else {
e = O_WIN;
}
}
return e;
}
Saludos