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í.

No hay comentarios :

Publicar un comentario en la entrada