constintPERSONA=1;//Constante global, representa al JUGADOR.
constintMAQUINA=2;//Constante global, representa a la MAQUINA.
constintlimiteInf=3;//Constante glogal. Límite inferior de cartas que se pueden sacar en los modos "A" y "B".
constintlimiteSup=5;//Constante glogal. Límite superior de cartas que se pueden sacar en los modos "A" y "B".
constintTIPOCARTAS=8;//Constante glogal. Representa el tipo de cartas que hay en la baraja española (figuras y del 1 al 7).
constintMAXCARTAS=40;//Constante global. Representa el número total de cartas que contiena la baraja española.
constintMAX_BARRAS=MAXCARTAS*2+18;//IMPORTANTE: esta constante sirve sólo para decorar los resultados extra que se muestran al activar el modo depurar. No es necesaria, se puede eliminar y no afecta a la correcta ejecución del juego.
constboolDEPURAR=false;//Constante global booleana. Si es "TRUE" el modo depuración estará activado (en este caso, toda la información extra, apararecerá entre guiones). Si es "FALSE", el modo depuración estará desactivado.
//Tipos:
typedefinttCartas;
typedeftCartastCartasPorAparecer[TIPOCARTAS];
typedefinttBaraja[MAXCARTAS];
typedefstruct{
tBarajamazo;
intcontador;
}tConjuntoCartas;
//Funciones:
voidversion1(charop);//Permite jugar a los modos de juego "A" y "B".
voidversion2();//Permite jugar al modo de juego "C".
voidversion3(int&numPartidas);//Permite jugar al modo de juego "D".
doublemodoA(ifstream&mazo,intnumCartas);//Permite a cualquiera de los dos jugadores realizar su turno en el modo de juego A.
doublemodoB(ifstream&mazo,intnumCartas,intturno,doublepuntosContrario);//Permite jugar al jugador del turno (Persona o Maquina) en el modo B.
doublemodoD(tConjuntoCartas&mazo,tCartasPorAparecercartas,intturno,doublepuntosContrario,tConjuntoCartas&cartasJugador);//Permite jugar al jugador delturnoenelmodoD.
intdeterminaGanador(doublepuntosJugador,doublepuntosMaquina,consttConjuntoCartas&cartasJugador,consttConjuntoCartas&cartasMaquina);//Recibelospuntosobtenidosporeljugadorhumanoyporlamáquina, así como las cartas sacadas por ambos.Ydevuelveunvalorqueindicaquiéngana(utilizalasconstantesHombre,Maquina).
boolabrirArchivo(ifstream&mazo);//Pide el nombre del archivo donde está el mazo de cartas y si se puede abrir devuelve el mazo y true, y en otro caso false.
intmenu();//Muestra el menú del programa con las opciones posibles. Devuelve la opción elegida por el usuario.
voidejecutarMenu();//Ejecuta la opción del menú que ha elegido el usuario en la funcion menu().
intgenerarAleatorio();//Genera un número aleatorio entre un límite inferior y un límite superior.
voidcrearMazo(tConjuntoCartas&mazo);//Rellena mazo con40cartasdispuestasdeformaaleatoria.
voidbarajar(tConjuntoCartas&mazo);//Mezcla la baraja de forma aleatoria;
voidsumarPuntos(double&puntos,intcarta);//Suma los puntos correspondientes a la carta extraida.
boolcargarMazo(tConjuntoCartas&mazo);//Carga un mazo de cartas.
voidguardarResultado(int&numPartidas,intganador,double&puntosJugador,double&puntosMaquina,tConjuntoCartas&cartasJugador,tConjuntoCartas&cartasMaquina);//Guarda el resultado de la partida actual.
voiddepurar(tConjuntoCartas&mazo,constintturno,tConjuntoCartas&cartasJugador);//Muestra la baraja de cartas cargada desde un archivo de texto y las cartas extraidas por el jugador o por la máquina, en cada caso.
intmain(){
if(DEPURAR==false){srand(time(nullptr));}
else{srand(1);}
ejecutarMenu();
return0;
}
intmenu(){
//Parámetros: no tiene.
//Devuelve: la opción del menú elegida por el usuario.
intopc=1;
cout<<"<--------------Menu-------------->"<<endl;
cout<<" 1-Jugar MODO A."<<endl;
cout<<" 2-JUGAR MODO B."<<endl;
cout<<" 3-JUGAR MODO C."<<endl;
cout<<" 4-JUGAR MODO D."<<endl;
cout<<" 0-Salir"<<endl;
cout<<"<-------------------------------->"<<endl;
cout<<endl;
cout<<"Seleccione una opcion del menu: ";
cin>>opc;
while(opc<0||opc>4){
cout<<"Seleccione una opcion del menu (entre 0 y 4): ";
cin>>opc;
}
returnopc;
}
voidejecutarMenu(){
//Parámetros: no tiene.
intopcion=1;//Entero que representa la opción escogida por el jugador.
intnumPartidas=0;//Entero que representa el número de partidas jugadas al modo D, desde que se inicia el programa.
system("cls");
while(opcion!=0){
opcion=menu();
switch(opcion){
case1:version1(opcion);break;
case2:version1(opcion);break;
case3:version2();break;
case4:version3(numPartidas);break;
case0:break;
}
}
}
boolabrirArchivo(ifstream&mazo){
boolcarga=true;//Variable booleana que indica si el archivo ha cargado correctamente.
stringarchivo;//Archivo a cargar. Se iguala al nombre del archivo, con extensión, introducido por el usuario.
cout<<"Introduzca el nombre del fichero: ";
cin>>archivo;
cout<<endl;
mazo.open(archivo);
if(!mazo.is_open()){
cout<<"No se ha encontrado el archivo."<<endl;
carga=false;
}
else{
carga=true;
}
//mazo.close();
returncarga;//Devuelve true en caso de carga correcta del archivo, false en caso contrario.
}
voidversion1(charop){
ifstreammazo;//Archivo que carga el mazo.
boolcarga=abrirArchivo(mazo);//Variable booleana que se iguala a la función arbrirArchivo(). Será true en caso de que el mazo se haya cargado, false en caso contrario.
intnumCartas=generarAleatorio();//Número de cartas que puede robar el jugador en esa ronda, se genera de forma aleatoria.
intganador=0;//Variable entera que determina el ganador de la partida.
doublepuntosJugador=0;//Puntos del jugador.
doublepuntosMaquina=0;//Puntos de la máquina.
intturno=0;//Variable entera, determina si el turno es del JUGADOR o de la MÁQUINA. (MODO B).
boolcarga=abrirArchivo(mazo);//Variable booleana que se iguala a la función arbrirArchivo(). Será true en caso de que el mazo se haya cargado, false en caso contrario.
doublepuntosJugador=0;//Puntos del jugador.
doublepuntosMaquina=0;//Puntos de la máquina.
intturno=0;//Variable entera, determina si el turno es del JUGADOR o de la MÁQUINA.
intganador=0;//Variable entera que determina el ganador de la partida.
inicializa(cartas);//Inicializa las cartas que quedan por aparecer.
guardarResultado(numPartidas,ganador,puntosJugador,puntosMaquina,cartasJugador,cartasMaquina);//Guarda el resultado de la partida en un archivo de texto.
}
system("pause");
system("cls");
}
doublemodoA(ifstream&mazo,intnumCartas){
doublepuntos=0;//Variable que representa los puntos que suman actualmente las cartas.
intcarta;//Variable entera que se igualará a la siguiente carta del mazo.
doublepuntos=0;//Variable que representa los puntos que suman actualmente las cartas.
intcarta;//Variable entera que se igualará a la siguiente carta del mazo.
charcontinuar='y';//Variable de tipo carácter. Si se iguala a "Y/y", el JUGADOR seguirá robando carta. Si se iguala a "N/n", no seguirá robando. (MODO B).
carta=sacarCarta(mazo,puntos);//Saca la siguiente carta del archivo que contiene el mazo.
restarCarta(cartas,carta);//Resta la carta de la lista de cartas restantes.
if((turno==MAQUINA)&&(puntos==puntosContrario)){
probabilidadPasarse=esProbablePasarse(puntos,cartas);//Calcula la probabilidad que tiene la MAQUINA de pasarse si continúa sandao cartas (devuelve true si es mayor del 50%).
sacar(mazo,carta);//Extrae la siguiente carta del mazo.
sumarPuntos(puntos,carta);//Suma los puntos de la carta extraida.
incluir(cartasJugador,carta);//Incluye la carta sacada en el array correspondiente.
restarCarta(cartas,carta);//Resta la carta de la lista de cartas restantes.
if((turno==MAQUINA)&&(puntos==puntosContrario)){
probabilidadPasarse=esProbablePasarse(puntos,cartas);//Calcula la probabilidad que tiene la MAQUINA de pasarse si continúa sandao cartas (devuelve true si es mayor del 50%).
carta=cartas.mazo[cartas.contador];//Saca la siguiente carta.
cartas.contador--;
}
voidincluir(tConjuntoCartas&cartas,intcarta){
cartas.mazo[cartas.contador]=carta;
cartas.contador--;
}
voidcrearMazo(tConjuntoCartas&mazo){
intn=1;//Variable entera que va representando en número de la carta que se va añadiendo a cada posición del array.
inti=0;
while(i<MAXCARTAS){
if(n==8){n=10;}//Se salta los 8´s y 9´s, porque no existen en la baraja española.
mazo.mazo[i]=n;
mazo.mazo[i+1]=n;
mazo.mazo[i+2]=n;
mazo.mazo[i+3]=n;
n++;
i=i+4;
}
mazo.contador=MAXCARTAS-1;
}
voidbarajar(tConjuntoCartas&mazo){
intindice1=0,indice2=0;//Variable entera que determina una posición de la baraja.
intauxiliar=0;//Variable entera auxiliar que servirá para no perder el contenido de diferentes posiciones del array.
for(inti=0;i<MAXCARTAS;i++){
indice1=(rand()%MAXCARTAS);//Genera una posición aleatoria de la baraja.
indice2=(rand()%MAXCARTAS);//Genera otra posición aleatoria de la baraja.
auxiliar=mazo.mazo[indice1];//Guarda el contenido de la primera posición aleatoria en un auxiliar;
mazo.mazo[indice1]=mazo.mazo[indice2];//Mueve el contenido de la segunda posición del mazo generada aleatoriamente, a la primera posición generada aleatoriamente.
mazo.mazo[indice2]=auxiliar;//Guarda lo que había en la primera posición (ahora guardado en la variable auxiliar), en la segunda posición del mazo aleatoria.
}
}
voidsumarPuntos(double&puntos,intcarta){
if((carta!=10)&&(carta!=11)&&(carta!=12)){
puntos+=carta;
}
else{
puntos+=0.5;
}
}
boolcargarMazo(tConjuntoCartas&mazo){
ifstreambaraja;//Archivo que carga el mazo.
boolcarga=true;//Variable booleana que indica si el archivo ha cargado correctamente.
stringarchivo;//Archivo a cargar. Se iguala al nombre del archivo, con extensión, introducido por el usuario.
intauxiliar=0;//Variable auxiliar que almacena temporalmente la carta que se va a incluir en la posición "i" del mazo.
cout<<"Introduzca el nombre del fichero: ";
cin>>archivo;
baraja.open(archivo);
if(!baraja.is_open()){
cout<<"No se ha encontrado el archivo."<<endl;
carga=false;
}
else{
carga=true;
for(inti=0;i<MAXCARTAS;i++){
baraja>>mazo.mazo[i];
}
mazo.contador=MAXCARTAS-1;
}
baraja.close();
returncarga;//Devuelve true en caso de carga correcta del archivo, false en caso contrario.