Código C++:
Ver original
/****************************************************************************** * Este juego busca una palabra de 4 letras, te la muestra desordenada y te * * pide que la adivines. * * Una vez que la adivines busca una palabra en otro archivo que tenga una * * letra mas y que contenga todas las letras de la anterior. * * El juego sigue igual hasta que adivines la palabra de 9 caracteres y en ese * * momento empieza de nuevo con otra palabra de 4 que escogera al azar del * * archivo. * *******************************************************************************/ #include <stdio.h> #include <stdlib.h> #include <string.h> #define MIN_LEVEL 4 #define MAX_LEVEL 9 #define SIZE 10 //----------------------------------------------------------------------------- int SearchFirstWord(char *word); int SearchNextWord(char *word,int length,char *siguiente,int *posCharExtra); int ShowFirst(char *word); void ShowMask(char *word,int length,int posCharExtra); void RandomCharsOfWord(char *word,char *result,int length); //----------------------------------------------------------------------------- int main () { char palabra[SIZE]; char entrada[SIZE]; int posCaracterExtra; int largo; SearchFirstWord(palabra); ShowFirst(palabra); while(largo <= MAX_LEVEL){ break; }else{ if(largo==MAX_LEVEL){ largo=MIN_LEVEL; if(SearchFirstWord(palabra)==1){ ShowFirst(palabra); }else{ break; } }else{ if(SearchNextWord(palabra,largo,palabra,&posCaracterExtra)==1){ largo++; ShowMask(palabra,largo,posCaracterExtra); }else{ break; } } } } return 0; } //----------------------------------------------------------------------------- int ShowFirst(char *word) { char cadena[MIN_LEVEL+1]; do{ RandomCharsOfWord(word,cadena,MIN_LEVEL); return 0; } //----------------------------------------------------------------------------- void ShowMask(char *word,int length,int posCharExtra) { int i; for(i=0;i<length;i++) if(i==posCharExtra) else } //----------------------------------------------------------------------------- void RandomCharsOfWord(char *word,char *result,int length) { int a,i,posRand; char aux; for(a=0;a<length;a++){ for(i=0;i<length-(1+a);i++){ aux=result[i]; result[i]=result[posRand]; result[posRand]=aux; } } } //----------------------------------------------------------------------------- int SearchNextWord(char *word,int length,char *siguiente,int *posCharExtra) { char cadena[SIZE],salida[SIZE]; char nameFile[13]={0}; char aux; int a,i,contador,retval; FILE *archivo; if(archivo != NULL){ do{ contador=length; for(a=0;a<length;a++){ for(i=0;i<=contador;i++){ if(word[a]==cadena[i]) { aux=cadena[i]; cadena[i]=cadena[contador]; cadena[contador]=aux; contador--; break; } } } if(contador==0){ retval=1; } }else{ retval=-1; } return retval; } //----------------------------------------------------------------------------- int SearchFirstWord(char *word) { int retval,nPalabras,posPalabra; FILE *archivo; char nameFile[13]={0}; char palabra[SIZE]; if(archivo != NULL){ if(retval==1) }else{ retval=-1; } return retval; } //-----------------------------------------------------------------------------
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.