Está en la página 1de 2

// Juego del ahorcado versin 2

#include <iostream>
using namespace std;

typedef int TLetras[26];


/* 26 letras del alfabeto la posicin cero para la 'a' la uno para la 'b' ...*/

string leer_cadena_y_devolver_cadena_de_asteriscos(string &cadena);


/* funcion que pide una cadena que se lee por teclado y la devuelve
(por referencia) junto con una cadena de asteriscos (como retorno) de la
misma longitud que la cadena leida */

bool palabra_acertada(string cad_original, string &cad_averiguar, char letra);


/* funcion que dadas dos cadenas de caracteres, correspondiendo la primera a
la cadena a adivinar y la segunda a la cadena que contiene astericos, y dada
una letra, sustituye en la cadena de asteriscos los asteriscos por la letra
indicada en las posiciones en las que dicha letra se encuentre en la cadena
a averiguar. La funcin devuelve tambin si tras la sustitucin ambas cadenas
coinciden. */

bool letra_utilizada(TLetras &letras_usadas, char letra);


/* funcion que devuelve si la letra ya ha sido usada en el juego
si ha sido usada devuelve verdadero, si no ha sido usada la marca como usada
y devuelve falso */

void mostrar_letras(TLetras letras_usadas, int valor);


/* funcion que muestra el listado de letras que han sido usadas en el juego o no
dependienteo del valor del segundo parmetro (si es el valor 1 se muestra
el listado de letras que ya se han usado y si se le pasa el valor 0 se muestra
el listado de las que todava no se han usado */

int main ()
{
string cad_original, cad_asteriscos;
TLetras letras_usadas={0}; //Inicialmente se ponen todas como no usadas
char letra;
unsigned oportunidades;
bool acertado = false;

cad_asteriscos=leer_cadena_y_devolver_cadena_de_asteriscos(cad_original);
oportunidades=cad_original.size();
while(oportunidades>0 && !acertado)
{
system("cls");
cout << endl << "Te quedan " << oportunidades << " oportunidades";
cout << endl << endl << "Letras usadas : "; mostrar_letras(letras_usadas,1);
cout << endl << "Letras sin usar : "; mostrar_letras(letras_usadas,0);
cout << endl << endl << "Palabra a adivinar: " << cad_asteriscos;
do{
cout << endl << "Introduce letra sin usar: ";
cin >> letra;
}while(letra_utilizada(letras_usadas,letra));
/* con el bucle do..while se est forzando a la lectura de una letra no
usada previamente */
oportunidades--;
acertado=palabra_acertada(cad_original,cad_asteriscos,letra);
}
if (acertado)
cout << endl << "Enhorabuena, la palabra era: ";
else
cout << endl << "Lo siento, la palabra era: ";
cout << cad_original << endl;
system ("pause");
return 0;
}
string leer_cadena_y_devolver_cadena_de_asteriscos(string &cadena)
{
string cad_asteriscos;
int i;
cout << endl << "introduce palabra a adivinar: ";
cin >> cadena;
cad_asteriscos.clear();
for(i=0;i<cadena.size();i++)
cad_asteriscos+='*';
system("cls");
return cad_asteriscos;
}

bool palabra_acertada(string cad_original, string &cad_averiguar, char letra)


{
int i;
for(i=0;i<cad_original.size();i++)
if(cad_original[i]==letra)
cad_averiguar[i]=letra;
return (cad_original==cad_averiguar);
}

bool letra_utilizada(TLetras &letras_usadas, char letra)


{
bool devolver = true;
if (letras_usadas[letra-'a']==0)
{
devolver = false;
letras_usadas[letra-'a']=1;
}
return devolver;
}

void mostrar_letras(TLetras letras_usadas, int valor)


{
int i;
for(i=0;i<26;i++)
if(letras_usadas[i]==valor)
cout << (char) (i+'a') << " ";
}