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

Al final lo hice asi:
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. #include <ctype.h>
  15.  
  16. #define MIN_LEVEL 4
  17. #define MAX_LEVEL 9
  18. #define SIZE 10
  19. //-----------------------------------------------------------------------------
  20.  
  21. //Estructuras necesarias para obtener y almacenar una combinacion de palabras válida
  22. typedef struct PALABRA{
  23.    char Palabra[SIZE];
  24.    int PosCaracterExtra;
  25. }Palabra;
  26.  
  27. typedef struct LISTA_PALABRAS{
  28.    Palabra *Palabras;
  29.    int nEncontradas;
  30. }ListaPalabras;
  31.  
  32. typedef struct COMBINACION{
  33.    Palabra cuatroLetras;
  34.    ListaPalabras cincoLetras;
  35.    ListaPalabras seisLetras;
  36.    ListaPalabras sieteLetras;
  37.    ListaPalabras ochoLetras;
  38.    ListaPalabras nueveLetras;
  39. }Combinacion;
  40. //-----------------------------------------------------------------------------
  41.  
  42. //Prototipos de funciones
  43. int SearchCombination(Palabra CombRes[6],char **palabra,int nElementos);
  44. int SearchFirstWord(char *nameFile,char *word);
  45. int SearchNextWords(char *word,int length,ListaPalabras *Lista);
  46. int ShowFirst(char *word);
  47. void ShowMask(char *word,int length,int posCharExtra,int nCaracteresAMostrar);
  48. void RandomCharsOfWord(char *word,char *result,int length);
  49. void EliminarPalabra(ListaPalabras *Lista,int pos);
  50. int ObtenerListaInicial(char *nameFile,char **palabra,int *nElementos);
  51. void BarajarListaInicial(char **lista,int nElementos);
  52. char** AsignarMemoriaLista(char *nameFile, int *nPalabras,int *Error);
  53. void LiberarMemoriaLista(char **lista, int nPalabras);
  54. void Jugar(char **lista,int nPalabras);
  55. //-----------------------------------------------------------------------------
  56.  
  57. int main()
  58. {
  59.    char **listaPalabras4Letras;
  60.    char nameFile[]="4_Letras.txt";
  61.    int Error,nPalabras;
  62.  
  63.    listaPalabras4Letras=AsignarMemoriaLista(nameFile,&nPalabras,&Error);
  64.  
  65.    switch(Error){
  66.       case 0:
  67.          srand(time(NULL));
  68.          ObtenerListaInicial(nameFile,listaPalabras4Letras,&nPalabras);
  69.          Jugar(listaPalabras4Letras,nPalabras);
  70.          printf("Gracias por haber jugado.\n");
  71.          system("PAUSE");
  72.       break;
  73.  
  74.       case -1:
  75.          printf("No se pudo abrir el archivo.\n");
  76.       break;
  77.  
  78.       case -2:
  79.          printf("No hay memoria suficiente.\n");
  80.       break;
  81.  
  82.       default:
  83.          printf("Error desconocido.\n");
  84.    }
  85.    return 0;
  86. }
  87. //-----------------------------------------------------------------------------
  88.  
  89. //Se encarga de ejecutar el juego
  90. void Jugar(char **lista,int nPalabras)
  91. {
  92.    char entrada[SIZE];
  93.    int largo,i,x,pistas=0,salir=0;
  94.    Palabra CombResult[6]={0};
  95.  
  96.    if(SearchCombination(CombResult,lista,nPalabras)){
  97.       srand(time(NULL));
  98.       ShowFirst(CombResult[0].Palabra);
  99.       largo=MIN_LEVEL;
  100.       i=0;
  101.  
  102.       do{
  103.          printf("Adivina la palabra: ");
  104.          scanf("%s",entrada);
  105.          for(x=0;x<strlen(entrada);x++)
  106.             entrada[x]=toupper(entrada[x]);
  107.          if(strcmp(entrada,"0")==0)
  108.             salir=1;
  109.          else if(strcmp(entrada,"1") == 0){
  110.             if((largo == MIN_LEVEL && pistas < largo) || (largo > MIN_LEVEL && pistas<largo-1))
  111.                pistas++;
  112.             ShowMask(CombResult[i].Palabra,largo,CombResult[i].PosCaracterExtra,pistas);
  113.          }else if(strcmp(CombResult[i].Palabra,entrada) != 0){
  114.             printf("Nooop\n");
  115.          }else{
  116.             pistas=0;
  117.             printf("Correcto!\n");
  118.             if(largo==MAX_LEVEL){
  119.                system("PAUSE");
  120.                system("CLS");
  121.                largo=MIN_LEVEL;
  122.                if(SearchCombination(&CombResult[0],lista,nPalabras)){
  123.                   i=0;
  124.                   ShowFirst(CombResult[i].Palabra);
  125.                }else{
  126.                   printf("Huvo un error al obtener la siguiente palabra. El programa finalizara.\n");
  127.                   break;
  128.                }
  129.             }else{
  130.                i++;
  131.                largo++;
  132.                printf("La siguiente es: ");
  133.                ShowMask(CombResult[i].Palabra,largo,CombResult[i].PosCaracterExtra,0);
  134.             }
  135.          }
  136.       }while(salir == 0);
  137.       LiberarMemoriaLista(lista,nPalabras);
  138.    }else{
  139.       printf("No existen combinaciones validas.\n");
  140.    }
  141. }
  142. //-----------------------------------------------------------------------------
  143.  
  144. //Asigna a un array bidimensional char** la memoria necesaria para almacenar todas las
  145. //palabras del archivo indicado y retorna la direccion del array
  146. char** AsignarMemoriaLista(char *nameFile, int *nPalabras,int *Error)
  147. {
  148.    FILE *archivo;
  149.    char **lista=NULL;
  150.    int i;
  151.  
  152.    archivo=fopen(nameFile,"r");
  153.  
  154.    if(archivo != NULL){
  155.       fseek(archivo,0,SEEK_END);
  156.       *nPalabras=ftell(archivo)/SIZE;
  157.       lista=(char**)malloc(*nPalabras*sizeof(char*));
  158.       if(lista != NULL){
  159.          for(i=0;i < *nPalabras;i++){
  160.             lista[i]=(char*)malloc(SIZE);
  161.             if(lista[i] == NULL)
  162.                break;
  163.          }
  164.          if(i!=*nPalabras){
  165.             *Error=-2;
  166.             LiberarMemoriaLista(lista,*nPalabras);
  167.          }else
  168.             *Error=0;
  169.       }else{
  170.          *Error=-2;
  171.       }
  172.    }else{
  173.       *Error=-1;
  174.    }
  175.    return lista;
  176. }
  177. //-----------------------------------------------------------------------------
  178.  
  179. //Libera la memoria que se reservó para meter las palabras del archivo en memoria
  180. void LiberarMemoriaLista(char **lista, int nPalabras)
  181. {
  182.    int i;
  183.  
  184.    for(i=0;lista[i]!=NULL && i < nPalabras;i++)
  185.       free(lista[i]);
  186.    free(lista);
  187. }
  188. //-----------------------------------------------------------------------------
  189.  
  190. //Baraja los punteros del array al azar para poder tenerlos desordenados
  191. void BarajarListaInicial(char **lista,int nElementos)
  192. {
  193.    int i,pos;
  194.    char *aux;
  195.  
  196.    for(i=0;i<nElementos;i++){
  197.       pos=rand()%nElementos;
  198.       aux=lista[i];
  199.       lista[i]=lista[pos];
  200.       lista[pos]=aux;
  201.    }
  202. }
  203. //-----------------------------------------------------------------------------
  204.  
  205. //Rellena el array bidimensional con todas las palabras del archivo indicado
  206. int ObtenerListaInicial(char *nameFile,char **palabra,int *nElementos)
  207. {
  208.    int i=0,retval,posPalabra;
  209.    FILE *archivo;
  210.  
  211.    archivo=fopen(nameFile,"r");
  212.    if(archivo != NULL){
  213.       do{
  214.          retval=fread(palabra[i],SIZE,1,archivo);
  215.          if(retval != 1)
  216.             break;
  217.          i++;
  218.       }while(!feof(archivo) && retval != 0);
  219.       if(i==*nElementos)
  220.          retval=1;
  221.       fclose(archivo);
  222.    }else{
  223.       retval=-1;
  224.    }
  225.    return retval;
  226. }

Funcionar funciona pero me gustaria que si pudieran echarle un vistazo y me dijeran si hago alguna burrada que no vea yo para corregirlo y asi aprendo algo mas.
Muchas gracias por toda la ayuda.

Última edición por aguml; 20/11/2015 a las 07:10