diff --git a/GAME.cpp b/GAME.cpp index f38e253..22632d8 100644 --- a/GAME.cpp +++ b/GAME.cpp @@ -1,536 +1,570 @@ -//LIBRERIA PARA SALIDA Y ENTRADA DE DATOS -#include -//LIBRERIAS PARA LA GENERACION DE NUMEROS ALEATORIOS -#include +// +// GAME.cpp +// Batalla Por La Princesa +// +// Created by Cristian David Gómez Muñoz on 6/14/19. +// Copyright © 2019 Cristian Gómez, David Cortes y Ricardo Marino. All rights reserved. +// + +#include // Librería para salida y entrada de datos. +#include // Librerias para la generación de números aleatorios. #include -//LIBRERIA PARA INTERACTUAR CON EL USUARIO -#include -//LIBRERIA PARA AGRGAR CARACTERES DE IMPRESION EN CONSOLA -#include +#include // Librería para interactuar con el usauario. +#include // Libreria para agregar caracteres de impresión en consola. using namespace std; -//DADOS -//Función dado: determina el número del dado que saca cada jugador. -//Parámetros(Posición actual, turno, variable para guardar el número del dado) -int dado(int cx,int turno,int Pcx){ - -//Si es el turno 1 o 2 -if(turno<3){ -cx=rand()%64; //Asigna un numero aleatorio de 0 a 63 a la posición actual -cx=cx+1; //Le suma 1 a la posición actual para que su rango sea de 1 a 64 -return cx; //retorna la posición actual -} - -//Si el turno es mayor a 2 -if(turno>2){ -Pcx=rand()%8; //Asigna un numero aleatorio de 0 a 7 a la variable que guarda el numero del dado -Pcx=Pcx+1; //Le suma 1 a la variable anterior para que su rango sea de 1 a 8 -return Pcx; //retorna el numero del dado -} -} - - - - -//TABLERO -//Función table: Despliega el tablero en pantalla +//-----------------------------------------------------------------------------TABLERO-------------------------------------------------------------------------------------------------------------- +//Función tableroGrafico: Despliega el tablero en pantalla //Parámetros(Vector tablero) -int table(char *p_tablero){ - -int i=1,j=1,k=0; - -//i y j son variables de ayuda para los ciclos for -//k es el índice que recorre el vector - -//Imprime el tablero -for(i=1;i<9;i++){ - for(j=1;j<9;j++){ - cout<<'['<<*(p_tablero + k)<<']'; - k++; +void tableroGrafico( char *posicionTablero ) +{ + int k = 0; //k es el índice que recorre el vector + + //Imprime el tablero + for( int i = 0;i < 8;i++ ) + { + for( int j = 0;j < 8;j++ ) + { + cout << '[' << *( posicionTablero + k ) << ']'; + k++; + } + cout << endl; } - cout<8){ //Si el contador suma 8 errores ejecuta las siguientes tres líneas - win=true; //Indica que alguien gano - flag=true; //termina el turno - winner=2; //Indica que el jugador 2 gano - } - x=posicion(c1,Pc1); //Haya la posible nueva posición del jugador 1 - if(x<65){ //Si la posible nueva posición es menor a 65 continua con el código - Valida=validapos(c1,Pc1,x); //Valida la nueva posible posición a ver si se puede hacer - if (Valida==1){ //Si la posible nueva posición es válida continua con el código - if(x!=c2){ //Si la nueva posible posición es diferente al de la posición actual del jugador 2, continua con el código - if(*(p_tablero + (x-1))==' '){ //Si al evaluar la posible nueva posición en el vector tablero corresponde al carácter ' ', continua con el código - *(p_tablero + (c1-1))='X'; //Toma la posición actual del jugador 1 en el vector tablero y le asigna el carácter 'X'. Que en el tablero indicara que no se pueden mover a ese sitio - c1=x; //Asigna el valor de la posible nueva posición a la posición actual - *(p_tablero + (c1-1))='G'; //Toma la nueva posición actual del jugador 1 en el vector tablero y le asigna el carácter 'G'. Que en el tablero indica la posición de Gowin - flag=true; //termina el turno - *(p_jugadasG + (jugadaG-1))=Pc1; //Agrega al vector jugadas el número de dado que saco el jugador 1 para moverse a la nueva posición - //Se imprime lo que paso en el tablero de forma escrita - cout<<"Se movió a "<(time(NULL)));//SEMILLA PARA GENERACIÍON DE NUMEROS ALEATORIOS + + //1. DECLARACION DE VARIABLES Y VECTORES: + + int posicionDeGawain = 0, posicionDeDietrich = 0; + int lanzamientoDeGawain = 0, lanzamientoDeDietrich = 0; // número del 1 al 8 que cada jugador obtiene al tirar el dado. + int turno = 0; // indica en que turno se está actualmente. + int nuevaPosicionPosible; + int validezDeLaJugada; // indica si la jugada se puede hacer o no. + int contador; // determina la cantidad de veces seguidas que un jugador no puede realizar un movimiento. + int winner = 0; // indica quién ganó. + int jugadaDeGawain = 0, jugadaDeDietrich = 0; + bool win = false; //indica si alguien gano. + bool flag = false; //indica si el jugador terminó o no terminó su turno. + + + //Vectores: + int jugadasDeGawain[32]; // Almacena las jugadas del jugador 1 (lanzamientosDeGawain) que se hacen y son válidas en el orden que se hacen. + int *apuntadorJugadasDeGawain; + apuntadorJugadasDeGawain = new int[32]; + apuntadorJugadasDeGawain = &jugadasDeGawain[0]; + if( apuntadorJugadasDeGawain == NULL ) + { + cout << "No hay memoria disponible" << endl; + exit( 2 ); + } + + int jugadasDeDietrich[32]; // Almacena las jugadas del jugador 2 (lanzamientosDeDietrich) que se hacen y son válidas en el orden que se hacen. + int *apuntadorJugadasDeDietrich; + apuntadorJugadasDeDietrich = new int[32]; + apuntadorJugadasDeDietrich = &jugadasDeDietrich[0]; + if( apuntadorJugadasDeDietrich == NULL ) + { + cout << "No hay memoria disponible" << endl; + exit( 2 ); + } + + char posicionesDelTablero[64]; // Almacena los datos del tablero que se verán en pantalla. + char *apuntadorPosicionDelTablero; + apuntadorPosicionDelTablero = new char[64]; + apuntadorPosicionDelTablero = &posicionesDelTablero[0]; + if( apuntadorPosicionDelTablero == NULL ) + { + cout << "No hay memoria disponible" << endl; + exit( 2 ); + } + + //2. CONSTRUCCION DEL TABLERO: + //Este ciclo toma el vector tablero y a cada espacio que tiene le asigna un carácter ' '. + for( int i = 0;i < 64;i++) + { + *( apuntadorPosicionDelTablero + i ) = ' '; + } + + //3.INTRODUCCION AL JUEGO + + //Se explica el funcionamiento del juego + cout << "BIENVENIDO A BATALLA POR LA PRINCESA\n\n" + << "1.Para avanzar en el juego oprima la flecha arriba.\n" + << "2.Si un movimiento no es posible se le avisará junto con el dado que sacó.\n\n" << endl; + + //Primer turno del jugador 1 + cout << "\nA CONTINUACIÓN LANCE EL DADO QUE DARÁ LA POSICIÓN INICIAL DEL CABALLERO GAWAIN EN EL TABLERO"; + continuar(); //Función que para el juego hasta que se oprima la flecha arriba + turno = turno + 1; //Suma 1 a la variable turno + cout << "Turno: " << turno << endl; //Imprime la variable turno (TURNO 1) + posicionDeGawain = dado( posicionDeGawain, turno, lanzamientoDeGawain); //toma un numero de1 1 al 64 mediante la función dado() y la asigna al jugador 1 + cout << "LA POSICIÓN DE GAWAIN ES " << posicionDeGawain << "\n\n" << endl; //Imprime la posición del jugador 1 + *( apuntadorPosicionDelTablero + (posicionDeGawain - 1) ) = 'G'; //Toma la posición actual del jugador 1 y le asigna la letra G a esa posicion en el vector tablero + tableroGrafico( apuntadorPosicionDelTablero ); //Imprime el tablero actualizado + limpiarPantalla(); //Limpia pantalla + + //Primer turno del jugador 2 + cout<< "\nAHORA LANCE EL DADO QUE DARÁ LA POSICIÓN INICIAL DEL CABALLERO DIETRICH EN EL TABLERO" << endl; + continuar(); //Función que para el juego hasta que se oprima la flecha arriba + turno = turno + 1; //Suma 1 a la variable turno + cout << "Turno: " << turno << endl; //Imprime la variable turno (TURNO 2) + posicionDeDietrich = dado( posicionDeDietrich, turno, posicionDeDietrich ); //toma un numero de1 1 al 64 mediante la función dado() y la asigna al jugador 1 + + //Este siclo evalúa si el jugador 1 y el jugador 2 están en la misma posición y si es así pone al jugador 2 en la posición del jugador 1 más uno + if( posicionDeGawain == posicionDeDietrich ) + { + posicionDeDietrich++; + } + cout << "LA POSICIÓN DE DIETRICH ES "<< posicionDeDietrich << "\n\n\n\n"<< endl; //Imprime la posición del jugador 1 + *( apuntadorPosicionDelTablero + (posicionDeDietrich - 1) ) = 'D'; //Toma la posición actual del jugador 2 y le asigna la letra G a esa posicion en el vector tablero + tableroGrafico(apuntadorPosicionDelTablero); //Imprime el tablero actualizado + limpiarPantalla(); //Limpia pantalla + + + //SE EXPLICA COMO FUNCIONARA EL JUEGO A PARTIR DE AHORA + cout << "\nA PARTIR DE ESTE MOMENTO SE JUGARÁ CON UN DADO DE OCHO CARAS QUE DICTARÁ LA " + << "SIGUENTE POSICIÓN DEL JUGADOR SEGUN LOS MOVIMIENTOS DEL CABALLO EN EL AJEDREZ\n\n" << endl; + + //4. JUEGO + while( win == false ) + { + // Este ciclo se repite hasta que uno de los dos jugadores gane y contiene lo que se hara durante el turno 3 hasta que un jugador se queda sin movimientos + limpiarPantalla(); //Limpiar pantalla + contador = 0; //Asigna el valor cero al contador de movimientos no validos + cout << "\nTurno: " << turno << endl; //Imprime el turno actual + + //Para saber a que jugador le toca se hace la operación turno modulo dos. + //Luego si es 1 es porque turno es impar y por tanto le toca al jugador 2 y si es 0 es porque el número es par y le toca al jugador 1 + switch( turno % 2 ) + { + //TURNO DEL JUGADOR 1 + case 0: //Si turno modulo dos es uno, ejecuta el siguiente código + cout << "\nTURNO DEL CABALLERO GAWAIN" << endl; + srand( static_cast(time(NULL))); + lanzamientoDeGawain = dado( posicionDeGawain, turno, lanzamientoDeGawain); //Adquiere un número del 1 al 8 (Se lanza el dado) + jugadaDeGawain++; + + //Ciclo que se repite hasta que el jugador termine su turno, llámese ciclo de turno + while( flag == false ) + { + continuar(); //Función que para el juego hasta que se oprima la flecha arriba + contador++; //Suma 1 al contador + if(contador>8) + { + //Si el contador suma 8 errores ejecuta las siguientes tres líneas + win=true; //Indica que alguien gano + flag=true; //termina el turno + winner = 2; //Indica que el jugador 2 gano + } + nuevaPosicionPosible = obtenerPosicion( posicionDeGawain, lanzamientoDeGawain ); //Haya la posible nueva posición del jugador 1 + if( nuevaPosicionPosible < 65 ) + { + //Si la posible nueva posición es menor a 65 continua con el código + validezDeLaJugada =posicionValida( posicionDeGawain, lanzamientoDeGawain, nuevaPosicionPosible); //Valida la nueva posible posición a ver si se puede hacer + if (validezDeLaJugada == 1) + { + //Si la posible nueva posición es válida continua con el código + if( nuevaPosicionPosible != posicionDeDietrich) + { + //Si la nueva posible posición es diferente al de la posición actual del jugador 2, continua con el código + if( *( apuntadorPosicionDelTablero + ( nuevaPosicionPosible - 1) ) == ' ') + { + //Si al evaluar la posible nueva posición en el vector tablero corresponde al carácter ' ', continua con el código + *(apuntadorPosicionDelTablero + ( posicionDeGawain - 1) )= 'X'; //Toma la posición actual del jugador 1 en el vector tablero y le asigna el carácter 'X'. Que en el tablero indicara que no se pueden mover a ese sitio + posicionDeGawain = nuevaPosicionPosible; //Asigna el valor de la posible nueva posición a la posición actual + *( apuntadorPosicionDelTablero + ( posicionDeGawain - 1) ) = 'G'; //Toma la nueva posición actual del jugador 1 en el vector tablero y le asigna el carácter 'G'. Que en el tablero indica la posición de Gowin + flag = true; //termina el turno + *( apuntadorJugadasDeGawain + ( jugadaDeGawain - 1 )) = lanzamientoDeGawain; //Agrega al vector jugadas el número de dado que saco el jugador 1 para moverse a la nueva posición + //Se imprime lo que paso en el tablero de forma escrita + cout << "Se movió a " << posicionDeGawain << "\n" + << "Dado: " << lanzamientoDeGawain << endl; + } + else + { + //Si al evaluar la posible nueva posición en el vector tablero NO corresponde al caracter ' ', vuelve a tirar el dado + lanzamientoDeGawain = movimientoInvalido( lanzamientoDeGawain ); + } + } + else + { + //Si el jugador 1 cae en la posicion del jugador 2 + posicionesDelTablero[ posicionDeGawain - 1 ] = 'X'; //Toma la posición actual del jugador 1 en el vector tablero y le asigna el carácter 'X'. Que en el tablero indicara que no se pueden mover a ese sitio + posicionDeGawain = nuevaPosicionPosible; //Asigna el valor de la posible nueva posición a la posición actual + posicionesDelTablero[ posicionDeGawain - 1 ] = 'G'; //Toma la nueva posición actual del jugador 1 en el vector tablero y le asigna el carácter 'G'. Que en el tablero indica la posición de Gowin + flag = true; //termina el turno + *( apuntadorJugadasDeGawain + ( jugadaDeGawain - 1) )= lanzamientoDeGawain; //Agrega al vector jugadas el número de dado que saco el jugador 1 para moverse a la nueva posición + //Se imprime lo que paso en el tablero de forma escrita + cout << "Se movió a la posición de DIETRICH" << posicionDeGawain << endl; + cout << "Dado: "<< lanzamientoDeGawain << endl; + win = true; //Indica que alguien gano + winner = 1; //Indica que el jugador 1 gano + } } - else{ //Si al evaluar la posible nueva posición en el vector tablero NO corresponde al caracter ' ', vuelve a tirar el dado - Pc1=mov_inv(Pc1); + else + { + //Si la nueva posición no es valida, vuelve a tirar el dado + lanzamientoDeGawain = movimientoInvalido( lanzamientoDeGawain ); } } - else{ //Si el jugador 1 cae en la posicion del jugador 2 - tablero[c1-1]='X'; //Toma la posición actual del jugador 1 en el vector tablero y le asigna el carácter 'X'. Que en el tablero indicara que no se pueden mover a ese sitio - c1=x; //Asigna el valor de la posible nueva posición a la posición actual - tablero[c1-1]='G'; //Toma la nueva posición actual del jugador 1 en el vector tablero y le asigna el carácter 'G'. Que en el tablero indica la posición de Gowin - flag=true; //termina el turno - *(p_jugadasG + (jugadaG-1))=Pc1; //Agrega al vector jugadas el número de dado que saco el jugador 1 para moverse a la nueva posición - //Se imprime lo que paso en el tablero de forma escrita - cout<<"Se movió a la posición de DIETRICH"<8){ //Si el contador suma 8 errores ejecuta las siguientes tres líneas - win=true; //Indica que alguien gano - flag=true; //termina el turno - winner=1; //Indica que el jugador 1 gano - } - x=posicion(c2,Pc2); //Haya la posible nueva posición del jugador 1 - if(x<65){ //Si la posible nueva posición es menor a 65 continua con el código - Valida=validapos(c2,Pc2,x); //Valida la nueva posible posición a ver si se puede hacer - if (Valida==1){ //Si la posible nueva posición es válida continua con el código - if(x!=c1){ //Si la nueva posible posición es diferente al de la posición actual del jugador 1, continua con el código - if(*(p_tablero + (x-1))==' '){ //Si al evaluar la posible nueva posición en el vector tablero corresponde al carácter ' ', continua con el código - *(p_tablero + (c2-1))='X'; //Toma la posición actual del jugador 2 en el vector tablero y le asigna el carácter 'X'. Que en el tablero indicara que no se pueden mover a ese sitio - c2=x; //Asigna el valor de la posible nueva posición a la posición actual - *(p_tablero + (c2-1))='D'; - flag=true; //termina el turno - *(p_jugadasD + (jugadaD-1))=Pc2; //Agrega al vector jugadas el número de dado que saco el jugador 2 para moverse a la nueva posición - //Se imprime lo que paso en el tablero de forma escrita - cout<<"Se movió a "<(time(NULL))); //Adquiere un número del 1 al 8 (Se lanza el dado) + lanzamientoDeDietrich = dado(posicionDeDietrich , turno, lanzamientoDeDietrich); //Ciclo que se repite hasta que el jugador termine su turno, llámese ciclo de turno + jugadaDeDietrich++; + while( flag == false ) + { + continuar(); //Función que para el juego hasta que se oprima la flecha arriba + contador++; //Suma 1 al contador + if( contador > 8 ) + { + //Si el contador suma 8 errores ejecuta las siguientes tres líneas + win = true; //Indica que alguien gano + flag = true; //termina el turno + winner = 1; //Indica que el jugador 1 gano + } + nuevaPosicionPosible = obtenerPosicion( posicionDeDietrich, lanzamientoDeDietrich); //Haya la posible nueva posición del jugador 1 + if( nuevaPosicionPosible < 65) + { + //Si la posible nueva posición es menor a 65 continua con el código + validezDeLaJugada = posicionValida( posicionDeDietrich, lanzamientoDeDietrich, nuevaPosicionPosible); //Valida la nueva posible posición a ver si se puede hacer + if (validezDeLaJugada == 1) + { + //Si la posible nueva posición es válida continua con el código + if( nuevaPosicionPosible != posicionDeGawain) + { + //Si la nueva posible posición es diferente al de la posición actual del jugador 1, continua con el código + if( *( apuntadorPosicionDelTablero + ( nuevaPosicionPosible - 1) ) == ' ') + { + //Si al evaluar la posible nueva posición en el vector tablero corresponde al carácter ' ', continua con el código + *( apuntadorPosicionDelTablero + ( posicionDeDietrich - 1 ) ) = 'X'; //Toma la posición actual del jugador 2 en el vector tablero y le asigna el carácter 'X'. Que en el tablero indicara que no se pueden mover a ese sitio + posicionDeDietrich = nuevaPosicionPosible; //Asigna el valor de la posible nueva posición a la posición actual + *( apuntadorPosicionDelTablero + ( posicionDeDietrich - 1 ) ) = 'D'; + flag = true; //termina el turno + *( apuntadorJugadasDeDietrich + (jugadaDeDietrich - 1) ) = lanzamientoDeDietrich; //Agrega al vector jugadas el número de dado que saco el jugador 2 para moverse a la nueva posición + //Se imprime lo que paso en el tablero de forma escrita + cout << "Se movió a " << posicionDeDietrich + << "\nDado: " << lanzamientoDeDietrich << endl; + } + else + { + //Si al evaluar la posible nueva posición en el vector tablero NO corresponde al caracter ' ', vuelve a tirar el dado + lanzamientoDeDietrich = movimientoInvalido( lanzamientoDeDietrich ); + } + } + else + { + //Si el jugador 2 cae en la posición del jugador 1 + *( apuntadorPosicionDelTablero + ( posicionDeDietrich - 1 ) ) = 'X'; //Toma la posición actual del jugador 2 en el vector tablero y le asigna el caracter 'X'. Que en el tablero indicara que no se pueden mover a ese sitio + posicionDeDietrich = nuevaPosicionPosible; //Asigna el valor de la posible nueva posición a la posición actual + *( apuntadorPosicionDelTablero + ( posicionDeDietrich - 1 ) ) = 'D'; + flag = true; //termina el turno + *( apuntadorJugadasDeDietrich + ( jugadaDeDietrich - 1) ) = lanzamientoDeDietrich; //Agrega al vector jugadas el número de dado que saco el jugador 2 para moverse a la nueva posición + //Se imprime lo que paso en el tablero de forma escrita + cout << "Se movió a la posición de GAWAIN " << posicionDeDietrich + << "\nDado: " << lanzamientoDeDietrich << endl; + win = true; //Indica que alguien gano + winner = 2; //Indica que el jugador 2 gano + } } - else{ //Si al evaluar la posible nueva posición en el vector tablero NO corresponde al caracter ' ', vuelve a tirar el dado - Pc2=mov_inv(Pc2); + + else + { + //Si la nueva posición no es valida, vuelve a tirar el dado + lanzamientoDeDietrich = movimientoInvalido( lanzamientoDeDietrich ); } } - else{ //Si el jugador 2 cae en la posicion del jugador 1 - *(p_tablero + (c2-1))='X'; //Toma la posición actual del jugador 2 en el vector tablero y le asigna el carácter 'X'. Que en el tablero indicara que no se pueden mover a ese sitio - c2=x; //Asigna el valor de la posible nueva posición a la posición actual - *(p_tablero + (c2-1))='D'; - flag=true; //termina el turno - *(p_jugadasD + (jugadaD-1))=Pc2; //Agrega al vector jugadas el número de dado que saco el jugador 2 para moverse a la nueva posición - //Se imprime lo que paso en el tablero de forma escrita - cout<<"Se movió a la posición de GAWAIN"<