El ahorcado en C

Vanessa León

/* Aquí os dejo un juego para dos personas basado en cadenas que he encontrado y me ha parecido interesante */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <ctype.h>
void Titulos(void);                                /*prototipos funciones*/
void LimpiaPantalla(void);
int  PreparaPartida(void);
void InputNombreJugad(int g);
void InputPalabra(int g);
int  PruebaLetra(int g);
int  InputTentativa(int g);
void MuestraSituacion(void);
void Victoria(int g);
void PutNchar(int n, int c);
int  InputCadena(char *prompt, char *s, int lmin, int lmax);
void StrMinuscula(char *s);
#define MAXNOMBRE 20     /*longitud m xima nombre jugador*/
#define MINPALABRA 8     /*longitud m¡nima palabra para adivinar*/
#define MAXPALABRA 16    /*longitud m xima palabra para adivinar*/

enum estados { NO, SI, GANA, BASTA };      /*estados de juego <1>*/

char nombreJugad[2][MAXNOMBRE+1];   /*nombres de los dos jugadores <2>*/
char palabra[2][MAXPALABRA+1];      /*palabra para adivinar*/
char letrasadiv[2][MAXPALABRA+1];   /*letras adivinadas por el momento*/
char letrasprob[2][26+1];           /*letras probadas <3>*/
main()
{
int jugad;           /*jugador en turno (0,1)*/
int estado;          /*estado del juego*/

Titulos();
jugad = PreparaPartida();                       /*inicializa*/

do {
jugad = 1-jugad;                            /*cambia jugador <1>*/
do {
estado = PruebaLetra(jugad);            /*intenta <2>*/
} while (estado == SI);                     /*repite si adivina*/
} while (estado != GANA && estado != BASTA);

if (estado == GANA) {
Victoria(jugad);                            /*celebra victoria*/
} else {
puts(“- De acuerdo, interrumpo esta apasionante partida.\n”);
}
puts(“­Adi¢s!”);
}

void Titulos(void)
{
LimpiaPantalla();
printf(“%60s”,”- Palabra: un desaf¡o entre dos jugadores -\n\n”); /*<1>*/
puts(“Reglas:\n\n”
“- Cada jugador escribe una palabra que el otro deber  adivinar,\n”
”  despu‚s se juega introduciendo por turno una letra.\n\n”
“- Si la letra est  en la palabra, se muestra y se tiene derecho\n”
”  a otro intento.\n\n”
“- Gana quien consiga descubrir antes la palabra entera.\n\n”);
}
void LimpiaPantalla(void)
{
int i;

for (i = 0; i < 25; i++)  putchar(‘\n’);
}

int PreparaPartida(void)
{
int i,lp;

srand((unsigned int)time(NULL));                /*inicia aleatorio <1>*/

InputNombreJugad(0);                            /*nombres jugadores <2>*/
InputNombreJugad(1);
InputPalabra(0);                                /*palabras secretas*/
InputPalabra(1);

for (i = 0; i < 2; i++) {                       /*hasta ahora, nada <3>*/
lp = strlen(palabra[i]);
letrasadiv[i][lp] = 0;                      /*<4>*/
while (lp–) {                              /*<5>*/
letrasadiv[i][lp] = ‘.’;
}
letrasprob[i][0] = 0;                       /*cadena vac¡a <6>*/
}

return rand()%2;                                /*elige jugador <7>*/
}

void InputNombreJugad(int g)
{
char prompt[80];

sprintf(prompt,”Nombre del jugador n. %d:”,g+1);    /*<1>*/
InputCadena(prompt,nombreJugad[g],3,MAXNOMBRE);     /*<2>*/

StrMinuscula(nombreJugad[g]);                    /*todas min£sculas <3>*/
nombreJugad[g][0] = toupper(nombreJugad[g][0]);  /*excepto la inicial*/
putchar(‘\n’);
}
void InputPalabra(int g)
{
char prompt[160];                               /*<1>*/
int  ag;
int  i,ok,c;

ag = 1-g;                                       /*otro jugador*/
do {
sprintf(prompt,”%s, escribe la palabra que %s\n”
“deber  adivinar (%s, ­no mires!) :”,
nombreJugad[g],nombreJugad[ag],nombreJugad[ag]);
InputCadena(prompt,palabra[ag],MINPALABRA,MAXPALABRA);

StrMinuscula(palabra[ag]);                    /*todas min£sculas*/
ok = 1;                                       /*suponemos ok*/
for(i = strlen(palabra[ag])-1; i >= 0; i–) { /*prueba letras <2>*/
c = palabra[ag][i];
if (c < ‘a’ || c > ‘z’)  ok = 0;          /*<3>*/
}
if (! ok) {
puts(“\n- S¢lo se pueden utilizar letras no acentuadas.\a\n”);
}
} while (! ok);

LimpiaPantalla();                                 /*oculta palabra*/
}

int  PruebaLetra(int g)
{
int  t;          /*intento*/
char tz[2];      /*intento, en forma de cadena <1>*/
int  st;         /*estado*/
int  i;

t = InputTentativa(g);                           /*pide letra <2>*/
tz[0] = t;                                       /*crea cadena <3>*/
tz[1] = 0;

if (t == EOF) {                                  /*mira si terminado*/
st = BASTA;                                  /*<4>*/
} else if (strchr(palabra[g],t) == NULL) {       /*si no est  <5>*/
st = NO;
printf(“- ­La letra ‘%c’ no est  en la”
”  palabra que hay que adivinar!\a\n\n”,t);
strcat(letrasprob[g],tz);                    /*probada <6>*/
} else {
st = SI;                                     /*est , actualiza <7>*/
for (i = strlen(palabra[g])-1; i >= 0; i–) {
if (palabra[g][i] == t) {
letrasadiv[g][i] = t;                /*copia si ok*/
}
}
strcat(letrasprob[g],tz);                    /*probada*/
if (strcmp(letrasadiv[g],palabra[g]) == 0) { /*prueba victoria <8>*/
st = GANA;
}
}

return st;                                       /*devuelve estado*/
}

int InputTentativa(int g)
{
char tenta[6];      /*tentativa (vale la primera letra)*/
char prompt[80];
int  ok,t,i,basta;

do {
MuestraSituacion();                         /*muestra palabras*/
sprintf(prompt,”%s, prueba una letra (\”basta\” para salir):”,
nombreJugad[g]);
InputCadena(prompt,tenta,1,5);              /*input tentativa <1>*/
putchar(‘\n’);
StrMinuscula(tenta);                        /*convierte en min£sc.*/
basta = (strcmp(tenta,”basta”) == 0);       /*cierto si “basta”*/

if (! basta) {                              /*si no debe salir*/
t = tenta[0];                           /*tentativa <2>*/
ok = 1;                                 /*suponemos ok*/
if (t < ‘a’ || t > ‘z’) {               /*prueba si v lida <3>*/
puts(“- Debes escribir una letra,”
”  no acentuada.\a\n”);
ok = 0;
}
if (strchr(letrasprob[g],t) != NULL) {  /*si probada <4>*/
printf(“- Ya has probado la letra”
” %c.\a\n\n”,t);
ok = 0;
}
}
} while (! ok && ! basta);

return ( basta ? EOF : t);                      /*EOF si basta <5>*/
}

void MuestraSituacion(void)
{
int  n;

n = printf(”   %s: %s”,nombreJugad[0],letrasadiv[0]);  /*n.1 a izq. <1>*/
PutNchar(40-n,’ ‘);                              /*n.2 al centro <2>*/
printf(“%s: %s\n\n”,nombreJugad[1],letrasadiv[1]);
n = printf(”   (probadas: %s)”,letrasprob[0]);
PutNchar(40-n,’ ‘);                              /*n.2 al centro*/
printf(“(probadas: %s)\n\n”,letrasprob[1]);
}

void Victoria(int g)
{
int  ls;
char buf[80];

PutNchar(78,’-‘);
puts(“\n”);                                     /*baja dos l¡neas*/
MuestraSituacion();
PutNchar(78,’-‘);
puts(“\n”);

sprintf(buf,”||   ­%s gana la partida!   ||”,
nombreJugad[g]);
ls = strlen(buf)-4;                             /*longitud cadena*/
printf(”   ++”);
PutNchar(ls,’=’);
puts(“++\a”);
printf(”   ||%*s||\a\n”,ls,””);                 /*<1>*/
printf(”   %s\a\n”,buf);
printf(”   ||%*s||\a\n”,ls,””);
printf(”   ++”);                                /*<2>*/
PutNchar(ls,’=’);
puts(“++\a\n”);

printf(”   (la palabra de %s era \”%s\”).\n\n”,   /*muestra soluci¢n*/
nombreJugad[1-g],palabra[1-g]);
}

void PutNchar(int n, int c)
{
while (n–)  putchar(c);
}
int InputCadena(char *prompt, char *s, int lmin, int lmax)     /*<1>*/
{
char buf[128];      /*buffer de l¡nea*/
int  ls;            /*longitud cadena*/

do {
printf(“%s “,prompt);                       /*muestra mensaje*/
if (gets(buf) == NULL) {                    /*lee cadena*/
ls = 0;                                 /*nula si EOF*/
} else {
ls = strlen(buf);                       /*calcula longitud*/
}
if (ls < lmin || ls > lmax) {               /*mira si v lida*/
printf(“\n- de %d a %d caracteres.\a\n\n”,
lmin,lmax);
ls = 0;
}
} while (ls == 0);                              /*repite si no ok*/

strcpy(s,buf);                                  /*copia en s*/
return ls;                                      /*devuelve longitud*/
}

void StrMinuscula(char *s)     /*<1>*/
{
while ( (*s = tolower(*s)) != 0)
s++;
}

Anuncios
Esta entrada fue publicada en Informática e Internet. Guarda el enlace permanente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s