programa en c sobre el ahorcado

Dudas sobre el C/C++ en general
Responder
Mensaje
Autor
ian-claudio
Mensajes: 1
Registrado: 05/11/2019 5:44 pm

programa en c sobre el ahorcado

#1 Mensaje por ian-claudio » 05/11/2019 5:47 pm

hola buenas tengo un problema con un programa en C sobre el ahorcado, el cual me compila pero al abrirlo no corre nada, lo dejare aca para que puedan identificar mi error y hacermelo saber, gracias de antemano.

Código: Seleccionar todo

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#include"dibujos.h"


//Funciones

void palabras();
void juego(char palabra[50][20], int n);
void oportunidades(int e);
void PiernaDerecha();
void BrazoDerecho();
void BrazoIzquierdo();
void Tronco();
void Cabeza();
void SinAhorcado();

 void palabras(){

char palabras[50][20]={"arbol","rey","perro","lluvia","gato","avion","mano","plato","argentina","vehiculo","cohete","helicoptero","primavera","invierno","soledad","hidraulica","electronica","electrostatica","esdrujula","hipopotamo","probiotico","antibioticos"};
int n=0, i;
 char op;
 fflush(stdin);
}
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");
    printf("\n                               JUEGO DEL AHORCADO");
    printf("\n                               ==================");
  oportunidades(0);
  longitud=rand()%(m+n);
  e=0;
  contador=0;
  strcpy(palabras,palabra[longitud]);
  longitud=strlen(palabras);
  for (i=0; i<longitud ; i++){fflush(stdin);
   respuesta[i]='-';
   printf (" %c ", respuesta[i]);
  }

  do{
   fflush (stdin);
   printf ("Ingrese una letra: ");
   scanf ("%c", &letra);
   letra=tolower(letra);
   printf("     ");
   error=0;

   for(j=0; j<longitud; j++)  {
    if (letra==palabras[j]){
     if(letra!=respuesta[j]){
      respuesta[j]=letra;
      contador++;
     }
    }
    else{
     error++;
    }
    printf (" %c ", respuesta[j]);
   }
   if(error==longitud){
    e++;
   }
   oportunidades(e);
     switch (e){//segun el numero de errores selecciona un caso
      case 0:SinAhorcado();break;
      case 1:Cabeza();break;
      case 2:Tronco();break;
      case 3:BrazoDerecho();break;
      case 4:BrazoIzquierdo();break;
      case 5:PiernaIzquierda();break;
      case 6:PiernaDerecha();break;
     }
  }while(contador<longitud && e<6);

  if(e==6){//entra si ninguna de las letras corresponden a la palabra o se cometieron 6 errores
    printf("\n");
    printf("\n           XXXXX XXXXX XXXXX XXXX  XXXXX  XXXX XXXXX XXXXX  X  X  X ");
    printf("\n           X   X X     X   X X   X   X   X       X   X      X  X  X ");
    printf("\n           XXXXX XXX   XXXX  X   X   X   XXXXX   X   XXX    X  X  X ");
    printf("\n           X     X     X XX  X   X   X       X   X   X              ");
    printf("\n           X     XXXXX X   X XXXX  XXXXX XXXX    X   XXXXX  X  X  X ");
    printf("\n\nPresione una tecla para ver la palabra secreta");
   for(j=0; j<longitud; j++){
    printf (" %c ", palabras[j]);
   }
  }
  if(contador==longitud){

   if(e==0){//si no se cometio ningun error
                 printf("\n");
                 printf("\n              XXXXX XXXXX X   X XXXXX XXXXX XXXXX XXXXX  X  X  X ");
                 printf("\n              X     X   X XX  X X   X X       X   X      X  X  X ");
                 printf("\n              X  XX XXXXX X X X XXXXX XXXXX   X   XXX    X  X  X ");
                 printf("\n              X   X X   X X  XX X   X     X   X   X              ");
                 printf("\n              XXXXX X   X X   X X   X XXXXX   X   XXXXX  X  X  X ");
   }
   else{//si se cometieron pocos errores
    printf("\n");
                     printf("\n              XXXXX XXXXX X   X XXXXX XXXXX XXXXX XXXXX  X  X  X ");
                     printf("\n              X     X   X XX  X X   X X       X   X      X  X  X ");
                     printf("\n              X  XX XXXXX X X X XXXXX XXXXX   X   XXX    X  X  X ");
                     printf("\n              X   X X   X X  XX X   X     X   X   X              ");
                     printf("\n              XXXXX X   X X   X X   X XXXXX   X   XXXXX  X  X  X ");
                     printf("\n              ---------------------------------------------------");
                     printf("\n              Con %d intentos fallidos", e);
   }
  }
fflush(stdin);
  printf ("\n\n\n\n\n\n\n\n\n\n\n\nDesea continuar en la misma categoria S/N....  ");
  scanf("%s",&res);fflush(stdin);
 }while(res=='S' || res=='s');
 printf ("\nDesea volver a jugar S/N....  ");
 scanf("%s",&res);
 if(res=='S' || res=='s'){

  }
  else{
  printf("\n Gracias por jugar al ahorcado......");
 }
}

void oportunidades(int e){
 int f=0;
 f=6-e;
  printf("|    Usted tiene   %d          |",f);
  printf("|    Oportunidades            |");
}
Última edición por mollok el 05/11/2019 10:00 pm, editado 1 vez en total.
Razón: Los códigos deben ir entre etiquetas 'code', botón </>

dehm
Mensajes: 329
Registrado: 29/04/2011 7:31 am

Re: programa en c sobre el ahorcado

#2 Mensaje por dehm » 07/11/2019 12:59 am

Faltan cosas ahí.
Además no hay un main() en ese código.
Aprendiendo

Avatar de Usuario
kiko66
Mensajes: 44
Registrado: 11/10/2019 10:51 am

Re: programa en c sobre el ahorcado

#3 Mensaje por kiko66 » 23/12/2019 5:11 pm

hola ian

no se si has puesto todo el codigo, aunque creo que estas empezando el programa
y esto es lo que llevas hasta que enviaste el mensaje

el rand no veo donde lo inicializas con lo que siempre te sacara las mismas palabras,
y dibujos.h no se que hace pero supongo que sacara el ahorcado
evidentemente le faltan varias funciones pero ya se haran poco a poco

bueno, empece retocar el programa y añadir funciones que le faltaban y acabe
haciendolo a mi manera, bueno si has acabado el programa podrias pasalo por aqui
para echarle un vistazo y jugar unas partiditas ;-)

Código: Seleccionar todo

#include <stdio.h>   // printf scanf
#include <stdlib.h>  // srand rand
#include <string.h>  // strcpy strcmp strlen tolower
#include <ctype.h>   // system
#include <time.h>    // time
#include <unistd.h>  // varias constantes
#include <fcntl.h>   // fcntl
//------------------------------------------------------------------------------ definiciones
#define ACABADO_NORMAL_DEL_PROGRAMA 0     // cuando acaba normalmente devuelve un cero
#define MAXERR 6        // numero max de errores
#define LIMPIA "clear"  // para linux "clear", para windows "cls"
#define FINAL "x"       // centinela, marca ultimo string
#define SALIR 's'       // para salir del juego pulsar una s
//------------------------------------------------------------------------------ enumeraciones
enum  booleano {no, si};
// ------------------------------------------------------------------------------// 
// vacia bufer de teclado ---------------de poesia binaria-----------------------//
// https://poesiabinaria.net/2009/05/buffer-de-teclado-en-linux/
// -----------------------------------------------------------------------------vacia el bufer
void vacia_bufer(void){

   int fdflags;
   fdflags = fcntl(STDIN_FILENO, F_GETFL, 0);
   fcntl(STDIN_FILENO, F_SETFL, fdflags | O_NONBLOCK);
   while (getchar()!=EOF);
   fcntl(STDIN_FILENO, F_SETFL, fdflags);
}
// escoge una palabra del diccionario ------------------------------------------elige secreto
const char* elige_secreto(void){

   const char* diccionario[]={      // añadir mas palabras 
      "arbol",      "rey",         "perro",          "lluvia",    "gato",
      "avion",      "mano",        "plato",          "argentina", "vehiculo",
      "cohete",     "helicoptero", "primavera",      "invierno",  "soledad",
      "hidraulica", "electronica", "electrostatica", "esdrujula", "hipopotamo",
      "probiotico", "antibioticos", FINAL
   };       

   int cnt_palabras;
   while (strcmp(FINAL, diccionario[cnt_palabras])) 
      cnt_palabras++;           // cuento las palabras

   srand(time(NULL));           // inicializa el generador de aleatorios

   return diccionario[rand()%cnt_palabras-1];
}
// visualiza los datos y al ahorcado -------------------------------------------------presenta el tablero
void presenta_tablero(int n_er){

   const char* d[]={"         ",    //
                    " o       ",    // visualiza al ahorcado segun los errores
                    " o  |    ",    //
                    " o /|    ",    // conforme aumentan los errores 
                    " o /|\\   ",   // aumenta el dibujo del ahorcado
                    " o /|\\/  ",   //
                    " o /|\\/ \\"   //
                     };
   system(LIMPIA);

   printf("\n\t   \t\t        JUEGO DEL AHORCADO"
         "\n\t%c%c%c\t\t        =================="
         "\n\t%c%c%c\t\t|        Usted tiene %d         |"
         "\n\t%c%c%c\t\t|        Oportunidad%s         |",          
         
         d[n_er][0],d[n_er][1],d[n_er][2], 
         d[n_er][3],d[n_er][4],d[n_er][5], MAXERR-n_er,
         d[n_er][6],d[n_er][7],d[n_er][8], MAXERR-n_er==1 ? "  ":"es");
}

//------------------------------------------------------------------------------------letras erroneas
void ver_letras_erroneas(char* val_erroneros){
   puts("\n");
   printf("\n\n\t\t\tlista de letras  erroneas: %s", val_erroneros);
}
//------------------------------------------------------------------------------------letras acertadas
void ver_letras_acertadas(char* respuesta){

   printf("\n\n\t\t\tlista de letras acertadas: %s",respuesta);
}//------------------------------------------------------------------------------------fin del ahorcado
void ver_ganaste(void){

   printf("\n\n\n\t\t\t    ----------------------"
            "  \n\t\t\t    ----- has ganado -----"
            "  \n\t\t\t    ----------------------");
}

void ver_perdiste(const char* secreto){
   printf(" \n\n\n\t\t\t    -----------------------"
               "\n\t\t\t    ----- has perdido -----"
               "\n\t\t\t    -----------------------"
               "\n\t\t\t    la palabra secreta es: "
               "\n\t\t\t    -----------------------"
               "\n\t\t\t    %s"
               "\n\t\t\t    -----------------------", secreto);   
}
//------------------------------------------------------------------------------------nuevo acierto
int nuevo_acierto(const char letra, const char secreto[], char resp[], int* repe){

   int n_aciertos=0;
   int long_secreto=strlen(secreto);

   *repe=no;
   for(int i=0; i<long_secreto; i++){
      if(secreto[i]==letra){
         if(resp[i]!=letra){
            resp[i]=letra;
            n_aciertos++;
         }
         else{ 
            *repe=si;
            break;
   }  }  }

   return n_aciertos;
}
//------------------------------------------------------------------------------------nuevo error
int nuevo_error(char letra, char resp_erroneas[]){

   int n_errores=0;
   int repe=0;
   int indice=0;

   for(; indice<MAXERR ;indice++)
      if(resp_erroneas[indice]=='-') break;
      else if(resp_erroneas[indice]==letra) { repe++; break; }
   if(!repe){ 
      resp_erroneas[indice]=letra;
      n_errores++;      
   }

   return n_errores;
}
//------------------------------------------------------------------------------------pide letra
char pide_letra(void){  // la entrada por teclado de c es pesima por el tema del bufer

   int caracter;
   unsigned char correcto;
   enum booleano buscar=si;
   
   printf("\n\n\t\t   Introduce una letra minuscula si acentos: ");
   
   do{
      caracter=tolower(getchar());
      vacia_bufer();
      if(buscar && isalpha(caracter)){
         correcto=caracter;
         buscar=no; 
      } 
   }while(buscar);
   
   return correcto;
}
//================================================================================main
int main(void){

   do{
      
      // declaro e inicializo variables
      const char* secreto=elige_secreto();   // elijo un secreto al azar
      int  long_secreto=strlen(secreto);     // guardo la longitud del  secreto
      char respuesta[long_secreto];          // letras que va acertando
      for(int i=0; i<long_secreto ;i++)      // al empezar no hay letras acertadas
         respuesta[i]='-';                   // relleno con guiones
      char resp_erroneas[MAXERR];            // letras que va fallando, 
      for(int i=0; i<MAXERR ;i++)            // en principio no ha fallado
         resp_erroneas[i]='-';               // relleno con guiones                                             
      int cnt_errores=0;                     // cuenta los errores cometidos
      int cnt_aciertos=0;                    // cuenta los aciertos
      char letra_elegida;                    // letra a contrastar con el secreto

      do{
         presenta_tablero(cnt_errores);
         ver_letras_erroneas(resp_erroneas);
         ver_letras_acertadas(respuesta);
         letra_elegida=pide_letra();
         
         int repetida;
         int aciertos=nuevo_acierto(letra_elegida, secreto, respuesta, &repetida);
         cnt_aciertos+=aciertos;
         if(!aciertos && !repetida) 
            cnt_errores+=nuevo_error(letra_elegida, resp_erroneas);
            
      }while(cnt_aciertos<long_secreto && cnt_errores<MAXERR);

      presenta_tablero(cnt_errores);
      ver_letras_erroneas(resp_erroneas);
      ver_letras_acertadas(respuesta);
      if(cnt_aciertos==long_secreto) ver_ganaste();
      else ver_perdiste(secreto);
      
      getchar();
      vacia_bufer();

      printf("\n\n\t\t   para salir del juego pulsa 's' "
            "\n\n\t\t   cualquier otra letra para volver a jugar");

   }while(SALIR!=pide_letra());              // para salir del juego  s ó S 

   system(LIMPIA);

   return ACABADO_NORMAL_DEL_PROGRAMA;
}
saludos
para cuando el resaltado de codigo :?:

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: Davinhog, Derikjeow, KevenRop, Ramontob y 4 invitados