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

Bueno creo que lo mas eficiente es crear listas de palabras que sean todas validas y en eso me hallo y he creado este codigo para quitar todas las que no valgan:
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=MIN_LEVEL;
  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 < MAX_LEVEL);
  47.  
  48.    
  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.    char aux;
  82.    int a,i,contador,retval;
  83.    FILE *archivo;
  84.  
  85.    sprintf(nameFile,"%i_Letras.txt",length+1);
  86.    archivo=fopen(nameFile,"r");
  87.  
  88.    if(archivo != NULL){
  89.       fseek(archivo,pos,SEEK_SET);
  90.       do{
  91.          retval=fread(cadena,SIZE,1,archivo);
  92.          strncpy(salida,cadena,SIZE);
  93.          contador=length;
  94.          for(a=0;a<length;a++){
  95.             for(i=0;i<=contador;i++){
  96.                if(word[a]==cadena[i])
  97.                {
  98.                   aux=cadena[i];
  99.                   cadena[i]=cadena[contador];
  100.                   cadena[contador]=aux;
  101.                   contador--;
  102.                   break;
  103.                }
  104.             }
  105.          }
  106.          if(contador==0){
  107.             memset(siguiente,'\0',SIZE);
  108.             strncpy(siguiente,salida,SIZE);
  109.             retval=ftell(archivo);
  110.          }else{
  111.             retval=-1;
  112.          }
  113.       }while(contador !=0 && !feof(archivo));
  114.       fclose(archivo);
  115.    }else{
  116.       retval=-2;
  117.    }
  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.    char aux;
  127.    int a,i,contador,retval;
  128.    FILE *archivo;
  129.  
  130.    sprintf(nameFile,"%i_Letras.txt",length-1);
  131.    archivo=fopen(nameFile,"r");
  132.  
  133.    if(archivo != NULL){
  134.       fseek(archivo,pos,SEEK_SET);
  135.       do{
  136.          retval=fread(cadena,SIZE,1,archivo);
  137.          strncpy(salida,cadena,10);
  138.          contador=length-1;
  139.          for(a=0;a<length;a++){
  140.             for(i=0;i<contador;i++){
  141.                if(word[a]==cadena[i])
  142.                {
  143.                   aux=cadena[i];
  144.                   cadena[i]=cadena[contador-1];
  145.                   cadena[contador-1]=aux;
  146.                   contador--;
  147.                   break;
  148.                }
  149.             }
  150.          }
  151.          if(contador==0){
  152.             memset(anterior,'\0',SIZE);
  153.             strncpy(anterior,salida,SIZE);
  154.             retval=ftell(archivo);
  155.          }else{
  156.             retval=-1;
  157.          }
  158.       }while(contador !=0 && !feof(archivo));
  159.       fclose(archivo);
  160.    }else{
  161.       retval=-2;
  162.    }
  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],siguiente[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,siguiente,pos);
  184.                if(pos > -1){
  185.                   if(SearchRepe(salida,siguiente)==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.             }
  195.          }while(!feof(archivo));
  196.          fclose(salida);
  197.       }else{
  198.          encontrada=-2;
  199.       }
  200.       fclose(archivo);
  201.    }else{
  202.       encontrada=-1;
  203.    }
  204.    return encontrada;
  205. }
  206.  
  207. int DelInvalidWordsAsc(char *nameFile,int size,int *nEliminadas)
  208. {
  209.    int encontrada,nPalabras,posPalabra,pos=0;
  210.    FILE *archivo,*salida;
  211.    char palabra[SIZE],siguiente[SIZE],pathSalida[25];
  212.  
  213.    *nEliminadas=0;
  214.    archivo=fopen(nameFile,"r");
  215.    if(archivo != NULL){
  216.       sprintf(pathSalida,"%i_Letras_res.txt",size);
  217.       salida=fopen(pathSalida,"w+");
  218.  
  219.       if(salida != NULL){
  220.          do{
  221.             encontrada=fread(palabra,SIZE,1,archivo);
  222.             if(encontrada==1){
  223.                pos=SearchNextWord(palabra,size,siguiente,pos);
  224.                if(pos > -1){
  225.                   if(SearchRepe(salida,siguiente)==0){
  226.                      fwrite(palabra,sizeof(palabra),1,salida);
  227.                   }
  228.                }else if(pos==-2){
  229.                   encontrada=-3;
  230.                   break;
  231.                }else{
  232.                   *nEliminadas +=1;
  233.                }
  234.             }
  235.          }while(!feof(archivo));
  236.          fclose(salida);
  237.       }else{
  238.          encontrada=-2;
  239.       }
  240.       fclose(archivo);
  241.    }else{
  242.       encontrada=-1;
  243.    }
  244.    return encontrada;
  245. }
  246. //-----------------------------------------------------------------------------
  247.  
  248. int SearchRepe(FILE *archivo,char *palabra)
  249. {
  250.    int encontrada=0,retval;
  251.    char leida[SIZE];
  252.  
  253.    fseek(archivo,0,SEEK_SET);
  254.    do{
  255.       retval=fread(leida,sizeof(leida),1,archivo);
  256.       if(retval==1 && strcmp(leida,palabra)==0){
  257.          encontrada=1;
  258.          break;
  259.       }
  260.    }while(!feof(archivo) && encontrada==0);
  261.    fseek(archivo,0,SEEK_END);
  262.    return encontrada;
  263. }
La verdad es que si creo los archivos y a su archivo correspondiente le meto una cadena que se que valdrá funciona mi codigo aunque tengo que ir ejecutandolo varias veces hasta obtener que no se borro nada de ningun archivo.
Por ejemplo:
abcd
abcde
abcdef
abcdefg
abcdefgh
abcdefghi

Si pongo cada una de estas en su correspondiente archivo me borra todas las que no se puedan combinar pero estas no las borra porque si que se pueden combinar pero si no meto estas cadenas acaba borrandome todo o casi todo y algunos archivos acaban vacios pero sin embargo al jugar en el juego veo que hay combinaciones validas asi que no deberia borrarlas pero no se que hago mal.