From 1a08d45c8201370115771264538e5356ebdf7ae5 Mon Sep 17 00:00:00 2001 From: jdg Date: Sun, 12 Sep 2021 19:47:27 +0200 Subject: [PATCH] First commit 24/10/1997 --- 4R.CPP | 323 ++++++++++++++++++++++++ 4RAYA.CPP | 323 ++++++++++++++++++++++++ EGAVGA.BGI | Bin 0 -> 5554 bytes OSC.CPP | 690 +++++++++++++++++++++++++++++++++++++++++++++++++++ OSC.EXE | Bin 0 -> 46343 bytes README.md | 9 + SVGA256.BGI | Bin 0 -> 5381 bytes TCOMPROB.CPP | 20 ++ TCOMPROB.EXE | Bin 0 -> 10771 bytes 9 files changed, 1365 insertions(+) create mode 100644 4R.CPP create mode 100644 4RAYA.CPP create mode 100644 EGAVGA.BGI create mode 100644 OSC.CPP create mode 100644 OSC.EXE create mode 100644 README.md create mode 100644 SVGA256.BGI create mode 100644 TCOMPROB.CPP create mode 100644 TCOMPROB.EXE diff --git a/4R.CPP b/4R.CPP new file mode 100644 index 0000000..b22c806 --- /dev/null +++ b/4R.CPP @@ -0,0 +1,323 @@ + /**************************************************************************\ +|* *| +|* 4 en Raya *| +|* *| +|* Algoritmo de combate dise¤ado por JD, capaz de profundizar en *| +|* jugadas defensivas/ofensivas. *| +|* *| +|* *| +|* *| + \**************************************************************************/ + + #include + + char Tablero[7][7]; // [FILA][COLUMNA] + + #define TAMANYO_DEL_TABLERO 7*7 + #define ANCHO_TABLERO 7 + #define ALTO_TABLERO 3 + + #define NO_HAY_NADIE 0 + #define JUGADOR1 1 + #define JUGADOR2 2 + + #define PROFUNDIDAD_DE_JUEGO 5 + + class Conecta4 + { + private: + char StatusError; + char QuienSoy; + char *TableroOriginal; + char *CopiaDelTablero; + + char AveriguaQuienSoy(void); + char GanaTurno( int *Pos_x, int *Pos_y, char JUGADOR_DUMMY ); + void AlgInteligente( int *Pos_x, int *Pos_y, char JUGADOR_DUMMY ); + + + public: + + Conecta4(char *DirTablero); + ~Conecta4(); + + void JuegaTurno(void); + char *Error(void); + }; + + void Conecta4::JuegaTurno( void ) + { + int x, y; // Punto, donde pondr‚ mi ficha + int X, Y; // Puntos de avance en el tiempo. + char Enemigo; + char ok, Turno; + + // ¨ Quien soy YO ? + if ( QuienSoy == -1 ) + AveriguaQuienSoy(); + + if ( QuienSoy == JUGADOR1 ) + Enemigo = JUGADOR2; + else + Enemigo = JUGADOR1; + + // Realizamos una copia del Tablero para las profudizaciones + memcpy( CopiaDelTablero, Tablero, sizeof( char ) * (TAMANYO_DEL_TABLERO) ); + + // ¨ Podemos ganar en este turno ? + if ( GanaTurno( &x, &y, QuienSoy ) ) + { + *( TableroOriginal + ANCHO_TABLERO*y + x ) = QuienSoy; + return; + } + + // ¨ Tengo que defender en este turno ? + if ( GanaTurno( &x, &y, Enemigo ) ) + { + *( TableroOriginal + ANCHO_TABLERO*y + x ) = QuienSoy; + return; + } + + ok = 0; Turno = 0; + // Tengo libertad en este turno para colocar la ficha donde quiera... + do { + + AlgInteligente( &x, &y, QuienSoy ); + + // Me adelanto en el tiempo para ver que pasa si pongo la ficha hay... + // --------- OK == 0 JUGADA MALA :::: OK == 1 JUGADA BUENA ----------- + + // -- ¨ Tengo mas lugares donde poner ? (si esta jugada no es buena) + if ( Turno > (ANCHO_TABLERO*ALTO_TABLERO) ) + { + // ­­ Que le vamos hacer !!, puede ganar el contrario + ok = 1; + } else { + // Si pongo aqui: ¨ Gana el siguiente turno el enemigo ? 1==NO :: 0==SI + if ( (ok = !GanaTurno( &X, &Y, Enemigo ) ) ) + { + // Vale, el enemigo no ganar  en el siguiente turno, pero... + // ...que tal si nos adelantamos un poquito en el tiempo. + AlgInteligente( &X, &Y, Enemigo ); + *( CopiaDelTablero + ANCHO_TABLERO*Y + X ) = Enemigo; + // Ahora juego yo... + if ( GanaTurno( &X, &Y, QuienSoy ) ) + { + // Vale tengo asegurado el ganar dos turnos mas hacia adelante. + ok = 1; + } else { + // Dentro de dos turnos no gano, pero... + AlgInteligente( &X, &Y, QuienSoy ); + *( CopiaDelTablero + ANCHO_TABLERO*Y + X ) = QuienSoy; + // ...¨y el enemigo? + if ( GanaTurno( &X, &Y, Enemigo ) ) + { + // Parece que el enemigo gana, y no me la va a dar, asi de facil. + ok = 0; + } else { + // Juega mejor colega, por que a mi no me ganas. + ok = 1; + } + } + } + } + Turno++; + } while ( !ok ); + + // Este el el punto de inserci¢n optimo. + *( TableroOriginal + ANCHO_TABLERO*y + x ) = QuienSoy; + + } + + + // Comprobamos si el JUGADOR_DUMMY puede ganar este turno (Dev: Pos ganadora) + char Conecta4::GanaTurno( int *Pos_x, int *Pos_y, char JUGADOR_DUMMY ) + { + int i, j, k; + int Lug_X, FichasHints; + char QueHay; + + int Pos_Y[ANCHO_TABLERO]; + + // Posibles lugares donde meter la ficha + for ( i = 0; i < ANCHO_TABLERO; i++ ) + { + // Por defecto, no es posible usar esta columna... + Pos_Y[i] = -1; + for ( j = 0; j < ALTO_TABLERO; j++ ) + { + if ( *( CopiaDelTablero + j * ANCHO_TABLERO + i ) == NO_HAY_NADIE ) + { + Pos_Y[i] = j; + break; + } + } + } + // Si metemos la ficha en algun lugar, ¨ GANAMOS ? + FichasHints = 0; + + for ( i = 0; i < ANCHO_TABLERO; i++ ) // Revisamos todos los huecos + if ( Pos_Y[i] != -1 ) + { + //°²Û X + //°²Û ¨ Posibilidad de ganar en HORIZONTAL ? X X + //°²Û X * * - * + //°²Û Insertando la ficha gano ----------^ + for ( j = i-1; j>=0; j--) + { + QueHay = *( CopiaDelTablero + Pos_Y[i] * ANCHO_TABLERO + j ); + if ( QueHay == JUGADOR_DUMMY ) + FichasHints++; + else break; + } + for ( j = i+1; j= 3 ) + { + *Pos_x = i; + *Pos_y = Pos_y[i]; + return 1; + } + + //°²Û Insertando la ficha gano ---> - + //°²Û * + //°²Û ¨ Posibilidad de ganar en VERTICAL ? * X + //°²Û * * X X X + + // Solo es posible si mi altura actual es >= 3 + if ( Pos_Y[i] >= 3 ) + { + for ( j = Pos_Y[i]-1; j >= 0; j-- ) + { + QueHay = *( TableroOriginal + Pos_Y[i] * ANCHO_TABLERO + i ); + if ( QueHay == JUGADOR_DUMMY ) + FichasHints++; + else break; + } + if ( FichasHints >= 3 ) + { + *Pos_x = i; + *Pos_y = Pos_y[i]; + return 1; + } + } + + //°²Û Insertando la ficha gano ÄÄÄÄÄÄÄÄÄ¿ * + //°²Û * - * X + //°²Û ¨ Posibilidad de ganar en DIAGONAL 1 ? X * X X X + //°²Û * * X X X + k = i - 1; + for ( j = Pos_Y[i]-1; j >= 0 && k >= 0; j--, k-- ) + { + QueHay = *( CopiaDelTablero + j * ANCHO_TABLERO + k ); + if ( QueHay == JUGADOR_DUMMY ) + FichasHints++; + else break; + } + k = i + 1; + for ( j = Pos_Y[i]+1; j= 3 ) + { + *Pos_x = i; + *Pos_y = Pos_y[i]; + return 1; + } + + //°²Û Insertando la ficha gano ÄÄÄÄÄÄÄ*Ä¿ X + //°²Û X X - X X + //°²Û ¨ Posibilidad de ganar en DIAGONAL 2 ? X * X * X + //°²Û X * * X * + k = i + 1; + for ( j = Pos_Y[i]-1; j >= 0 && k < ANCHO_TABLERO; j--, k++ ) + { + QueHay = *( CopiaDelTablero + j * ANCHO_TABLERO + k ); + if ( QueHay == JUGADOR_DUMMY ) + FichasHints++; + else break; + } + k = i - 1; + for ( j = Pos_Y[i]+1; j= 0; j++, k-- ) + { + QueHay = *( CopiaDelTablero + j * ANCHO_TABLERO + k ); + if ( QueHay == JUGADOR_DUMMY ) + FichasHints++; + else break; + } + // Bingo, Aqui ganamos + if ( FichasHints >= 3 ) + { + *Pos_x = i; + *Pos_y = Pos_y[i]; + return 1; + } + } + + // Este turno no puede ser ganado, DIRECTAMENTE!!! + return 0; + } + + // El algoritmo inteligente es el nucleo de pensamiento de mi OBJETO + // decidir  cual es la posici¢n mas acertada, (EN EL TURNO ACTUAL), para + // ganar la partida... + // + // Partimos del supuesto que no nos es posible ganar directamente en este + // turno y al enemigo tan poco le es posible en el siguiente. Por lo cual, + // tenemos un total de ANCHO_TABLERO casillas donde poner nuestra ficha. + // + // Actualmente, solo compruebo la frecuencia de aparici¢n de fichas, en + // la media luna de posiciones que me rodean. FREC_MAX -> max. pos. de ganar. + // + // Realmente en este algoritmo, se podr¡an tener algunas jugadas estrat‚gicas + // ya prefijadas. Despues de jugar unas cuantas partidas con un HUMANO, nos + // daremos cuenta que solo existen unas Xx jugadas estrategicas que se basan, + // como mucho, en dos turnos adelante en el tiempo, de aqui mi control de + // estos dos turnos en el tiempo... + // Fdo: + // Jose-David.Guillen@cs.us.es + void Conecta4::AlgInteligente( int *Pos_x, int *Pos_y, char JUGADOR_DUMMY ) + { + } + + + Conecta4::Conecta4(char *DirTablero) + { + StatusError = 0; + QuienSoy = -1; + + TableroOriginal = DirTablero; + if ( ( CopiaDelTablero = new char [TAMANYO_DEL_TABLERO] ) == NULL ) + StatusError = 1; + } + + Conecta4::~Conecta4() + { + delete [] CopiaDelTablero; + } + + char *Conecta4::Error(void) + { + char *MensajesError[40] = { "No hay suficiente Memoria", + "No quedan huecos libres", + "Error Desconocido" }; + + if ( StatusError ) + return MensajesError[StatusError]; + else + return NULL; + } + + + diff --git a/4RAYA.CPP b/4RAYA.CPP new file mode 100644 index 0000000..b22c806 --- /dev/null +++ b/4RAYA.CPP @@ -0,0 +1,323 @@ + /**************************************************************************\ +|* *| +|* 4 en Raya *| +|* *| +|* Algoritmo de combate dise¤ado por JD, capaz de profundizar en *| +|* jugadas defensivas/ofensivas. *| +|* *| +|* *| +|* *| + \**************************************************************************/ + + #include + + char Tablero[7][7]; // [FILA][COLUMNA] + + #define TAMANYO_DEL_TABLERO 7*7 + #define ANCHO_TABLERO 7 + #define ALTO_TABLERO 3 + + #define NO_HAY_NADIE 0 + #define JUGADOR1 1 + #define JUGADOR2 2 + + #define PROFUNDIDAD_DE_JUEGO 5 + + class Conecta4 + { + private: + char StatusError; + char QuienSoy; + char *TableroOriginal; + char *CopiaDelTablero; + + char AveriguaQuienSoy(void); + char GanaTurno( int *Pos_x, int *Pos_y, char JUGADOR_DUMMY ); + void AlgInteligente( int *Pos_x, int *Pos_y, char JUGADOR_DUMMY ); + + + public: + + Conecta4(char *DirTablero); + ~Conecta4(); + + void JuegaTurno(void); + char *Error(void); + }; + + void Conecta4::JuegaTurno( void ) + { + int x, y; // Punto, donde pondr‚ mi ficha + int X, Y; // Puntos de avance en el tiempo. + char Enemigo; + char ok, Turno; + + // ¨ Quien soy YO ? + if ( QuienSoy == -1 ) + AveriguaQuienSoy(); + + if ( QuienSoy == JUGADOR1 ) + Enemigo = JUGADOR2; + else + Enemigo = JUGADOR1; + + // Realizamos una copia del Tablero para las profudizaciones + memcpy( CopiaDelTablero, Tablero, sizeof( char ) * (TAMANYO_DEL_TABLERO) ); + + // ¨ Podemos ganar en este turno ? + if ( GanaTurno( &x, &y, QuienSoy ) ) + { + *( TableroOriginal + ANCHO_TABLERO*y + x ) = QuienSoy; + return; + } + + // ¨ Tengo que defender en este turno ? + if ( GanaTurno( &x, &y, Enemigo ) ) + { + *( TableroOriginal + ANCHO_TABLERO*y + x ) = QuienSoy; + return; + } + + ok = 0; Turno = 0; + // Tengo libertad en este turno para colocar la ficha donde quiera... + do { + + AlgInteligente( &x, &y, QuienSoy ); + + // Me adelanto en el tiempo para ver que pasa si pongo la ficha hay... + // --------- OK == 0 JUGADA MALA :::: OK == 1 JUGADA BUENA ----------- + + // -- ¨ Tengo mas lugares donde poner ? (si esta jugada no es buena) + if ( Turno > (ANCHO_TABLERO*ALTO_TABLERO) ) + { + // ­­ Que le vamos hacer !!, puede ganar el contrario + ok = 1; + } else { + // Si pongo aqui: ¨ Gana el siguiente turno el enemigo ? 1==NO :: 0==SI + if ( (ok = !GanaTurno( &X, &Y, Enemigo ) ) ) + { + // Vale, el enemigo no ganar  en el siguiente turno, pero... + // ...que tal si nos adelantamos un poquito en el tiempo. + AlgInteligente( &X, &Y, Enemigo ); + *( CopiaDelTablero + ANCHO_TABLERO*Y + X ) = Enemigo; + // Ahora juego yo... + if ( GanaTurno( &X, &Y, QuienSoy ) ) + { + // Vale tengo asegurado el ganar dos turnos mas hacia adelante. + ok = 1; + } else { + // Dentro de dos turnos no gano, pero... + AlgInteligente( &X, &Y, QuienSoy ); + *( CopiaDelTablero + ANCHO_TABLERO*Y + X ) = QuienSoy; + // ...¨y el enemigo? + if ( GanaTurno( &X, &Y, Enemigo ) ) + { + // Parece que el enemigo gana, y no me la va a dar, asi de facil. + ok = 0; + } else { + // Juega mejor colega, por que a mi no me ganas. + ok = 1; + } + } + } + } + Turno++; + } while ( !ok ); + + // Este el el punto de inserci¢n optimo. + *( TableroOriginal + ANCHO_TABLERO*y + x ) = QuienSoy; + + } + + + // Comprobamos si el JUGADOR_DUMMY puede ganar este turno (Dev: Pos ganadora) + char Conecta4::GanaTurno( int *Pos_x, int *Pos_y, char JUGADOR_DUMMY ) + { + int i, j, k; + int Lug_X, FichasHints; + char QueHay; + + int Pos_Y[ANCHO_TABLERO]; + + // Posibles lugares donde meter la ficha + for ( i = 0; i < ANCHO_TABLERO; i++ ) + { + // Por defecto, no es posible usar esta columna... + Pos_Y[i] = -1; + for ( j = 0; j < ALTO_TABLERO; j++ ) + { + if ( *( CopiaDelTablero + j * ANCHO_TABLERO + i ) == NO_HAY_NADIE ) + { + Pos_Y[i] = j; + break; + } + } + } + // Si metemos la ficha en algun lugar, ¨ GANAMOS ? + FichasHints = 0; + + for ( i = 0; i < ANCHO_TABLERO; i++ ) // Revisamos todos los huecos + if ( Pos_Y[i] != -1 ) + { + //°²Û X + //°²Û ¨ Posibilidad de ganar en HORIZONTAL ? X X + //°²Û X * * - * + //°²Û Insertando la ficha gano ----------^ + for ( j = i-1; j>=0; j--) + { + QueHay = *( CopiaDelTablero + Pos_Y[i] * ANCHO_TABLERO + j ); + if ( QueHay == JUGADOR_DUMMY ) + FichasHints++; + else break; + } + for ( j = i+1; j= 3 ) + { + *Pos_x = i; + *Pos_y = Pos_y[i]; + return 1; + } + + //°²Û Insertando la ficha gano ---> - + //°²Û * + //°²Û ¨ Posibilidad de ganar en VERTICAL ? * X + //°²Û * * X X X + + // Solo es posible si mi altura actual es >= 3 + if ( Pos_Y[i] >= 3 ) + { + for ( j = Pos_Y[i]-1; j >= 0; j-- ) + { + QueHay = *( TableroOriginal + Pos_Y[i] * ANCHO_TABLERO + i ); + if ( QueHay == JUGADOR_DUMMY ) + FichasHints++; + else break; + } + if ( FichasHints >= 3 ) + { + *Pos_x = i; + *Pos_y = Pos_y[i]; + return 1; + } + } + + //°²Û Insertando la ficha gano ÄÄÄÄÄÄÄÄÄ¿ * + //°²Û * - * X + //°²Û ¨ Posibilidad de ganar en DIAGONAL 1 ? X * X X X + //°²Û * * X X X + k = i - 1; + for ( j = Pos_Y[i]-1; j >= 0 && k >= 0; j--, k-- ) + { + QueHay = *( CopiaDelTablero + j * ANCHO_TABLERO + k ); + if ( QueHay == JUGADOR_DUMMY ) + FichasHints++; + else break; + } + k = i + 1; + for ( j = Pos_Y[i]+1; j= 3 ) + { + *Pos_x = i; + *Pos_y = Pos_y[i]; + return 1; + } + + //°²Û Insertando la ficha gano ÄÄÄÄÄÄÄ*Ä¿ X + //°²Û X X - X X + //°²Û ¨ Posibilidad de ganar en DIAGONAL 2 ? X * X * X + //°²Û X * * X * + k = i + 1; + for ( j = Pos_Y[i]-1; j >= 0 && k < ANCHO_TABLERO; j--, k++ ) + { + QueHay = *( CopiaDelTablero + j * ANCHO_TABLERO + k ); + if ( QueHay == JUGADOR_DUMMY ) + FichasHints++; + else break; + } + k = i - 1; + for ( j = Pos_Y[i]+1; j= 0; j++, k-- ) + { + QueHay = *( CopiaDelTablero + j * ANCHO_TABLERO + k ); + if ( QueHay == JUGADOR_DUMMY ) + FichasHints++; + else break; + } + // Bingo, Aqui ganamos + if ( FichasHints >= 3 ) + { + *Pos_x = i; + *Pos_y = Pos_y[i]; + return 1; + } + } + + // Este turno no puede ser ganado, DIRECTAMENTE!!! + return 0; + } + + // El algoritmo inteligente es el nucleo de pensamiento de mi OBJETO + // decidir  cual es la posici¢n mas acertada, (EN EL TURNO ACTUAL), para + // ganar la partida... + // + // Partimos del supuesto que no nos es posible ganar directamente en este + // turno y al enemigo tan poco le es posible en el siguiente. Por lo cual, + // tenemos un total de ANCHO_TABLERO casillas donde poner nuestra ficha. + // + // Actualmente, solo compruebo la frecuencia de aparici¢n de fichas, en + // la media luna de posiciones que me rodean. FREC_MAX -> max. pos. de ganar. + // + // Realmente en este algoritmo, se podr¡an tener algunas jugadas estrat‚gicas + // ya prefijadas. Despues de jugar unas cuantas partidas con un HUMANO, nos + // daremos cuenta que solo existen unas Xx jugadas estrategicas que se basan, + // como mucho, en dos turnos adelante en el tiempo, de aqui mi control de + // estos dos turnos en el tiempo... + // Fdo: + // Jose-David.Guillen@cs.us.es + void Conecta4::AlgInteligente( int *Pos_x, int *Pos_y, char JUGADOR_DUMMY ) + { + } + + + Conecta4::Conecta4(char *DirTablero) + { + StatusError = 0; + QuienSoy = -1; + + TableroOriginal = DirTablero; + if ( ( CopiaDelTablero = new char [TAMANYO_DEL_TABLERO] ) == NULL ) + StatusError = 1; + } + + Conecta4::~Conecta4() + { + delete [] CopiaDelTablero; + } + + char *Conecta4::Error(void) + { + char *MensajesError[40] = { "No hay suficiente Memoria", + "No quedan huecos libres", + "Error Desconocido" }; + + if ( StatusError ) + return MensajesError[StatusError]; + else + return NULL; + } + + + diff --git a/EGAVGA.BGI b/EGAVGA.BGI new file mode 100644 index 0000000000000000000000000000000000000000..800163160dcf3473e5e18a35738a1385ffc999c7 GIT binary patch literal 5554 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 literal 0 HcmV?d00001 diff --git a/OSC.CPP b/OSC.CPP new file mode 100644 index 0000000..a3ff920 --- /dev/null +++ b/OSC.CPP @@ -0,0 +1,690 @@ + /**************************************************************************\ +|* *| +|* 4 en Raya *| +|* *| +|* Algoritmo de combate dise¤ado por JD, capaz de profundizar en *| +|* jugadas defensivas/ofensivas. *| +|* *| +|* *| +|* *| + \**************************************************************************/ +#include + + //char Tablero[7][7]; // [FILA][COLUMNA] + + #define TAMANYO_DEL_TABLERO 7*7 + #define ANCHO_TABLERO 7 + #define ALTO_TABLERO 7 + + #define NO_HAY_NADIE 0 + #define JUGADOR1 1 + #define JUGADOR2 2 + + #define PROFUNDIDAD_DE_JUEGO 5 + int Post_X, Post_Y; + + class Conecta4 + { + private: + char StatusError; + char QuienSoy; + char *TableroOriginal; + char *CopiaDelTablero; + + char AveriguaQuienSoy(void); + void PosiblesLugares( char Pos_Y[ANCHO_TABLERO] ); + char GanaTurno( int *Pos_x, int *Pos_y, char JUGADOR_DUMMY ); + void AlgInteligente( int *Pos_x, int *Pos_y, char JUGADOR_DUMMY ); + + + public: + + Conecta4(char *DirTablero); + ~Conecta4(); + + void JuegaTurno(void); + char *Error(void); + }; + +///////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////// + +///NOTA LOS VALORES DE X E Y OSCILAN ENTRE 1-7 +//BIBLIOTECAS EMPLEADAS + +#include +#include +#include +#include +#include +#include + +//DECLARACION DE FUNCIONES +void InicializaSVGA(void); +void dibujamalla(); +void dibujacoordenada(); +int comprueba(); +void algoritmojugador1(); +void algoritmojugador2(); + +//VARIABLES GLOBALES +int x=0; +int y=0; +int jugador=1; +char coordenada[7][7]; +int huge DetectVGA256(){ return 2; } + +//FUNCION PRINCIPAL +void main() +{ +///////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////// + char buffer[80]; + Conecta4 JugadorJD( &coordenada[0][0] ); + if ( JugadorJD.Error() != NULL ) + return; +///////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////// + + +int a,b,resultado; +char o='0'; + +//inicializa graficos +InicializaSVGA(); +while(o!='q') + { + clearviewport(); + resultado=0; + //inicializa coordenadas a cero + for (a=0;a<7;a++) + for (b=0;b<7;b++) + coordenada[a][b]=0; + + //dibuja malla + dibujamalla(); + + //dibuja circulo en coordenada + while(resultado!=1&&resultado!=2) + { + //JUEGAN AMBOS JUGADORES + if(jugador==1) algoritmojugador1(); +/////////////////////////////////////////////////////////////////////////////// + else { + JugadorJD.JuegaTurno(); x = Post_X; y = Post_Y; + bar( 0, 0, 100, 30 ); + sprintf( buffer, "%d, %d", x, y ); + outtextxy( 10, 10, buffer ); +// sound(150);delay(200);nosound(); +// getch(); +// x++; y++; + } + +////////////////////////////////////////////////////////////////////////////// + //algoritmojugador2(); + //COMPRUEBA LAS COORDENADAS CORRECTAS + if((x<7&&y<7&&x>-1&&y>-1) )//&&coordenada[x][y]==0&&((coordenada[x][y-1]!=0)||y==0)) + { + dibujacoordenada(); + if(jugador==1) {coordenada[x][y]=1;jugador=2;} + else {coordenada[x][y]=2;jugador=1;} + resultado=comprueba(); + } + else { + bar( 100, 0, 600, 30 ); + sprintf( buffer, "COORDENADA ERRONEA PRODUCIDA POR EL JUGADOR:%d",(int)jugador ); + outtextxy( 110, 10, buffer ); + } + } + //dice quien gano + if(jugador==2) sprintf( buffer, "GANO EL JUGADOR1"); + else sprintf( buffer, "GANO EL JUGADOR2"); + bar( 100, 0, 600, 30 ); + outtextxy( 110, 10, buffer ); + + //cierra el modo grafico + o=getch(); + }; +closegraph(); +} + +//DIBUJA CIRCULO EN COORDENADA +void dibujacoordenada() +{ +int a,c=0; +x=x+1;y=y+1; +while(c<=(8-y)) + { + //elije color segun jugador + if(jugador==1) setcolor(1); + else setcolor(5); + //dibuja circulo + for(a=0;a<20;a++) + circle(50 * x+110,50 * c+50,a); + delay(250); + //borra circulo + if(c+1<=(8-y)) + { + setcolor(0); + for(a=0;a<20;a++) + circle(50 * x+110,50 * c+50,a); + } + c=c+1; + } +x=x-1; +y=y-1; +} + +//DIBUJA LA MALLA DEL JUEGO +void dibujamalla() +{ +int a; +setcolor(15); +for(a=135;a<500;a=a+50) + line(a,75,a,425); +for(a=75;a<426;a=a+50) + line(135,a,485,a); +} + +//INICIALIZA MODO GRAFICO EN SVGA +void InicializaSVGA(void) { + + int Gd = DETECT, Gm; + int Drv, errorcode; + +installuserdriver("Svga256",DetectVGA256); + + initgraph(&Gd,&Gm,"c:\\program\\borlandc\\bgi"); + + /* read result of initialization */ + errorcode = graphresult(); + +if (errorcode != grOk) /* an error occurred */ +{ + cprintf("Graphics error: %s\n", grapherrormsg(errorcode)); + cprintf("Presione una tecla para finalizar:"); + getch(); + exit(1); /* return with error code */ +} + +} + +//COMPRUEBA SI HA GANADO ALGUIEN Y DEVUELVE UN VALOR +int comprueba() +{ +int w=0,suma=0,suma1=0,suma2=0,suma3=0,cx1,cy1; +cy1=0;cx1=0; +//LECTURA DEL ARRAY HORIZONTAL Y VERTICAL +while(cy1<8&&suma!=4&&suma1!=4&&suma2!=4&&suma3!=4) + { + suma=0;suma1=0;suma2=0;suma3=0;cx1=0; + while(cx1<8&&suma!=4&&suma1!=4&&suma2!=4&&suma3!=4) + { + if(coordenada[cx1][cy1]==0) {suma=0;suma1=0;} + if(coordenada[cx1][cy1]==1) {suma++;suma1=0;} + if(coordenada[cx1][cy1]==2) {suma1++;suma=0;} + if(coordenada[cy1][cx1]==0) {suma2=0;suma3=0;} + if(coordenada[cy1][cx1]==1) {suma2++;suma3=0;} + if(coordenada[cy1][cx1]==2) {suma3++;suma2=0;} + cx1++; + } + cy1++; + } +//LECTURA EN DIAGONAL Y DIAGONAL INVERSA +if(suma<4&&suma1<4&&suma2<4&&suma3<4) {cx1=1;cy1=1;suma=0;suma1=0;suma2=0;suma3=0;} +while(cy1<8&&suma!=4&&suma1!=4&&suma2!=4&&suma3!=4) + { + suma=0;suma1=0;suma2=0;suma3=0;cx1=1; + while(cx1<8&&suma!=4&&suma1!=4&&suma2!=4&&suma3!=4) + { + if(coordenada[cx1][cy1]==0) {suma=0;suma1=0;suma2=0;suma3=0;} + if(coordenada[cx1][cy1]==1) {suma++;suma1=0;} + if(coordenada[cx1][cy1]==2) {suma1++;suma=0;} + if(coordenada[cy1][cx1]==1) {suma2++;suma3=0;} + if(coordenada[cy1][cx1]==2) {suma3++;suma2=0;} + cx1++; + } + cy1++; + } +//DA [0] SI NO GANO NADIE,[1] SI GANO EL JUGADOR1,[2] SI GANO EL JUGADOR2 +if(suma==4||suma2==4) w=1; +if(suma1==4||suma3==4) w=2; +return w; +} + +//ALGORITMO DE JD +void algoritmojugador1() +{ +//PRIMER MOVIMIENTO CENTRAL +int c=0,suma=0,suma1=0,suma2=0,suma3=0,cx1=0,cy1=0,a=0; +//LECTURA DEL ARRAY HORIZONTAL Y VERTICAL +while(cy1<7&&suma!=4&&suma1!=4&&suma2!=4&&suma3!=4) + { + suma=0;suma1=0;suma2=0;suma3=0;cx1=0; + while(cx1<7&&suma!=4&&suma1!=4&&suma2!=4&&suma3!=4) + { + if(coordenada[cx1][cy1]==0) {suma=0;suma1=0;} + if(coordenada[cx1][cy1]==1) {suma++;suma1=0;} + if(coordenada[cx1][cy1]==2) {suma1++;suma=0;} + if(coordenada[cy1][cx1]==0) {suma2=0;suma3=0;} + if(coordenada[cy1][cx1]==1) {suma2++;suma3=0;} + if(coordenada[cy1][cx1]==2) {suma3++;suma2=0;} + + //MOVIMIENTO DE DEFENSA + if(suma1==3&&cx1<6) + if(coordenada[cx1+1][cy1]==0) + {x=cx1+1;y=cy1;a=1;} + if(suma3==3&&cx1<6) + if(coordenada[cy1][cx1+1]==0) + {x=cy1;y=cx1+1;a=1;} + + //MOVIMIENTO DE ATAQUE + if(suma==3&&cx1<6) + if(coordenada[cx1+1][cy1]==0) + {x=cx1+1;y=cy1;a=1;} + if(suma2==3&&cx1<6) + if(coordenada[cy1][cx1+1]==0) + {x=cy1;y=cx1+1;a=1;} + + cx1++; + } + cy1++; + } +if(((suma<3&&suma1<3&&suma2<3&&suma3<3)||(coordenada[x][y-1]==0))&&a==0) + { + randomize(); + x=(rand() %3) +2; + while(coordenada[x][c]!=0) + { + c=c+1; + } + y=c; + } +} + +//ALGORITMO DE OSCAR +void algoritmojugador2() +{ +int c=0; +randomize(); +x=rand() %7; +while(coordenada[x][c]!=0) + { + c=c+1; + } +y=c; +} + + + + + /**************************************************************************\ +|* *| +|* 4 en Raya *| +|* *| +|* Algoritmo de combate dise¤ado por JD, capaz de profundizar en *| +|* jugadas defensivas/ofensivas. *| +|* *| +|* *| +|* *| + \**************************************************************************/ + +// #include + + char Conecta4::AveriguaQuienSoy(void) + { + + return ( QuienSoy = JUGADOR2 ); + } + + + void Conecta4::JuegaTurno( void ) + { + int x, y; // Punto, donde pondr‚ mi ficha + int X, Y; // Puntos de avance en el tiempo. + char *tmp; + char Enemigo; + char ok, Turno; + + // ¨ Quien soy YO ? + if ( QuienSoy == -1 ) + AveriguaQuienSoy(); + + if ( QuienSoy == JUGADOR1 ) + Enemigo = JUGADOR2; + else + Enemigo = JUGADOR1; + + // Realizamos una copia del Tablero para las profudizaciones + memcpy( CopiaDelTablero, TableroOriginal, sizeof( char ) * (TAMANYO_DEL_TABLERO) ); + + // ¨ Podemos ganar en este turno ? + if ( GanaTurno( &x, &y, QuienSoy ) ) + { + *( TableroOriginal + ANCHO_TABLERO*x + y ) = QuienSoy; +//////////////////////////////////////////////////////////////////////////////////// +Post_X = x; Post_Y = y; +//////////////////////////////////////////////////////////////////////////////////// + return; + } + + // ¨ Tengo que defender en este turno ? + if ( GanaTurno( &x, &y, Enemigo ) ) + { + *( TableroOriginal + ANCHO_TABLERO*x + y ) = QuienSoy; +//////////////////////////////////////////////////////////////////////////////////// +Post_X = x; Post_Y = y; +//////////////////////////////////////////////////////////////////////////////////// + return; + } + + ok = 0; Turno = 0; + // Tengo libertad en este turno para colocar la ficha donde quiera... + do { + + AlgInteligente( &x, &y, QuienSoy ); + *( CopiaDelTablero + ANCHO_TABLERO*x + y ) = QuienSoy; + + // Me adelanto en el tiempo para ver que pasa si pongo la ficha hay... + // --------- OK == 0 JUGADA MALA :::: OK == 1 JUGADA BUENA ----------- + + // -- ¨ Tengo mas lugares donde poner ? (si esta jugada no es buena) + if ( Turno > ANCHO_TABLERO ) + { + // ­­ Que le vamos hacer !!, puede ganar el contrario + ok = 1; + } else { + // Si pongo aqui: ¨ Gana el siguiente turno el enemigo ? 1==NO :: 0==SI + if ( (ok = !GanaTurno( &X, &Y, Enemigo ) ) ) + { + // Vale, el enemigo no ganar  en el siguiente turno, pero... + // ...que tal si nos adelantamos un poquito en el tiempo. + AlgInteligente( &X, &Y, Enemigo ); + *( CopiaDelTablero + ANCHO_TABLERO*X + Y ) = Enemigo; + // Ahora juego yo... + if ( GanaTurno( &X, &Y, QuienSoy ) ) + { + // Vale tengo asegurado el ganar dos turnos mas hacia adelante. + ok = 1; + } else { + // Dentro de dos turnos no gano, pero... + tmp = ( CopiaDelTablero + ANCHO_TABLERO*X + Y ); + AlgInteligente( &X, &Y, QuienSoy ); + *( CopiaDelTablero + ANCHO_TABLERO*X + Y ) = QuienSoy; + // ...¨y el enemigo? + if ( GanaTurno( &X, &Y, Enemigo ) ) + { + // Parece que el enemigo gana, y no me la va a dar, asi de facil. + // Si se puede poner ahora, tapo la jugada + if ( *( TableroOriginal + ANCHO_TABLERO*X + ( (Y-1)<0 ? 0 : (Y-1) ) ) == NO_HAY_NADIE ) + { + ok = 1; + x = X; y = Y; + } else { + // De lo contrario, realizo otra jugada. (Alg int. debe intervenir) + ok = 0; + } + *( CopiaDelTablero + ANCHO_TABLERO*X + Y ) = NO_HAY_NADIE; + *tmp = NO_HAY_NADIE; + } else { + // Juega mejor colega, por que a mi no me ganas. + ok = 1; + } + } + } else { + // El enemigo ganar¡a directamente, deshacemos el movimiento. + *( CopiaDelTablero + ANCHO_TABLERO*x + y ) = NO_HAY_NADIE; + } + + } + Turno++; + + } while ( !ok ); + + // Este el el punto de inserci¢n optimo. + *( TableroOriginal + ANCHO_TABLERO*x + y ) = QuienSoy; +//////////////////////////////////////////////////////////////////////////////////// + Post_X = x; Post_Y = y; +//////////////////////////////////////////////////////////////////////////////////// + } + + + // Comprobamos si el JUGADOR_DUMMY puede ganar este turno (Dev: Pos ganadora) + char Conecta4::GanaTurno( int *Pos_x, int *Pos_y, char JUGADOR_DUMMY ) + { + int i, j, k; + int Lug_X, FichasHints; + char QueHay; + + char Pos_Y[ANCHO_TABLERO]; + + PosiblesLugares( Pos_Y ); + + // Si metemos la ficha en algun lugar, ¨ GANAMOS ? + FichasHints = 0; + + for ( i = 0; i < ANCHO_TABLERO; i++ ) // Revisamos todos los huecos + if ( Pos_Y[i] != -1 ) + { + //°²Û X + //°²Û ¨ Posibilidad de ganar en HORIZONTAL ? X X + //°²Û X * * - * + //°²Û Insertando la ficha gano ----------^ + FichasHints = 0; + for ( j = i-1; j>=0; j--) + { + QueHay = *( CopiaDelTablero + j * ANCHO_TABLERO + Pos_Y[i] ); + if ( QueHay == JUGADOR_DUMMY ) + FichasHints++; + else break; + } + for ( j = i+1; j= 3 ) + { + *Pos_x = i; + *Pos_y = Pos_Y[i]; + return 1; + } + + //°²Û Insertando la ficha gano ---> - + //°²Û * + //°²Û ¨ Posibilidad de ganar en VERTICAL ? * X + //°²Û * * X X X + + // Solo es posible si mi altura actual es >= 3 + if ( Pos_Y[i] >= 3 ) + { + FichasHints = 0; + for ( j = Pos_Y[i]-1; j >= 0; j-- ) + { + QueHay = *( CopiaDelTablero + i * ANCHO_TABLERO + j ); + if ( QueHay == JUGADOR_DUMMY ) + FichasHints++; + else break; + } + if ( FichasHints >= 3 ) + { + *Pos_x = i; + *Pos_y = Pos_Y[i]; + return 1; + } + } + + //°²Û Insertando la ficha gano ÄÄÄÄÄÄÄÄÄ¿ * + //°²Û * - * X + //°²Û ¨ Posibilidad de ganar en DIAGONAL 1 ? X * X X X + //°²Û * * X X X + FichasHints = 0; + k = i - 1; + for ( j = Pos_Y[i]-1; j >= 0 && k >= 0; j--, k-- ) + { + QueHay = *( CopiaDelTablero + k * ANCHO_TABLERO + j ); + if ( QueHay == JUGADOR_DUMMY ) + FichasHints++; + else break; + } + k = i + 1; + for ( j = Pos_Y[i]+1; j= 3 ) + { + *Pos_x = i; + *Pos_y = Pos_Y[i]; + return 1; + } + + //°²Û Insertando la ficha gano ÄÄÄÄÄÄÄ*Ä¿ X + //°²Û X X - X X + //°²Û ¨ Posibilidad de ganar en DIAGONAL 2 ? X * X * X + //°²Û X * * X * + FichasHints = 0; + k = i + 1; + for ( j = Pos_Y[i]-1; j >= 0 && k < ANCHO_TABLERO; j--, k++ ) + { + QueHay = *( CopiaDelTablero + k * ANCHO_TABLERO + j ); + if ( QueHay == JUGADOR_DUMMY ) + FichasHints++; + else break; + } + k = i - 1; + for ( j = Pos_Y[i]+1; j= 0; j++, k-- ) + { + QueHay = *( CopiaDelTablero + k * ANCHO_TABLERO + j ); + if ( QueHay == JUGADOR_DUMMY ) + FichasHints++; + else break; + } + // Bingo, Aqui ganamos + if ( FichasHints >= 3 ) + { + *Pos_x = i; + *Pos_y = Pos_Y[i]; + return 1; + } + } + + // Este turno no puede ser ganado, DIRECTAMENTE!!! + return 0; + } + + // El algoritmo inteligente es el nucleo de pensamiento de mi OBJETO + // decidir  cual es la posici¢n mas acertada, (EN EL TURNO ACTUAL), para + // ganar la partida... + // + // Partimos del supuesto que no nos es posible ganar directamente en este + // turno y al enemigo tan poco le es posible en el siguiente. Por lo cual, + // tenemos un total de ANCHO_TABLERO casillas donde poner nuestra ficha. + // + // Actualmente, solo compruebo la frecuencia de aparici¢n de fichas, en + // la media luna de posiciones que me rodean. FREC_MAX -> max. pos. de ganar. + // + // Realmente en este algoritmo, se podr¡an tener algunas jugadas estrat‚gicas + // ya prefijadas. Despues de jugar unas cuantas partidas con un HUMANO, nos + // daremos cuenta que solo existen unas Xx jugadas estrategicas que se basan, + // como mucho, en dos turnos adelante en el tiempo, de aqui mi control de + // estos dos turnos en el tiempo... + // Fdo: + // Jose-David.Guillen@cs.us.es + void Conecta4::AlgInteligente( int *Pos_x, int *Pos_y, char JUGADOR_DUMMY ) + { + char Pos_Y[ANCHO_TABLERO]; + char Frec_Y[ANCHO_TABLERO], Frec_abs; + char i, j; + + PosiblesLugares( Pos_Y ); + + + // ? ? + // Por cada casilla, vemos la frecuencia de apariciones ? * ? + // en la media luna que hay por debajo y arriba! ? ? ? + for ( i = 0; i < ANCHO_TABLERO; i++ ) + { + Frec_Y[i] = 0; + if ( Pos_Y[i] != -1 ) + { + + for ( j = ( ( Pos_Y[i] - 1 ) < 0 ? 0 : ( Pos_Y[i] - 1 ) ); j <= ( (Pos_Y[i] + 1) >= ALTO_TABLERO ? (ALTO_TABLERO-1) : (Pos_Y[i] + 1) ); j++ ) + { + if ( (i-1) >= 0 && + *( CopiaDelTablero + (i-1) * ANCHO_TABLERO + j ) == JUGADOR_DUMMY ) + Frec_Y[i] ++; + if ( (i+1) <= (ANCHO_TABLERO-1) && + *( CopiaDelTablero + ( (i+1)>=ANCHO_TABLERO ? (ANCHO_TABLERO-1) : (i+1) ) * ANCHO_TABLERO + j ) == JUGADOR_DUMMY ) + Frec_Y[i] ++; + } + if ( *( CopiaDelTablero + ( i * ANCHO_TABLERO + ( (Pos_Y[i]-1) < 0 ? 1 : (Pos_Y[i]-1) ) ) ) == JUGADOR_DUMMY ) + Frec_Y[i] ++; + } + } + // Coloco mi ficha en la posici¢n con mayor frecuencia: + Frec_abs = -1; + for ( i = 0; i < ANCHO_TABLERO; i++ ) + if ( Frec_Y[i] > Frec_abs || (Frec_Y[i] == Frec_abs && Pos_Y[i] < *Pos_y) ) + { + Frec_abs = Frec_Y[i]; + *Pos_x = i; + *Pos_y = Pos_Y[i]; + } + + } + + void Conecta4::PosiblesLugares( char Pos_Y[ANCHO_TABLERO] ) + { +// char Pos_Y[ANCHO_TABLERO]; + int i, j; + + // Posibles lugares donde meter la ficha + for ( i = 0; i < ANCHO_TABLERO; i++ ) + { + // Por defecto, no es posible usar esta columna... + Pos_Y[i] = -1; + for ( j = 0; j < ALTO_TABLERO; j++ ) + { + if ( *( CopiaDelTablero + i * ANCHO_TABLERO + j ) == NO_HAY_NADIE ) + { + Pos_Y[i] = j; + break; + } + } + } + } + + Conecta4::Conecta4(char *DirTablero) + { + StatusError = 0; + QuienSoy = -1; + + TableroOriginal = DirTablero; + if ( ( CopiaDelTablero = new char [TAMANYO_DEL_TABLERO] ) == NULL ) + StatusError = 1; + } + + Conecta4::~Conecta4() + { + delete [] CopiaDelTablero; + } + + char *Conecta4::Error(void) + { + char *MensajesError[40] = { "No hay suficiente Memoria", + "No quedan huecos libres", + "Error Desconocido" }; + + if ( StatusError ) + return MensajesError[StatusError]; + else + return NULL; + } diff --git a/OSC.EXE b/OSC.EXE new file mode 100644 index 0000000000000000000000000000000000000000..654bd6d1b43415fc046b06004b2acc7f02dc8d61 GIT binary patch literal 46343 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 literal 0 HcmV?d00001 diff --git a/README.md b/README.md new file mode 100644 index 0000000..b962cd5 --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ +#4RAYA + + +*24/10/1997* + +ToDo: wwtcf? + + +![screenshot](/4RAYA.png "Screenshot") diff --git a/SVGA256.BGI b/SVGA256.BGI new file mode 100644 index 0000000000000000000000000000000000000000..f74bc72fbf06d17c0d57ec6ff9a2e87303bcabac GIT binary patch literal 5381 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 literal 0 HcmV?d00001 diff --git a/TCOMPROB.CPP b/TCOMPROB.CPP new file mode 100644 index 0000000..ba80e73 --- /dev/null +++ b/TCOMPROB.CPP @@ -0,0 +1,20 @@ +#include + +char t[7][7]; + +void main (void) +{ + int x, y; + char *d; + + d = &t[0][0]; + + for ( x=0; x<7; x++) + for ( y=0; y<7; y++) + { + t[x][y] = 7*y + x; + if ( t[x][y] != *( d + 7*x + y ) ) + printf ( "DISTINTOS\n" ); + } + +} \ No newline at end of file diff --git a/TCOMPROB.EXE b/TCOMPROB.EXE new file mode 100644 index 0000000000000000000000000000000000000000..f8a04dae79f0b9593fc469720d48d738a855fc03 GIT binary patch literal 10771 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 kU~7s>AM=!zF3T