martes, 16 de julio de 2013

Juego del Ahorcado en C

Bueno amig@s en esta ocasion les traigo uno de los juegos mas populares que podemos encontrar como lo es el juego del ahorcado en lenguaje C.

Funciones del juego:

- Permite seleccionar entre 3 categorías de palabras (Animales, Países, Difíciles).
- Podemos ingresar nuevas palabras o utilizar las que ya están guardadas.
- Muestra el numero de oportunidades restantes.
- Podemos volver a jugar nuevamente en una categoría distinta si lo deseamos.

Capturas:








Código:

Ahorcado.c

/*Version 1.0.1*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include<time.h>
#include<windows.h>
#include<math.h>
#include<ctype.h>

//Prototipo de funciones
void menu();
void carga();
void animales();
void paises();
void dificiles();
void juego(char palabra[50][20], int n);
void rotulo(int e);
void pieder();
void pieizq();
void made();
void maiz();
void base();
void cuerpo();
void cabeza();
void gotoxy(short x, short y);

//Funcion principal se encarga de llamar a la funciones carga y menu
int main(){
 carga();//llamada de la funcion "carga"
 menu();//llamada de la funcion "menu"
 system("pause");
return 0;
}// Termina la funcion principal
void carga(){//funcion encargada de de mostrar la barra de carga del programa
 int c, m=6;
 system("cls");
    system("color 48");
    gotoxy (30,5);printf("Cargando......");
 Sleep(200);
 for(c=15;c<=75; c++){
  m++;
     gotoxy (m,10); printf("%c",219);
     gotoxy(6,15);printf("\n\n\n\n\n\tAHORCADO V 1.0.0 ");
  Sleep(100); 
 }   
 printf("\a");system("cls");
}
void menu(){
 char op;
 do{//imprime el menu principal varias veces hasta que sea necesareo
   system("cls");
   gotoxy (30,1); printf ("JUEGO DEL AHORCADO");
   gotoxy (30,4); printf("Seleccione Categoria");fflush(stdin);
   gotoxy (30,6); printf("1.Animales");
   gotoxy (30,8); printf("2.Paises");
   gotoxy (30,10); printf("3.Dificiles");
   gotoxy (30,12); printf("4.Salir");
   gotoxy (30,14); printf("Ingrese opcion: ");
   scanf("%c",&op);
  }while(op<'1'||op>'4');//evalua los datos ingresados por el usuario
 switch(op){//seleeciona el caso ingresado por el usuario
  case '1': animales();break;// llamado a la funcion animales
  case '2': paises();break;// llamado a la funcion paises
  case '3': dificiles();break;// llamado a la funcion dificiles
  case '4':printf("\n\nGracias por utilizar nuestro programa.....\n\n");break;
 }
}
void animales(){
 char palabra[50][20]={"murcielago","tiburon","perro","chancho","gato","cerdo","gallina","elefante","vaca","serpiente","mono","rata"};
 //asignacion de palabras a una lista
 int n=0, i;
 char op;
 fflush(stdin);
 do{// muestra el menu si no se cumple la condicion
  fflush(stdin);
  system("cls");
  gotoxy (30,1); printf("CATEGORIA NOMBRE DE ANIMALES");
  gotoxy (30,4); printf("1.Ingresar nueva palabra");
  gotoxy (30,6); printf("2.Jugar con lista existente");
  gotoxy (30,8); printf("3.Retornar al menu principal");
  gotoxy (30,10); printf("    Ingrese opcion: ");
  scanf("%c",&op);
 }while(op<'1'||op>'3');//evaluacion de las datos ingresados por el usuario
  switch(op){
  case'1':// añade mas palabras a la lista 
   do{
    system("cls");
    printf("\n Digite cantidad de palabras: ");
    scanf("%d",&n);//captura el numero de palabras
   }while(n<0);
   for(i=3;i<=n+2;i++)
   {fflush(stdin);
   system("cls");
    printf("\n Ingrese palabra: ");
    gets(palabra[i]);//captura la palabra y la almacena en la pocision i de la lista
   }
   juego(palabra,n);break;//llamado a la funcion juego y la manda la lista modificada
  case'2':juego(palabra,n);break;//llama al funcion juego y le manda la lista con las palabras asignadas
  case'3':menu();break;// llama a la funcion menu
 }
}

void paises(){
 char palabra[50][20]={"afganistan","japon","alemania","cuba","venezuela","alemania","peru","paraguay","turquia","checoslovaquia","suriname","banladesh","africa"};
 //asignacion de palabras a una lista
 int n=0, i;
 char op;
 do{//  muestra el menu si no se cumple la condicion
  fflush(stdin);
  system("cls");
  gotoxy (30,1); printf("CATEGORIA NOMBRE DE PAISES ");
  gotoxy (30,4); printf("1.Ingresar nueva palabra");
  gotoxy (30,6); printf("2.Jugar con lista existente");
  gotoxy (30,8); printf("3.Retornar al menu principal");
  gotoxy (30,10); printf("    Ingrese opcion: ");
  scanf("%c",&op);
 }while(op<'1'||op>'3');//evalua los datos imgresados por el usuario
  switch(op){
  case'1':// añade mas palabras a la lista 
   do{system("cls");
    printf("\n Digite cantidad de palabras: ");
    scanf("%d",&n);//captura el numero de palabras
   }while(n<0);
   for(i=3;i<=n+2;i++){fflush(stdin);
    system("cls");
    printf("\n Ingrese palabra: ");
    gets(palabra[i]);//captura la palabra y la almacena en la pocision i de la lista
   }
   juego(palabra,n);break;//llamado a la funcion juego y la manda la lista modificada
  case'2':juego(palabra,n);break;//llama al funcion juego y le manda la lista con las palabras asignadas
  case'3':menu();break;// llama a la funcion menu
 }
}
void dificiles(){
  char palabra[50][20]={"hidraulica","clorhidrato","electrostatica","miercoles","computadora","musica","nada","sandia","puta","mundo","ahorcado","teclado","palabra"};
 //asignacion de palabras a una lista
  int n=0, i;
 char op;
 do{  // muestra el menu si no se cumple la condicion
  fflush(stdin);
  system("cls");
  gotoxy (30,1); printf("CATEGORIA PALABRAS DIFICILES");
  gotoxy (30,4); printf("1.Ingresar nueva palabra");
  gotoxy (30,6); printf("2.Jugar con lista existente");
  gotoxy (30,8); printf("3.Retornar al menu principal");
  gotoxy (30,10); printf("    Ingrese opcion: ");
  scanf("%c",&op); 
 }while(op<'1'||op>'3');//evaluacion de las datos ingresados por el usuario
  switch(op){
  case'1'://añade mas palabras a la lista 
   do{system("cls");
    printf("\n Digite cantidad de palabras: ");
    scanf("%d",&n);//captura el numero de palabras
   }while(n<0);
   for(i=3;i<=n+2;i++) {fflush(stdin);
   system("cls");
    printf("\n Ingrese palabra: ");
    gets(palabra[i]);//captura la palabra y la almacena en la pocision i de la lista
   }
   juego(palabra,n);break;//llamado a la funcion juego y la manda la lista modificada
  case'2':juego(palabra,n);break;//llamado a la funcion juego y la manda la lista modificada
  case'3':menu();break;// llama a la funcion menu
 }
}
void juego(char palabra[50][20], int n){
 int contador,longitud,i,j, e,error, m=13;
 char palabras[30], respuesta[30], letra, res, res1;
 do{system("cls");
  gotoxy (30,1); printf ("JUEGO DEL AHORCADO");
  base();//lama a la funcion base
  rotulo(0);//llama ala funcion rotulo para ver el numero de oportunidades restantes
  srand (time (NULL));
  longitud=rand()%(m+n);//genera un numero aleatorio y lo almacena en la variable longitud
  e=0;
  contador=0;
  strcpy(palabras,palabra[longitud]);//copia en la variable una variable de la lista
  longitud=strlen(palabras);//se obtiene el tamaño de la palabra y  se almacena en longitud
  gotoxy(4,30);
  for (i=0; i<longitud ; i++){fflush(stdin);
   respuesta[i]='*';//se almacena * en un vector
   printf (" %c ", respuesta[i]);// se imprime * en el lugar de las letras 
  }
  do{
   fflush (stdin);
   gotoxy (4,32); printf ("Ingrese una letra: ");
   scanf ("%c", &letra);//captura   una letra
   letra=tolower(letra);//convierte unna letra mayuscula en minuscula
   gotoxy (21,32);printf("     ");
   error=0;//se inicializa en 0
   gotoxy(4,30);
   for(j=0; j<longitud; j++)  {
    if (letra==palabras[j]){/*compara si la letra ingresada por el usuario corresponde a una posicion de la 
     palabra*/
     if(letra!=respuesta[j]){
      respuesta[j]=letra;// la susttituye por el *
      contador++;//aumenta contador en uno
     }
    }
    else{
     error++;//aumenta error en uno 
    }
    printf (" %c ", respuesta[j]);//imprime la letra correcta 
   }
   if(error==longitud){//entra si la letra ingresada no corresponde a ninguna de la palabra a adivinar
    e++;//segun la cantidad de letras erroneas aumenta en 1
   }
   rotulo(e);//llama ala funcien rotunlo y le envia e
     switch (e){//segun nel numero de errores selecciona un caso
      case 1:cabeza();break;//llama a la funcion que dibuja la cabeza
      case 2:cuerpo();break;//llama a la funcion que dibuja el cuerpo
      case 3:made();break;//llama a la funcion que dibuja la mano derecha
      case 4:maiz();break;//llama a la funcion que dibuja la mano izquierda
      case 5:pieizq();break;//llama a la funcion que dibuja la piena izquierda
      case 6:pieder();break;//llama a la funcion que dibuja la piena derecha
     }  
  }while(contador<longitud && e<6);
 
  if(e==6){//entra si ninguna de las letras corresponden ala palabra o se cometieron 6 errores
   gotoxy(4,32);printf ("Lo siento, Usted ha perdido. \n    Presione una tecla para ver la respuesta correcta");
   getch();gotoxy(4,30);
   for(j=0; j<longitud; j++){  
    printf (" %c ", palabras[j]);//imprime la palabra
   }
  }
  if(contador==longitud){//entra si todas las letras ingresadas corresponden a la palabra o se cometieron menos de 6 errores
  
   if(e==0){//si no se cometio ningun error
    gotoxy(4,32);printf ("Felicidades, Usted ha ganado sin cometer ningun error");
   }
   else{//si se cometirooon pocos errores
    gotoxy(4,32);printf ("Felicidades, Usted ha ganado, con %d intentos fallidos", e);
   }
  }
  fflush(stdin);
  gotoxy(4,35);printf ("Precione S para continuar la misma categoria....  ");
  scanf("%s",&res);fflush(stdin);
 }while(res=='S' || res=='s');//si el caracter ingresado es S repite el juego
 gotoxy(4,37);printf ("Precione N para cambiar de categoria....  ");
 scanf("%s",&res1);
 if(res1!='N' || res1!='n'){// si el caracter ingresado es N cambia de categoria
  menu();
 }
 else{
  printf("\n Gracias por usar nuestro programa......");
 }
 
}
/*funcion que muestra el rotulo en donde menciona el numero 
 de oportunidades que quedan*/
void rotulo(int e){
 int f=0;
 f=6-e;
 gotoxy (40,3); printf(" _____________________________");
 gotoxy (40,4); printf("|                             |");
 gotoxy (40,5); printf("|    Usted tiene   %d          |",f);
 gotoxy (40,6); printf("|    Oportunidades            |");
 gotoxy (40,7); printf("|_____________________________|");
}
//Funcion que imprime la  mano derecha
void made( void){
 int j;
 for(j=0;j<3;j++){
  gotoxy(19-j,10+j);
  printf("*");
 }
}
//Funcion que imprime la  mano izquierda
void maiz(void){
 int i;
 for(i=0;i<3;i++) {
  gotoxy(23-i,12-i);
  printf("*");
 }
}
// funcion que imprime el cuerpo
void cuerpo(){
 int i;
 for(i=0;i<9;i++) {
  gotoxy(20,9+i);
  printf("*");
 }
}
//funcion que imprime  la horca
void base(){
 int x,y; 
    system("mode 80");     
 for(x=2;x<=27;x++){
  gotoxy(10,x);printf("*");
 }
 for(y=11;y<=20;y++){
  gotoxy(y,2);printf("*");
 }
 for(y=5;y<=15;y++){
  gotoxy(y,28);printf("*");
 } 
 gotoxy(20,3);printf("*");
 gotoxy(20,4);printf("*");
 }
//Funcion que imprime la pierna izquierda
void pieizq(void){
 int i;
 for(i=0;i<3;i++) {
  gotoxy(21+i,18+i);
  printf("*");
 }
}
//Funcion que imprime la pierna derecha
void pieder(void){
 int i;
 for(i=0;i<3;i++) {
  gotoxy(19-i,18+i);
  printf("*");
 }
}
//Funcion que imprime la cabeza
void cabeza(){
 int i,j;
 for(i=0;i<5;i++){
  gotoxy(18+i,4);
  printf("*");
  gotoxy(18+i,8);
  printf("*");
 } gotoxy(19,5);
 ////////////////////
 for(j=0;j<3;j++){
  gotoxy(18,5+j);
  printf("*");
  gotoxy(22,5+j);
  printf("*");
 }
}
// funcio goto x y
void gotoxy(short x, short y) {
 HANDLE hConsoleOutput;
 COORD Cursor_Pos = {x, y};
 hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE);
 SetConsoleCursorPosition(hConsoleOutput, Cursor_Pos);
}
puedes descargar el proyecto desde aquí.

4 comentarios :

  1. Respuestas
    1. Muchas gracias, espero que te haya sido de gran ayuda este post

      Eliminar
  2. me podrias explicar como hacerlo solo con las siguientes funciones:
    stdio.h
    stdlib.h
    time.h
    math.h
    por favor.

    ResponderEliminar
  3. nesesito ayuda para hacer esto Se digitará una frase, la cual deberá ser adivinada, letra a letra por el contrincante. Al momento de digitar la
    frase debe aparecer asteriscos en la pantalla de tal forma que nadie sepa qué se ha escrito.
    Se le permitirá fallar 60% de la cantidad de consonantes sin repetición + la mitad de las vocales sin repetición
    que contenga la frase a analizar. Ej. Frase: Algoritmos Fundamentales. 5 vocales (2.5 oportunidades) más 9
    consonantes (9 * 0.6 = 5.4 oportunidades). Por tanto, pueden fallar en 7.9 letras. Es decir, 8 oportunidades de
    fallar.
    Se premiará la racha del jugador acumulando los premios que ha conseguido durante cada letra adivinada en la
    racha. Esto es cada letra consecutiva adivinada valdrá la sumatoria de las adivinadas anteriormente más el valor
    de la letra adivinada en ese momento. En el momento que él falle, el valor agregado por la racha se hace igual
    a cero. El jugador se mantendrá jugando hasta que lo desee, pudiendo presionar ESC para salir en cualquier
    parte del juego.
    Cada vez que el jugador haga una jugada se le presentará:
    ❖ Dibujo palo, soga y cada parte del muñeco ahorcado proporcional a las oportunidades de fallo.
    ❖ Las letras adivinadas hasta el momento mostrando un asterisco en las letras que aun no han sido
    adivinadas
    ❖ Tiempo transcurrido.
    ❖ Cantidad que gana.
    ❖ Cantidad acumulada. Lo que había ganado hasta el momento más lo que ganó en esa jugada.
    ❖ La cantidad acumulada en la racha.
    El valor de las letras:
    ❖ AEIOCS: $20.00
    ❖ UDLPR: $25.00
    ❖ BTFMN: $30.00
    ❖ GHJQV: $35.00
    ❖ KWXYZ: $40.0

    ResponderEliminar