Ver Mensaje Individual
  #8 (permalink)  
Antiguo 18/11/2015, 14:26
aguml
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 10 meses
Puntos: 3
Respuesta: problema con juego de palabras

Bueno, ya di con la tecla para borrar las palabras que no sirven. Quedó asi:
Código C++:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define MIN_LEVEL 4
  6. #define MAX_LEVEL 9
  7. #define SIZE 10
  8. //-----------------------------------------------------------------------------
  9.  
  10. int DelInvalidWordsDesc(char *nameFile,int size,int *nEliminadas);
  11. int DelInvalidWordsAsc(char *nameFile,int size,int *nEliminadas);
  12. int SearchBackWord(char *word,int length,char *anterior,int pos);
  13. int SearchNextWord(char *word,int length,char *siguiente,int pos);
  14. int SearchRepe(FILE *archivo,char *palabra);
  15.  
  16. int main(int argc, char* argv[])
  17. {
  18.    int retval,palabrasDesechadas;
  19.    int contador=MAX_LEVEL-1;
  20.    char nameFileOrigen[25],nameFileDestino[25],nameFileSig[25];
  21.  
  22.    //Limpio los archivos de palabras con 4,5,6,7,y 8 letras
  23.    do{
  24.       sprintf(nameFileOrigen,"%i_Letras.txt",contador);
  25.       sprintf(nameFileSig,"%i_Letras.txt",contador+1);
  26.       sprintf(nameFileDestino,"%i_Letras_res.txt",contador);
  27.       retval=DelInvalidWordsAsc(nameFileOrigen,contador,&palabrasDesechadas);
  28.       switch(retval){
  29.          case -3:
  30.             printf("El archivo %s no se pudo limpiar. %s no se pudo abrir.",nameFileOrigen,nameFileSig);
  31.             remove(nameFileDestino);
  32.          break;
  33.          case -2:
  34.             printf("El archivo %s no se pudo limpiar. %s no se pudo crear.",nameFileOrigen,nameFileDestino);
  35.          break;
  36.          case -1:
  37.             printf("%s no se pudo limpiar porque no pudo abrirse.\n",nameFileOrigen);
  38.          break;
  39.          case 0:
  40.             printf("%s se pudo limpiar. %s creado exitosamente. Se eliminaron %i palabras.\n",nameFileOrigen,nameFileDestino,palabrasDesechadas);
  41.             remove(nameFileOrigen);
  42.             rename(nameFileDestino,nameFileOrigen);
  43.          break;
  44.       }
  45.       contador--;
  46.    }while(contador >= MIN_LEVEL);
  47.  
  48.    contador=MAX_LEVEL;
  49.    //Limpio el archivo de palabras de 9 letras
  50.  
  51.    sprintf(nameFileOrigen,"%i_Letras.txt",contador);
  52.    sprintf(nameFileSig,"%i_Letras.txt",contador-1);
  53.    sprintf(nameFileDestino,"%i_Letras_res.txt",contador);
  54.    retval=DelInvalidWordsDesc(nameFileOrigen,MAX_LEVEL,&palabrasDesechadas);
  55.    switch(retval){
  56.       case -3:
  57.          printf("El archivo %s no se pudo limpiar. %s no se pudo abrir.",nameFileOrigen,nameFileSig);
  58.          remove(nameFileDestino);
  59.       break;
  60.       case -2:
  61.          printf("El archivo %s no se pudo limpiar. %s no se pudo crear.",nameFileOrigen,nameFileDestino);
  62.       break;
  63.       case -1:
  64.          printf("%s no se pudo limpiar porque no pudo abrirse.\n",nameFileOrigen);
  65.       break;
  66.       case 0:
  67.          printf("%s se pudo limpiar. %s creado exitosamente. Se eliminaron %i palabras.\n",nameFileOrigen,nameFileDestino,palabrasDesechadas);
  68.          remove(nameFileOrigen);
  69.          rename(nameFileDestino,nameFileOrigen);
  70.       break;
  71.    }
  72.    system("PAUSE");
  73.    return 0;
  74. }
  75. //---------------------------------------------------------------------------
  76.  
  77. int SearchNextWord(char *word,int length,char *siguiente,int pos)
  78. {
  79.    char cadena[SIZE],salida[SIZE];
  80.    char nameFile[13]={0};
  81.    int a,i,largoCadena,retval;
  82.    FILE *archivo;
  83.  
  84.    sprintf(nameFile,"%i_Letras.txt",length+1);
  85.    archivo=fopen(nameFile,"r");
  86.  
  87.    if(archivo != NULL){
  88.       fseek(archivo,pos,SEEK_SET);
  89.       do{
  90.          retval=fread(cadena,SIZE,1,archivo);
  91.          strncpy(salida,cadena,SIZE);
  92.          largoCadena=strlen(cadena);
  93.          for(a=0;a<length;a++){
  94.             for(i=0;i<largoCadena;i++){
  95.                if(word[a]==cadena[i])
  96.                {
  97.                   cadena[i]=cadena[largoCadena-1];
  98.                   cadena[largoCadena-1]='\0';
  99.                   largoCadena--;
  100.                   break;
  101.                }
  102.             }
  103.          }
  104.          if(largoCadena==1){
  105.             memset(siguiente,'\0',SIZE);
  106.             strncpy(siguiente,salida,SIZE);
  107.             retval=ftell(archivo);
  108.          }else{
  109.             retval=-1;
  110.          }
  111.       }while(largoCadena > 1 && !feof(archivo));
  112.       fclose(archivo);
  113.    }else{
  114.       retval=-2;
  115.    }
  116.    if(retval < 0)
  117.       memset(siguiente,'\0',SIZE);
  118.    return retval;
  119. }
  120. //-----------------------------------------------------------------------------
  121.  
  122. int SearchBackWord(char *word,int length,char *anterior,int pos)
  123. {
  124.    char cadena[SIZE],salida[SIZE];
  125.    char nameFile[13]={0};
  126.    int a,i,largoCadena,retval;
  127.    FILE *archivo;
  128.  
  129.    sprintf(nameFile,"%i_Letras.txt",length-1);
  130.    archivo=fopen(nameFile,"r");
  131.  
  132.    if(archivo != NULL){
  133.       fseek(archivo,pos,SEEK_SET);
  134.       do{
  135.          retval=fread(cadena,SIZE,1,archivo);
  136.          strncpy(salida,cadena,10);
  137.          largoCadena=strlen(cadena);
  138.          for(a=0;a<length;a++){
  139.             for(i=0;i<largoCadena;i++){
  140.                if(word[a]==cadena[i])
  141.                {
  142.                   cadena[i]=cadena[largoCadena-1];
  143.                   cadena[largoCadena-1]='\0';
  144.                   largoCadena--;
  145.                   break;
  146.                }
  147.             }
  148.          }
  149.          if(largoCadena==0){
  150.             memset(anterior,'\0',SIZE);
  151.             strncpy(anterior,salida,SIZE);
  152.             retval=ftell(archivo);
  153.          }else{
  154.             retval=-1;
  155.          }
  156.       }while(largoCadena > 0 && !feof(archivo));
  157.       fclose(archivo);
  158.    }else{
  159.       retval=-2;
  160.    }
  161.    if(retval < 0)
  162.       memset(anterior,'\0',SIZE);
  163.    return retval;
  164. }
  165. //-----------------------------------------------------------------------------
  166.  
  167. int DelInvalidWordsDesc(char *nameFile,int size,int *nEliminadas)
  168. {
  169.    int encontrada,nPalabras,posPalabra,pos=0;
  170.    FILE *archivo,*salida;
  171.    char palabra[SIZE],anterior[SIZE],pathSalida[25];
  172.  
  173.    *nEliminadas=0;
  174.    archivo=fopen(nameFile,"r");
  175.    if(archivo != NULL){
  176.       sprintf(pathSalida,"%i_Letras_res.txt",size);
  177.       salida=fopen(pathSalida,"w+");
  178.  
  179.       if(salida != NULL){
  180.          do{
  181.             encontrada=fread(palabra,SIZE,1,archivo);
  182.             if(encontrada==1){
  183.                pos=SearchBackWord(palabra,size,anterior,pos);
  184.                if(pos > -1){
  185.                   if(SearchRepe(salida,anterior)==0){
  186.                      fwrite(palabra,sizeof(palabra),1,salida);
  187.                   }
  188.                }else if(pos==-2){
  189.                   encontrada=-3;
  190.                   break;
  191.                }else{
  192.                   *nEliminadas +=1;
  193.                }
  194.                pos=0;
  195.             }
  196.          }while(!feof(archivo));
  197.          fclose(salida);
  198.       }else{
  199.          encontrada=-2;
  200.       }
  201.       fclose(archivo);
  202.    }else{
  203.       encontrada=-1;
  204.    }
  205.    return encontrada;
  206. }
  207.  
  208. int DelInvalidWordsAsc(char *nameFile,int size,int *nEliminadas)
  209. {
  210.    int encontrada,nPalabras,posPalabra,pos=0;
  211.    FILE *archivo,*salida;
  212.    char palabra[SIZE],siguiente[SIZE],pathSalida[25];
  213.  
  214.    *nEliminadas=0;
  215.    archivo=fopen(nameFile,"r");
  216.    if(archivo != NULL){
  217.       sprintf(pathSalida,"%i_Letras_res.txt",size);
  218.       salida=fopen(pathSalida,"w+");
  219.  
  220.       if(salida != NULL){
  221.          do{
  222.             encontrada=fread(palabra,SIZE,1,archivo);
  223.             if(encontrada==1){
  224.                pos=SearchNextWord(palabra,size,siguiente,pos);
  225.                if(pos > -1){
  226.                   if(SearchRepe(salida,siguiente)==0){
  227.                      fwrite(palabra,sizeof(palabra),1,salida);
  228.                   }
  229.                }else if(pos==-2){
  230.                   encontrada=-3;
  231.                   break;
  232.                }else{
  233.                   *nEliminadas +=1;
  234.                }
  235.                pos=0;
  236.             }
  237.          }while(!feof(archivo));
  238.          fclose(salida);
  239.       }else{
  240.          encontrada=-2;
  241.       }
  242.       fclose(archivo);
  243.    }else{
  244.       encontrada=-1;
  245.    }
  246.    return encontrada;
  247. }
  248. //-----------------------------------------------------------------------------
  249.  
  250. int SearchRepe(FILE *archivo,char *palabra)
  251. {
  252.    int encontrada=0,retval;
  253.    char leida[SIZE];
  254.  
  255.    fseek(archivo,0,SEEK_SET);
  256.    do{
  257.       retval=fread(leida,sizeof(leida),1,archivo);
  258.       if(retval==1 && strcmp(leida,palabra)==0){
  259.          encontrada=1;
  260.          break;
  261.       }
  262.    }while(!feof(archivo) && encontrada==0);
  263.    fseek(archivo,0,SEEK_END);
  264.    return encontrada;
  265. }
Funcionar funciona. Que se pueda mejorar, pues seguro pero este funciona jajaja.
Ahora me quiero liar con el juego para hacerlo como me dijiste sin quitar las palabras que sobran y, aun mas, que busque todas las palabras validas para una palabra y escoja una aleatoriamente y asi hasta completar una combinacion valida. Actualmente coge solo la primera palabra válida y puede haber otras combinaciones y no las uso nunca. Con lo que quiero hacer la cosa mejorará mucho. Supongo que la forma mas correcta es crear una estructura con un puntero para cada lista de palabras validas y con realloc voy reservando memoria para cada palabra encontrada y si una palabra no vale la borro y asi hasta conseguir un listado valido. Aun no tengo muy claro como lo haré pero creo que podré. De todos modos escucho sugerencias.
Cuando tenga el codigo del juego terminado lo pondré aqui.