Optimizar evaluación de juego de TATETI

Iniciado por AlbertoBSD, 29 Agosto 2016, 14:56 PM

0 Miembros y 1 Visitante están viendo este tema.

AlbertoBSD

Siguiendo con el tema de :

[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:

#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
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

HardForo

Segun la Wikipedia se puede programar un jugador perfecto, inclusive proveen las reglas para el juego "perfecto", seguro puedes hacer que juegue bien (primero el centro, luego la preferencia son las esquinas,...) pero si has seguido ese algoritmo tu IA o gana o empata  ;D

https://en.wikipedia.org/wiki/Tic-tac-toe

Por cierto, se ve muy bien tu código.
HardForo:  foro de Hardware y programación

Se buscan Mods y colaboradores *