[C] Duda TATETI
en 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:
Código
#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.
Código
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++; } //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