Ver Mensaje Individual
  #1 (permalink)  
Antiguo 16/11/2015, 13:20
aguml
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
problema con juego de palabras

Hola amigos, he estado trasteando un poco porque vi en el movil un juego muy chulo que te muestra una palabra de 4 letras desordenada y tienes que adivinarla y al hacerlo usa esas letras para una palabra nueva que tienes que adivinar pero esta con 5 letras y te muestra la nueva letra y los huecos y asi hasta nueve letras. Lo he estado meditando mucho la forma de afrontar esto para hacerlo yo en C y aprender un poco y despues de mucho marearme conseguí esto:
Código C++:
Ver original
  1. /******************************************************************************
  2. * Este juego busca una palabra de 4 letras, te la muestra desordenada y te    *
  3. * pide que la adivines.                                                       *
  4. * Una vez que la adivines busca una palabra en otro archivo que tenga una     *
  5. * letra mas y que contenga todas las letras de la anterior.                   *
  6. * El juego sigue igual hasta que adivines la palabra de 9 caracteres y en ese *
  7. * momento empieza de nuevo con otra palabra de 4 que escogera al azar del     *
  8. * archivo.                                                                    *
  9. *******************************************************************************/
  10.  
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #include <string.h>
  14.  
  15. #define MIN_LEVEL 4
  16. #define MAX_LEVEL 9
  17. #define SIZE 10
  18. //-----------------------------------------------------------------------------
  19.  
  20. int SearchFirstWord(char *word);
  21. int SearchNextWord(char *word,int length,char *siguiente,int *posCharExtra);
  22. int ShowFirst(char *word);
  23. void ShowMask(char *word,int length,int posCharExtra);
  24. void RandomCharsOfWord(char *word,char *result,int length);
  25. //-----------------------------------------------------------------------------
  26.  
  27. int main ()
  28. {
  29.    char palabra[SIZE];
  30.    char entrada[SIZE];
  31.    int posCaracterExtra;
  32.    int largo;
  33.  
  34.    srand(time(NULL));
  35.    SearchFirstWord(palabra);
  36.    ShowFirst(palabra);
  37.    largo=strlen(palabra);
  38.  
  39.    while(largo <= MAX_LEVEL){
  40.       printf("Adivina la palabra: ");
  41.       scanf("%s",entrada);
  42.       if(strcmp(entrada,"0")==0)
  43.          break;
  44.       if(strcmp(palabra,entrada) !=0){
  45.          printf("Nooop\n");
  46.       }else{
  47.          printf("Correcto!\n");
  48.          if(largo==MAX_LEVEL){
  49.             system("PAUSE");
  50.             system("CLS");
  51.             largo=MIN_LEVEL;
  52.             if(SearchFirstWord(palabra)==1){
  53.                ShowFirst(palabra);
  54.             }else{
  55.                printf("Huvo un error al obtener la siguiente palabra. El programa finalizara.\n");
  56.                break;
  57.             }
  58.          }else{
  59.             if(SearchNextWord(palabra,largo,palabra,&posCaracterExtra)==1){
  60.                largo++;
  61.                printf("La siguiente es: ");
  62.                ShowMask(palabra,largo,posCaracterExtra);
  63.             }else{
  64.                printf("Huvo un error al obtener la siguiente palabra. El programa finalizara.\n");
  65.                break;
  66.             }
  67.          }
  68.       }
  69.    }
  70.    return 0;
  71. }
  72. //-----------------------------------------------------------------------------
  73.  
  74. int ShowFirst(char *word)
  75. {
  76.    char cadena[MIN_LEVEL+1];
  77.  
  78.    printf("Juega a 'Adivina la palabra'\n");
  79.    printf("Introduce '0' y pulsa intro para salir del juego en cualquier momento.\n");
  80.    printf("======================================================================\n\n");
  81.  
  82.    do{
  83.       RandomCharsOfWord(word,cadena,MIN_LEVEL);
  84.    }while(strcmp(cadena,word)==0);
  85.  
  86.    printf ("La palabra desordenada es: %s\n",cadena);
  87.    return 0;
  88. }
  89. //-----------------------------------------------------------------------------
  90.  
  91. void ShowMask(char *word,int length,int posCharExtra)
  92. {
  93.    int i;
  94.    for(i=0;i<length;i++)
  95.       if(i==posCharExtra)
  96.          printf("%c ",word[i]);
  97.       else
  98.          printf("_ ");
  99.    printf("\n");
  100. }
  101. //-----------------------------------------------------------------------------
  102.  
  103. void RandomCharsOfWord(char *word,char *result,int length)
  104. {
  105.    int a,i,posRand;
  106.    char aux;
  107.  
  108.    strcpy(result,word);
  109.    for(a=0;a<length;a++){
  110.       for(i=0;i<length-(1+a);i++){
  111.          posRand=rand()%length;
  112.          aux=result[i];
  113.          result[i]=result[posRand];
  114.          result[posRand]=aux;
  115.       }
  116.    }
  117. }
  118. //-----------------------------------------------------------------------------
  119.  
  120. int SearchNextWord(char *word,int length,char *siguiente,int *posCharExtra)
  121. {
  122.    char cadena[SIZE],salida[SIZE];
  123.    char nameFile[13]={0};
  124.    char aux;
  125.    int a,i,contador,retval;
  126.    FILE *archivo;
  127.  
  128.    sprintf(nameFile,"%i_Letras.txt",length+1);
  129.    archivo=fopen(nameFile,"r");
  130.  
  131.    if(archivo != NULL){
  132.       do{
  133.          retval=fread(cadena,SIZE,1,archivo);
  134.          strcpy(salida,cadena);
  135.          contador=length;
  136.          for(a=0;a<length;a++){
  137.             for(i=0;i<=contador;i++){
  138.                if(word[a]==cadena[i])
  139.                {
  140.                   aux=cadena[i];
  141.                   cadena[i]=cadena[contador];
  142.                   cadena[contador]=aux;
  143.                   contador--;
  144.                   break;
  145.                }
  146.             }
  147.          }
  148.          if(contador==0){
  149.             strcpy(siguiente,salida);
  150.             *posCharExtra=(int)strchr(siguiente,cadena[0])-(int)siguiente;
  151.             retval=1;
  152.          }
  153.       }while(contador !=0 && !feof(archivo));
  154.       fclose(archivo);
  155.    }else{
  156.       retval=-1;
  157.    }
  158.    return retval;
  159. }
  160. //-----------------------------------------------------------------------------
  161.  
  162. int SearchFirstWord(char *word)
  163. {
  164.    int retval,nPalabras,posPalabra;
  165.    FILE *archivo;
  166.    char nameFile[13]={0};
  167.    char palabra[SIZE];
  168.  
  169.    sprintf(nameFile,"%i_Letras.txt",MIN_LEVEL);
  170.    archivo=fopen(nameFile,"r");
  171.    if(archivo != NULL){
  172.       fseek(archivo,0,SEEK_END);
  173.       nPalabras=ftell(archivo)/SIZE;
  174.       posPalabra=rand()%nPalabras;
  175.       fseek(archivo,posPalabra*SIZE,SEEK_SET);
  176.       retval=fread(palabra,SIZE,1,archivo);
  177.       if(retval==1)
  178.          strcpy(word,palabra);
  179.       fclose(archivo);
  180.    }else{
  181.       retval=-1;
  182.    }
  183.    return retval;
  184. }
  185. //-----------------------------------------------------------------------------

El juego funciona aunque hay cosas que no las controlo porque aun no lo tengo del todo controlado y estoy haciendo pruebas pero funcionar funciona.
El problema que tengo es que a veces se da el caso de que no encuentra una palabra que contenga todas las letras de la anterior pero con una letra mas, no se si me explico. Cuando eso pasa el juego se acaba porque yo hago que sea asi pero me gustaria que eso no pasara y que siempre encontrara una valida para cada tamaño de palabra. La unica manera que se me ocurre es rellenar un array con todas las palabras que usará en la mano actual y asegurarme que se obtienen todas pero no se me ocurre un modo eficiente de conseguirlo. ¿alguien puede ayudarme?
Edito: Lo he estado pensando y creo que la manera más eficiente es ir desde las más largas a las más cortas comprobando que haya alguna palabra que sirva para ella y si no es asi desecharlo del archivo y luego hacer lo mismo pero empezando desde la más corta a la más larga y así me aseguro que todas las que hayan sean válidas.

Última edición por aguml; 16/11/2015 a las 16:36