Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #21  
Antiguo 27-11-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Mira, esto lo hice yo pero igual te sirve para apoyarte y ver en que te falla a ti:
Código PHP:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SIZE_MAX_PALABRA 30
#define SIZE_MAX_ALFABETO 27
//-----------------------------------------------------------------------------
/* DEFINICION DE TIPOS */
typedef struct ElementoLista
{
  
char *palabra;
  
int indice;
  
struct ElementoLista *sig;
}
Elemento;

typedef struct ListaIdentificar {
   
Elemento *inicio;
   
Elemento *fin;
   
int nElementos;
}
Lista;
//-----------------------------------------------------------------------------

/* PROTOTIPOS DE FUNCIONES */
void Inicializacion (Lista *lista);
int InsertarEnLista (Lista *listaElemento actualchar *palabraint indice);
int Sup_inicio (Lista *lista);
void DestruirLista (Lista *lista);
void Imprimir (Lista *lista);
void PreguntarPalabras(Lista *listaint nPalabras);
int Menu(void);
void Jugar(void);
void Swap(Elemento *primeroElemento *segundo);
void OrdenarLista(Lista *lista);
void LimpiarCadena(char *cadenaint size);
void PasarAMayusculas(char *cadenaint size);
void ActualizarLetrasIntroducidas(char *cadenaint sizechar caracter);
int ActualizarLetrasRestantes(char *cadenaint sizechar caracter);
int ActualizarMascara(char *mascarachar *palabraint sizechar caracter);
int LlenarLista(FILE *archivoLista *lista);
//-----------------------------------------------------------------------------

int main()
{
   
int retval;

   do{
      
retval Menu();

      switch(
retval)
      {
         case 
1:
            
Jugar();
            break;
      }
   }while(
retval != 0);

   return(
0);
}
//-----------------------------------------------------------------------------

void Inicializacion (Lista *lista)
{
   
lista->inicio=NULL;
   
lista->fin=NULL;
   
lista->nElementos=0;
}
//-----------------------------------------------------------------------------

/*inserción en la lista */
int InsertarEnLista (Lista *listaElemento *actualchar *palabraint indice)
{
   
Elemento *nuevo_elemento;

   if ((
nuevo_elemento = (Elemento *) malloc (sizeof (Elemento))) == NULL)
      return -
1;

   if ((
nuevo_elemento->palabra = (char *) malloc (SIZE_MAX_PALABRA sizeof (char))) == NULL)
      return -
1;

   
strcpy (nuevo_elemento->palabrapalabra);
   
nuevo_elemento->indice indice;

   if(
actual != NULL)
      
actual->sig nuevo_elemento;
   
nuevo_elemento->sig NULL;

   if(
lista->inicio == NULL)
      
lista->inicio nuevo_elemento;
   
lista->fin nuevo_elemento;
   
lista->nElementos++;
   return 
0;
}
//-----------------------------------------------------------------------------

/* eliminación al inicio de la lista */
int Sup_inicio (Lista *lista)
{
   
Elemento *sup_elemento;

   if (
lista->nElementos == 0)
      return -
1;
   
sup_elemento lista->inicio;
   
lista->inicio lista->inicio->sig;

   if (
lista->nElementos == 1)
      
lista->fin NULL;
   
free (sup_elemento->palabra);
   
free (sup_elemento);
   
lista->nElementos--;
   return 
0;
}
//-----------------------------------------------------------------------------

/* destruir la lista */
void DestruirLista (Lista *lista)
{
   while (
lista->nElementos 0)
      
Sup_inicio (lista);
}
//-----------------------------------------------------------------------------

/* visualización de la lista */
void Imprimir (Lista *lista)
{
   
Elemento *actual;

   
actual lista->inicio;
   while (
actual != NULL){
      
printf ("%s\n"actual->palabra);
      
actual actual->sig;
   }
}
//-----------------------------------------------------------------------------

void LimpiarCadena(char *cadenaint size)
{
   
int indice;

   for(
indice 0indice sizecadena[indice++] = '\0');
}
//-----------------------------------------------------------------------------

void PasarAMayusculas(char *cadenaint size)
{
   
int indice;

   for(
indice=0indice size;indice++)
   {
      if(
cadena[indice] >= 'a' && cadena[indice] <= 'z')
         
cadena[indice] -= 32;
   }
}
//-----------------------------------------------------------------------------

int ActualizarLetrasRestantes(char *cadenaint sizechar caracter)
{
   
int indicej;
   
char *aux;

   if ((
aux = (char *) malloc ((size) * sizeof (char))) == NULL)
      return -
1;

   
//Buscamos el caracter introducido en el array con los caracteres restantes
   //Si lo encuentra lo omite y si es otro lo copia a un array auxiliar
   
for(indice=0,j=0indice size;indice++)
   {
      if(
cadena[indice] != caracter)
      {
         
aux[j]=cadena[indice];
         
j++;
      }
   }

   
//Si se encontró j será menor que indice con lo que finalizo la cadena auxiliar y
   //copio el contenido de la variable auxiliar a la cadena a mostrar con los
   //caracteres restantes
   
if(indice)
   {
      
aux[j] = '\0';
      
strcpy(cadenaaux);
   }
   
free(aux);

   return 
0;
}
//-----------------------------------------------------------------------------

void ActualizarLetrasIntroducidas(char *cadenaint sizechar caracter)
{
   
int indice;

   
//Recorro los caracteres introducidos en busca del nuevo caracter
   
for(indice=0indice sizeindice++)
      if(
cadena[indice] == caracter){
         break;
      }

   
//Si se ha introducido un nuevo caracter y no está en la lista
   //le añado el nuevo caracter
   
if(size == indice)
      
cadena[size] = caracter;
}
//-----------------------------------------------------------------------------

int ActualizarMascara(char *mascarachar *palabraint sizechar caracter)
{
   
int indiceaciertos=0encontrada=0;

   for(
indice=0indice size && size != 0indice++)
      if(
mascara[indice] == caracter)
         
encontrada++;

   if(
encontrada 0){
      
aciertos=0;
   }else{
      
//Busco el caracter introducido en la palabra y si se encuentra lo quito de la palabra
      
for(indice=0indice size && size != 0indice++)
      {
         if(
palabra[indice] == caracter)
         {
            
mascara[indice] = palabra[indice];
            
aciertos++;
         }
      }
   }
   return 
aciertos;
}
//-----------------------------------------------------------------------------

void PreguntarPalabras(Lista *listaint nPalabras){
   const 
char letrasValidas[SIZE_MAX_ALFABETO] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
   
int vidas 5indicelargoPalabralargoIntroducidaslargoRestantesaciertos;
   
int contador=0encontradossalir 0;
   
char palabra[SIZE_MAX_PALABRA], auxPalabra[SIZE_MAX_PALABRA];
   
char letrasIntroducidas[SIZE_MAX_ALFABETO], letrasRestantes[SIZE_MAX_ALFABETO];
   
char caracter;
   
Elemento *actual lista->inicio;

   do{
      
//Limpio los 3 arrays (Se puede usar en su lugar memset)
      
LimpiarCadena(letrasRestantes,SIZE_MAX_ALFABETO);
      
LimpiarCadena(letrasIntroducidas,SIZE_MAX_ALFABETO);
      
LimpiarCadena(auxPalabra,SIZE_MAX_PALABRA);

      
//Inicializo las variables que se necesiten
      
strcpy(letrasRestantes,letrasValidas);
      
strcpy(palabra,actual->palabra);
      
largoPalabra strlen(palabra);
      
encontrados 0;

      
//Si hay algun caracter en minusculas en la palabra lo paso a mayusculas
      
PasarAMayusculas(palabra,largoPalabra);

      
//Muestro la mascara para que se vea cuantos caracteres tiene (Se puede hacer con memset)
      
for(indice=0indice largoPalabra;indice++)
      {
         
auxPalabra[indice] = '-';
      }

      
//Mientras no lleguemos al final de la lista y tengamos vidas seguimos
      
while (actual != NULL && vidas 0){
         do{ 
//Este bucle es para descartar todos los caracteres no permitidos
            //Muestro la informacion
            
system("CLS");
            
printf("\n%c: %d"3vidas);
            
printf("\nLetras introducidas: %s",letrasIntroducidas);
            
printf("\nLetras restantes: %s",letrasRestantes);
            
printf("\nNumero de palabras solucionadas: %d",contador);
            
printf("\n%s\n\n",auxPalabra);
            
printf("Introduce una letra (0 para salir): ");
            
fflush(stdin); //limpio el flujo de entrada
            
caracter getchar(); //Pido el caracter

            //Si el caracter introducido esta en minusculas lo paso a mayusculas
            
PasarAMayusculas(&caracter,1);

         }while((
caracter 'A' || caracter 'Z') && caracter != '0');

         
//Si se introdujo 0 salimos del juego
         
if(caracter == '0')
         {
            
salir=1;
            
printf("\n\nSalida forzada por el usuario.\n\n");
            break;
         }

         
largoRestantes strlen(letrasRestantes);

         
ActualizarLetrasRestantes(letrasRestantes,largoRestantescaracter);

         
//Busco el caracter introducido en la palabra y si se encuentra lo quito de la palabra
         
encontrados += aciertos ActualizarMascara(auxPalabrapalabralargoPalabracaracter);

         
//Si se ha encontrado el caracter le resto el numero de caracteres encontrados
         //al largo de la palabra e inicializo la variable de encontrados
         //Si no se encuentra resto una vida
         
if(aciertos == 0){
            
vidas--;
         }

         
largoIntroducidas strlen(letrasIntroducidas);

         
ActualizarLetrasIntroducidas(letrasIntroducidas,largoIntroducidascaracter);

         
//Si el largo de la palabra es 0 es porque ya se metieron todos
         //los caracteres de dicha palabra asi que la muestro y obtengo
         //la siguiente palabra
         
if(largoPalabra == encontrados){
            
contador++;
            
system("CLS");
            
printf("\n%c: %d"3vidas);
            
printf("\nLetras introducidas: %s",letrasIntroducidas);
            
printf("\nLetras restantes: %s",letrasRestantes);
            
printf("\nNumero de palabras solucionadas: %d",contador);
            
printf ("\n\n%s    Solucionada!!!\n\n"palabra);
            
actual actual->sig;
            
system("PAUSE");
            break;
         }

         
//Si no hay vidas hemos perdido asi que lo indico y salimos
         
if(vidas == 0)
         {
            
salir 1;
            
system("CLS");
            
printf("\n%c: %d"3vidas);
            
printf("\nLetras introducidas: %s",letrasIntroducidas);
            
printf("\nLetras restantes: %s",letrasRestantes);
            
printf("\nNumero de palabras solucionadas: %d",contador);
            
printf("\n\nPartida finalizada.\n\n");
         }
      }

      
//Si son iguales es porque ya solucionamos todas las palabras
      //solicitadas asi que hemos ganado
      
if(nPalabras == contador)
      {
         
printf("\n\nHas ganado.\n\n");
         
salir 1;
      }
   }while(
salir != 1);
}
//-----------------------------------------------------------------------------
//Intercambia el contenido de dos elementos de la lista
void Swap(Elemento *primeroElemento *segundo)
{
   
char auxPalabra[SIZE_MAX_PALABRA];
   
int auxIndice;

   
strcpy(auxPalabraprimero->palabra);
   
strcpy(primero->palabrasegundo->palabra);
   
strcpy(segundo->palabraauxPalabra);

   
auxIndice primero->indice;
   
primero->indice segundo->indice;
   
segundo->indice auxIndice;
}
//-----------------------------------------------------------------------------

//Ordena el contenido de la lista
void OrdenarLista(Lista *lista)
{
   
int i,j;
   
Elemento *auxiliar, *actual;

   for (
j=0actual=lista->inicioactual != NULL && lista->nElementos-1actualactual->sigj++)
   {
      for (
i=0auxiliar lista->inicio< (lista->nElementos-1-j) && auxiliar->sig != NULLi++, auxiliar auxiliar->sig)
      {
         if (
auxiliar->indice >= auxiliar->sig->indice)
         {
            
Swap(auxiliar,auxiliar->sig);
         }
      }
   }
}
//-----------------------------------------------------------------------------

int LlenarLista(FILE *archivoLista *lista)
{
   
int finLectura=0,j,indice,contador;
   
char caracter,palabra[SIZE_MAX_PALABRA];

   
contador 0;
   
j=0;

   while( 
finLectura != 1)
   {
      
LimpiarCadena(palabraSIZE_MAX_PALABRA);

      while (!
feof(archivo)){
         do{
            
caracter=fgetc(archivo);
         }while(
caracter=='\n');

         if (
caracter!=';'){
            
palabra[j]=caracter;
            
j++;
         }else{
            
j=0;

            
//FGETC NO SIRVE YA QUE SOLO CAPTURA UN CARACTER
            //¿Y SI EL NUMERO ES POR EJEMPLO 10, O 150, O CUALQUIER OTRO QUE TENGA UN 1 DELANTE?
            
fscanf(archivo,"%d",&indice);

            if(
InsertarEnLista(lista,lista->finpalabraindice) == -1){
               
printf("\nError al insertar un elemento a la lista. Pulsa intro para salir.\n\n");
               
system("PAUSE");
               return -
1;
            }
            
contador++;

            
LimpiarCadena(palabra,SIZE_MAX_PALABRA);
         }
      }
      
finLectura++;
   }
   return 
contador;
}
//-----------------------------------------------------------------------------

//Version ordenando la lista despues de haberla obtenido entera desordenada
void Jugar(){
   
int cantidad,error,contador;
   
char caracter;
   
Lista *lista;
   
FILE *archivo;
   
   if ((
lista = (Lista *) malloc (sizeof (Lista))) != NULL){
      
Inicializacion(lista);
      do{
         
system ("color b");
         
system("cls");
         
printf("\n\t\t\t  ¿Con cuantas palabras desea jugar? ");
         
scanf("%d",&cantidad);
         if(
cantidad || cantidad 10){
            
error 1;
            
printf("\nTiene que ser un valor comprendido entre 3 y 10\n");
            
system("PAUSE");
         }else{
            
error 0;
         }
      }while(
error==1);

      
archivofopen("prueba.txt","r");

      if (
archivo== NULL){
         
printf("El archivo no se encuentra");
      }else{
         
//Lleno la lista con todas las palabras del archivo indicado
         
contador LlenarLista(archivolista);

         
fclose(archivo);

         
//Si se obtuvieron el numero de palabras indicadas...
         
if(contador >= cantidad)
         {
            
OrdenarLista(lista);
            
PreguntarPalabras(listacantidad);
            
system("PAUSE");
            
system("CLS");

            
//Imprimimos la lista de palabras
            
printf("\nLista de palabras:");
            
printf("\n-----------------\n\n");
            
Imprimir(lista);
         }else{
            
printf("\nHay menos palabras en el archivo que las deseadas\n\n");
         }
      }
      
DestruirLista(lista);
      
free(lista);
   }
   
printf("\n");
   
system("PAUSE");
}
//-----------------------------------------------------------------------------

/*
//Version obteniendo la lista ya ordenada
void Jugar(){
   int cantidad,i,j,aux,indice,error,contador;
   char caracter,palabra[SIZE_MAX_PALABRA];
   Lista *lista;
   FILE *archivo;
   int finLecturaOrdenada=0;
   
   if ((lista = (Lista *) malloc (sizeof (Lista))) != NULL){
      Inicializacion(lista);
      do{
         system ("color b");
         system("cls");
         printf("\n\t\t\t  ¿Con cuantas palabras desea jugar? ");
         scanf("%d",&cantidad);
         if(cantidad < 3 || cantidad > 10){
            error = 1;
            printf("\nTiene que ser un valor comprendido entre 3 y 10\n");
            system("PAUSE");
         }else{
            error = 0;
         }
      }while(error==1);

      archivo= fopen("prueba.txt","r");
      if (archivo== NULL)
      {
         printf("El archivo no se encuentra");
      }else{
         contador = 1;
         i=1,j=0;
         while( finLecturaOrdenada != 2)
         {
            for(indice = 0; indice < SIZE_MAX_PALABRA; palabra[indice++] = '\0');

            while (!feof(archivo)){
               do{
                  caracter=fgetc(archivo);
               }while(caracter=='\n');

               if (caracter!=';'){
                  palabra[j]=caracter;
                  j++;
               }else{
                  j=0;

                  //FGETC NO SIRVE YA QUE SOLO CAPTURA UN CARACTER
                  //¿Y SI EL NUMERO ES POR EJEMPLO 10, O 150, O CUALQUIER OTRO QUE TENGA UN 1 DELANTE?
                  fscanf(archivo,"%d",&aux);
                  if (aux==i){
                     if(InsertarEnLista(lista,lista->fin,palabra,aux) == -1){
                        printf("\nError al insertar un elemento a la lista. Pulsa intro para salir.\n\n");
                        system("PAUSE");
                        return;
                     }
                     finLecturaOrdenada = 0;
                     fseek(archivo,0,0); //SI ENCUENTRO EL VALOR DESEADO DE INDICE ME POSICIONO AL PRINCIPIO PARA BUSCAR EL SIGUIENTE
                     contador++;
                     break;
                  }

                  for(indice = 0; indice < SIZE_MAX_PALABRA; palabra[indice++] = '\0');
               }
            }
            finLecturaOrdenada++;
            i++; //incrementamos el indice para obtener los registros ordenados

            if(i>contador){
               printf("\nHay menos palabras en el archivo que las deseadas\n\n");
               break;
            }
         }
         fclose(archivo);

         //Si se obtuvieron el numero de palabras indicadas...
         if(contador > cantidad)
         {
            PreguntarPalabras(lista, cantidad);

            system("CLS");

            //Imprimimos la lista de palabras
            printf("\nLista de palabras:\n"
                "---------------\n\n");
            Imprimir(lista);
         }
      }
      DestruirLista(lista);
      free(lista);
   }
   printf("\n");
   system("PAUSE");
}
//-----------------------------------------------------------------------------
*/

int Menu()
{
   
char resp;

   
system ("color b");
   
system("cls");
   
printf("\n\n\t\t\t* * * * * MENU DE OPCIONES * * * * *");
   
printf("\n\t\t---------------------------------------------------");
   
printf("\n\t\t\t  Juego de el ahorcado ");
   
printf("\n\t\t---------------------------------------------------\n\n\n\n");
   
printf("\t\t\t\t (1) Jugar \n");
   
printf("\t\t\t\t (0) salir\n\n");
   
printf("\t\t\t\t Opcion: ");

   
resp=getchar();

   return (
resp 48); //Devuelvo su valor entero
}
//----------------------------------------------------------------------------- 
Por cierto, para ordenar la lista hice algo que no me gustó mucho pero no encontré otro modo ya que intenté intercambiando los punteros de la lista pero entonces se descuadraba la lista porque Sig apuntaba a donde no debia y despues de darle mil vueltas decidí hacerlo así pero si alguien me explica como hacerlo intercambiando los registros de la lista pues creo que sería mejor solucion.

Última edición por aguml fecha: 27-11-2014 a las 19:54:15.
Responder Con Cita
  #22  
Antiguo 29-11-2014
jcdca jcdca is offline
Miembro
NULL
 
Registrado: nov 2014
Posts: 15
Poder: 0
jcdca Va por buen camino
eres un genio jeje, gracias, me ayudaste mucho de verdad te lo agradezco. te debo una jeje
Responder Con Cita
  #23  
Antiguo 01-12-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Otra forma que se me ocurrio de ordenar una lista simple:

Código PHP:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SIZE_MAX_PALABRA 30
#define SIZE_MAX_ALFABETO 27
//-----------------------------------------------------------------------------
/* DEFINICION DE TIPOS */
typedef struct ElementoLista
{
  
char *palabra;
  
int indice;
  
struct ElementoLista *sig;
}
Elemento;

typedef struct ListaIdentificar {
   
Elemento *inicio;
   
Elemento *fin;
   
int nElementos;
}
Lista;
//-----------------------------------------------------------------------------

/* PROTOTIPOS DE FUNCIONES */
void Inicializacion (Lista *lista);
int InsertarEnLista (Lista *listaElemento actualchar *palabraint indice);
int Sup_en_lista (Lista *listaint pos);
int Sup_inicio (Lista *lista);
void DestruirLista (Lista *lista);
void Imprimir (Lista *lista);
void PreguntarPalabras(Lista *listaint nPalabras);
int Menu(void);
void Jugar(void);
int OrdenarLista(Lista *lista);
void LimpiarCadena(char *cadenaint size);
void PasarAMayusculas(char *cadenaint size);
void ActualizarLetrasIntroducidas(char *cadenaint sizechar caracter);
int ActualizarLetrasRestantes(char *cadenaint sizechar caracter);
int ActualizarMascara(char *mascarachar *palabraint sizechar caracter);
int LlenarLista(FILE *archivoLista *lista);
//-----------------------------------------------------------------------------

int main()
{
   
int retval;

   do{
      
retval Menu();

      switch(
retval)
      {
         case 
1:
            
Jugar();
            break;
      }
   }while(
retval != 0);

   return(
0);
}
//-----------------------------------------------------------------------------

void Inicializacion (Lista *lista)
{
   
lista->inicio=NULL;
   
lista->fin=NULL;
   
lista->nElementos=0;
}
//-----------------------------------------------------------------------------

/*inserción en la lista */
int InsertarEnLista (Lista *listaElemento *actualchar *palabraint indice)
{
   
Elemento *nuevo_elemento;

   if ((
nuevo_elemento = (Elemento *) malloc (sizeof (Elemento))) == NULL)
      return -
1;

   if ((
nuevo_elemento->palabra = (char *) malloc (SIZE_MAX_PALABRA sizeof (char))) == NULL)
      return -
1;

   
strcpy (nuevo_elemento->palabrapalabra);
   
nuevo_elemento->indice indice;

   if(
actual != NULL)
      
actual->sig nuevo_elemento;
   
nuevo_elemento->sig NULL;

   if(
lista->inicio == NULL)
      
lista->inicio nuevo_elemento;
   
lista->fin nuevo_elemento;
   
lista->nElementos++;
   return 
0;
}
//-----------------------------------------------------------------------------

/* eliminar un elemento después de la posición solicitada */
int Sup_en_lista (Lista listaint pos)
{
   
int i;
   
Elemento *actual;
   
Elemento *sup_elemento;

   if (
lista->nElementos <= || pos || pos >= lista->nElementos)
      return -
1;

   
actual lista->inicio;
   for (
1pos; ++i)
      
actual actual->sig;
   
sup_elemento actual->sig;
   
actual->sig actual->sig->sig;
   if(
actual->sig == NULL)
      
lista->fin actual;
   
free (sup_elemento->palabra);
   
free (sup_elemento);
   
lista->nElementos--;
   return 
0;
}
//-----------------------------------------------------------------------------

/* eliminación al inicio de la lista */
int Sup_inicio (Lista *lista)
{
   
Elemento *sup_elemento;

   if (
lista->nElementos == 0)
      return -
1;
   
sup_elemento lista->inicio;
   
lista->inicio lista->inicio->sig;

   if (
lista->nElementos == 1)
      
lista->fin NULL;
   
free (sup_elemento->palabra);
   
free (sup_elemento);
   
lista->nElementos--;
   return 
0;
}
//-----------------------------------------------------------------------------

/* destruir la lista */
void DestruirLista (Lista *lista)
{
   while (
lista->nElementos 0)
      
Sup_inicio (lista);
}
//-----------------------------------------------------------------------------

/* visualización de la lista */
void Imprimir (Lista *lista)
{
   
Elemento *actual;

   
actual lista->inicio;
   while (
actual != NULL){
      
printf ("%s\n"actual->palabra);
      
actual actual->sig;
   }
}
//-----------------------------------------------------------------------------

void LimpiarCadena(char *cadenaint size)
{
   
int indice;

   for(
indice 0indice sizecadena[indice++] = '\0');
}
//-----------------------------------------------------------------------------

void PasarAMayusculas(char *cadenaint size)
{
   
int indice;

   for(
indice=0indice size;indice++)
   {
      if(
cadena[indice] >= 'a' && cadena[indice] <= 'z')
         
cadena[indice] -= 32;
   }
}
//-----------------------------------------------------------------------------

int ActualizarLetrasRestantes(char *cadenaint sizechar caracter)
{
   
int indicej;
   
char *aux;

   if ((
aux = (char *) malloc ((size) * sizeof (char))) == NULL)
      return -
1;

   
//Buscamos el caracter introducido en el array con los caracteres restantes
   //Si lo encuentra lo omite y si es otro lo copia a un array auxiliar
   
for(indice=0,j=0indice size;indice++)
   {
      if(
cadena[indice] != caracter)
      {
         
aux[j]=cadena[indice];
         
j++;
      }
   }

   
//Si se encontró j será menor que indice con lo que finalizo la cadena auxiliar y
   //copio el contenido de la variable auxiliar a la cadena a mostrar con los
   //caracteres restantes
   
if(indice)
   {
      
aux[j] = '\0';
      
strcpy(cadenaaux);
   }
   
free(aux);

   return 
0;
}
//-----------------------------------------------------------------------------

void ActualizarLetrasIntroducidas(char *cadenaint sizechar caracter)
{
   
int indice;

   
//Recorro los caracteres introducidos en busca del nuevo caracter
   
for(indice=0indice sizeindice++)
      if(
cadena[indice] == caracter){
         break;
      }

   
//Si se ha introducido un nuevo caracter y no está en la lista
   //le añado el nuevo caracter
   
if(size == indice)
      
cadena[size] = caracter;
}
//-----------------------------------------------------------------------------

int ActualizarMascara(char *mascarachar *palabraint sizechar caracter)
{
   
int indiceaciertos=0encontrada=0;

   for(
indice=0indice size && size != 0indice++)
      if(
mascara[indice] == caracter)
         
encontrada++;

   if(
encontrada 0){
      
aciertos=0;
   }else{
      
//Busco el caracter introducido en la palabra y si se encuentra lo quito de la palabra
      
for(indice=0indice size && size != 0indice++)
      {
         if(
palabra[indice] == caracter)
         {
            
mascara[indice] = palabra[indice];
            
aciertos++;
         }
      }
   }
   return 
aciertos;
}
//-----------------------------------------------------------------------------

void PreguntarPalabras(Lista *listaint nPalabras){
   const 
char letrasValidas[SIZE_MAX_ALFABETO] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
   
int vidas 5indicelargoPalabralargoIntroducidaslargoRestantesaciertos;
   
int contador=0encontradossalir 0;
   
char palabra[SIZE_MAX_PALABRA], auxPalabra[SIZE_MAX_PALABRA];
   
char letrasIntroducidas[SIZE_MAX_ALFABETO], letrasRestantes[SIZE_MAX_ALFABETO];
   
char caracter;
   
Elemento *actual lista->inicio;

   do{
      
//Limpio los 3 arrays (Se puede usar en su lugar memset)
      
LimpiarCadena(letrasRestantes,SIZE_MAX_ALFABETO);
      
LimpiarCadena(letrasIntroducidas,SIZE_MAX_ALFABETO);
      
LimpiarCadena(auxPalabra,SIZE_MAX_PALABRA);

      
//Inicializo las variables que se necesiten
      
strcpy(letrasRestantes,letrasValidas);
      
strcpy(palabra,actual->palabra);
      
largoPalabra strlen(palabra);
      
encontrados 0;

      
//Si hay algun caracter en minusculas en la palabra lo paso a mayusculas
      
PasarAMayusculas(palabra,largoPalabra);

      
//Muestro la mascara para que se vea cuantos caracteres tiene (Se puede hacer con memset)
      
for(indice=0indice largoPalabra;indice++)
      {
         
auxPalabra[indice] = '-';
      }

      
//Mientras no lleguemos al final de la lista y tengamos vidas seguimos
      
while (actual != NULL && vidas 0){
         do{ 
//Este bucle es para descartar todos los caracteres no permitidos
            //Muestro la informacion
            
system("CLS");
            
printf("\n%c: %d"3vidas);
            
printf("\nLetras introducidas: %s",letrasIntroducidas);
            
printf("\nLetras restantes: %s",letrasRestantes);
            
printf("\nNumero de palabras solucionadas: %d",contador);
            
printf("\n%s\n\n",auxPalabra);
            
printf("Introduce una letra (0 para salir): ");
            
fflush(stdin); //limpio el flujo de entrada
            
caracter getchar(); //Pido el caracter

            //Si el caracter introducido esta en minusculas lo paso a mayusculas
            
PasarAMayusculas(&caracter,1);

         }while((
caracter 'A' || caracter 'Z') && caracter != '0');

         
//Si se introdujo 0 salimos del juego
         
if(caracter == '0')
         {
            
salir=1;
            
printf("\n\nSalida forzada por el usuario.\n\n");
            break;
         }

         
largoRestantes strlen(letrasRestantes);

         
ActualizarLetrasRestantes(letrasRestantes,largoRestantescaracter);

         
//Busco el caracter introducido en la palabra y si se encuentra lo quito de la palabra
         
encontrados += aciertos ActualizarMascara(auxPalabrapalabralargoPalabracaracter);

         
//Si se ha encontrado el caracter le resto el numero de caracteres encontrados
         //al largo de la palabra e inicializo la variable de encontrados
         //Si no se encuentra resto una vida
         
if(aciertos == 0){
            
vidas--;
         }

         
largoIntroducidas strlen(letrasIntroducidas);

         
ActualizarLetrasIntroducidas(letrasIntroducidas,largoIntroducidascaracter);

         
//Si el largo de la palabra es 0 es porque ya se metieron todos
         //los caracteres de dicha palabra asi que la muestro y obtengo
         //la siguiente palabra
         
if(largoPalabra == encontrados){
            
contador++;
            
system("CLS");
            
printf("\n%c: %d"3vidas);
            
printf("\nLetras introducidas: %s",letrasIntroducidas);
            
printf("\nLetras restantes: %s",letrasRestantes);
            
printf("\nNumero de palabras solucionadas: %d",contador);
            
printf ("\n\n%s    Solucionada!!!\n\n"palabra);
            
actual actual->sig;
            
system("PAUSE");
            break;
         }

         
//Si no hay vidas hemos perdido asi que lo indico y salimos
         
if(vidas == 0)
         {
            
salir 1;
            
system("CLS");
            
printf("\n%c: %d"3vidas);
            
printf("\nLetras introducidas: %s",letrasIntroducidas);
            
printf("\nLetras restantes: %s",letrasRestantes);
            
printf("\nNumero de palabras solucionadas: %d",contador);
            
printf("\n\nPartida finalizada.\n\n");
         }
      }

      
//Si son iguales es porque ya solucionamos todas las palabras
      //solicitadas asi que hemos ganado
      
if(nPalabras == contador)
      {
         
printf("\n\nHas ganado.\n\n");
         
salir 1;
      }
   }while(
salir != 1);
}
//-----------------------------------------------------------------------------

//Ordena el contenido de la lista
int OrdenarLista(Lista *lista)
{
   
int j,pos,retval;
   
Elemento *actual,*menor;
   
Lista *listaAux;

   if(
lista->nElementos 1){
      
//Reservo memoria para la lista auxiliar que usaré para ordenar la lista
      
if ((listaAux = (Lista *) malloc (sizeof (Lista))) == NULL){
         
retval = -1//Valor de retorno que indica que no se pudo obtener suficiente memoria
      
}else{
         
//Inicializo la lista auxiliar
         
Inicializacion(listaAux);

         
//Mientras que el número de elementos sea mayor que 1...
         
while(lista->nElementos 1){
            
menor lista->inicio//le asigno al puntero de tipo Elemento la direccion de inicio de la lista
            
pos=0//inicializo la variable para saber la posicion del elemento anterior al de menor indice

            //Recorro todos los elementos en busca del que tenga menor indice
            
for (j=1actual=lista->iniciolista->nElementosj++, actual=actual->sig)
            {
               
//Si el indice del actual es mayor que el del siguiente...
               
if(menor->indice actual->sig->indice){
                  
menor actual->sig//Asigno a menor la direccion del elemento siguiente
                  
pos j//Asigno a pos la posicion del elemento anterior al que tiene el indice menor
               
}
            }
            
//Inserto el elemento menor en la lista auxiliar
            
InsertarEnLista(listaAuxlistaAux->finmenor->palabramenor->indice);

            if(
pos==0){ //Si pos es 0 es porque es el primer elemento de la lista
               
Sup_inicio(lista); //Elimino al primer elemento de la lista
            
}else{ //Si pos es diferente de 0...
               
Sup_en_lista(lista,pos); //Elimino el elemento que está despues de la posicion pos
            
}
         }

         if(
lista->nElementos == 1){ //Si hay un solo elemento en la lista...
            //Inserto ese elemento en la lista auxiliar ya que es el último que falta por ordenar y el que tiene mayor indice
            
InsertarEnLista(listaAuxlistaAux->finlista->inicio->palabralista->inicio->indice);
            
Sup_inicio(lista); //Elimino el elemento que queda para limpiar la lista
         
}

         
//Recorro la lista auxiliar para rellenar la lista
         
for(j=0actual=listaAux->iniciolistaAux->nElementosj++, actual=actual->sig)
            
InsertarEnLista(listalista->finactual->palabraactual->indice);

         
DestruirLista(listaAux); //Libero la memoria de los elementos de la lista auxiliar
         
free(listaAux); //Libero la memoria de la lista auxiliar
         
retval=0//Valor de retorno que indica que todo fue bien
      
}
   }else{
      
retval = -2//Valor de retorno que indica que el numero de elementos de la lista no es correcto
   
}
   return 
retval;
}
//-----------------------------------------------------------------------------

int LlenarLista(FILE *archivoLista *lista)
{
   
int finLectura=0,j,indice,contador;
   
char caracter,palabra[SIZE_MAX_PALABRA];

   
contador 0;
   
j=0;

   while( 
finLectura != 1)
   {
      
LimpiarCadena(palabraSIZE_MAX_PALABRA);

      while (!
feof(archivo)){
         do{
            
caracter=fgetc(archivo);
         }while(
caracter=='\n');

         if (
caracter!=';'){
            
palabra[j]=caracter;
            
j++;
         }else{
            
j=0;

            
//FGETC NO SIRVE YA QUE SOLO CAPTURA UN CARACTER
            //¿Y SI EL NUMERO ES POR EJEMPLO 10, O 150, O CUALQUIER OTRO QUE TENGA UN 1 DELANTE?
            
fscanf(archivo,"%d",&indice);

            if(
InsertarEnLista(lista,lista->finpalabraindice) == -1){
               
printf("\nError al insertar un elemento a la lista. Pulsa intro para salir.\n\n");
               
system("PAUSE");
               return -
1;
            }
            
contador++;

            
LimpiarCadena(palabra,SIZE_MAX_PALABRA);
         }
      }
      
finLectura++;
   }
   return 
contador;
}
//-----------------------------------------------------------------------------

//Version ordenando la lista despues de haberla obtenido entera desordenada
void Jugar(){
   
int cantidad,error,contador;
   
char caracter;
   
Lista *lista;
   
FILE *archivo;
   
   if ((
lista = (Lista *) malloc (sizeof (Lista))) != NULL){
      
Inicializacion(lista);
      do{
         
system ("color b");
         
system("cls");
         
printf("\n\t\t\t  ¿Con cuantas palabras desea jugar? ");
         
scanf("%d",&cantidad);
         if(
cantidad || cantidad 10){
            
error 1;
            
printf("\nTiene que ser un valor comprendido entre 3 y 10\n");
            
system("PAUSE");
         }else{
            
error 0;
         }
      }while(
error==1);

      
archivofopen("prueba.txt","r");

      if (
archivo== NULL){
         
printf("El archivo no se encuentra");
      }else{
         
//Lleno la lista con todas las palabras del archivo indicado
         
contador LlenarLista(archivolista);

         
fclose(archivo);

         
//Si se obtuvieron el numero de palabras indicadas...
         
if(contador >= cantidad)
         {
            
OrdenarLista(lista);
            
PreguntarPalabras(listacantidad);
            
system("PAUSE");
            
system("CLS");

            
//Imprimimos la lista de palabras
            
printf("\nLista de palabras:");
            
printf("\n-----------------\n\n");
            
Imprimir(lista);
         }else{
            
printf("\nHay menos palabras en el archivo que las deseadas\n\n");
         }
      }
      
DestruirLista(lista);
      
free(lista);
   }
   
printf("\n");
   
system("PAUSE");
}
//-----------------------------------------------------------------------------

int Menu()
{
   
char resp;

   
system ("color b");
   
system("cls");
   
printf("\n\n\t\t\t* * * * * MENU DE OPCIONES * * * * *");
   
printf("\n\t\t---------------------------------------------------");
   
printf("\n\t\t\t  Juego de el ahorcado ");
   
printf("\n\t\t---------------------------------------------------\n\n\n\n");
   
printf("\t\t\t\t (1) Jugar \n");
   
printf("\t\t\t\t (0) salir\n\n");
   
printf("\t\t\t\t Opcion: ");

   
resp=getchar();

   return (
resp 48); //Devuelvo su valor entero
}
//----------------------------------------------------------------------------- 
Utilizo una lista auxiliar en la cual guardo los elementos ya ordenados y los voy eliminando de la lista principal. Luego copio todo ya ordenado en la lista principal y libero la memoria ocupada por la lista auxiliar.
Si consigues un método mejor compartelo aquí por favor, estoy interesado ya que nunca se me ocurrio ordenar una lista enlazada y he visto que es algo complejo de hacer.
Responder Con Cita
  #24  
Antiguo 03-12-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Bueno, el uso de una lista auxiliar no era eficiente porque hay varias iteraciones y por el uso doble de memoria así que despues de mucho darle vueltas y mucha ayuda para entender como hacerlo con punteros he conseguido hacerlo intercambiando los punteros de la lista:

Código PHP:
//Intercambia el contenido de dos elementos de la lista y nos devuelve el puntero al primero
//Hay que hacer que los punteros sig apunten adonde deben ya que si no es así la lista se
//rompería. Para eso uso sigAux para, una vez intercambiados los elementos, intercambiar
//sus punteros sig
Elemento Swap(Elemento *primeroElemento *segundo)
{
   
Elemento *aux, *sigAux;

   
aux primero;
   
sigAux segundo->sig;
   
primero segundo;
   
segundo aux;
   
segundo->sig sigAux;
   
primero->sig segundo;

   return 
primero;
}
//-----------------------------------------------------------------------------

//Ordena el contenido de la lista
void OrdenarLista(Lista *lista)
{
   
int i,j;
   
Elemento *actual, *anterior;

   for (
i=1lista->nElementosi++)
   {
      for (
j=0actual lista->inicioanterior NULLlista->nElementos-(i); j++, actual actual->sig)
      {
         if (
actual->indice >= actual->sig->indice)
         {
            
//Si el elemento actual es el primero de la lista pongo al que apunta el puntero
            //sig del actual como inicio ya que serán intercambiados
            
if(actual == lista->inicio)
               
lista->inicio actual->sig;

            
//Si el puntero sig de actual es el mismo que el fin de la lista pongo al actual
            //como fin ya que voy a intercambiarlos
            
if(actual->sig == lista->fin)
               
lista->fin actual;

            
//Intercambio los elementos
            
actual Swap(actual,actual->sig);

            
//Si anterior es igual a NULL será porque actual es el primer elemento de la lista
            //y por lo tanto no existe un elemento anterior
            //Si no es NULL actualizo el puntero sig del elemento anterior al nuevo elemento
            //actual despues del intercambio
            
if(anterior != NULL)
               
anterior->sig actual;
         }
         
//Guardo el puntero al elemento actual para la siguiente pasada
         
anterior actual;
      }
   }

Espero que al menos le sirva a alguien tanto esfuerzo jejeje.
Responder Con Cita
  #25  
Antiguo 05-12-2014
jcdca jcdca is offline
Miembro
NULL
 
Registrado: nov 2014
Posts: 15
Poder: 0
jcdca Va por buen camino
bueno, ya esta casi hecho... esta todo listo, pero tengo un inconveniente, cuando recorro el archivo por primera vez y lleno la lista va bien, pero cuando lo hago la segunda vez, la primera palabra del .txt me la agrega a la lista con un espacio en blanco, o eso creo, es un caracter mas al principio, no estoy seguro de que sea un espacio. codigo= funciona todo bien, como lo tengo que entregar, menos lo que les digo de la palabra... y sin modificar el texto igualmente me agrega el caracter, no se si es cuando abro el archivo en modo lectura, que crea un caracter para poder leerlo o algo, veanlo ustedes a ver si saben que es.


Código PHP:
#include <stdio.h>  
#include <stdlib.h>  
#include <string.h> 

#define SIZE_MAX_PALABRA 30
#define SIZE_MAX_ALFABETO 55

/* DEFINICION DE TIPOS */
    
struct nodo  
    
{  
         
char palabra[30];  
         
struct nodo*sig;  
    };  

    
typedef struct nodo listaPalabra;  

/* DEFINICION DE VARIABLES GLOBALES */
    
char variable[30];
    
int vida =5
 
/* PROTOTIPOS DE FUNCIONES */
    
void menu();
    
void Jugar(); 
    
listaPalabra crearLista(listaPalabra *inicio);
    
listaPalabra *insertarEnLista(char palabra[30],listaPalabra *inicio);
    
listaPalabra *buscarPalabra (listaPalabra *lista);
    
void desarrollo(int cantidadint i);
    
void limpiarCadena(char *cadena,int size);    
    
int validarCantidad(int *cantidad);
    
char entradaDatos(char palabra[], char introducidas[],char restantes[], int cantidadint i,char letra);    
    
void interfaz(char palabra[], char introducidas[],char restantes[], int cantidadint i);
    
void mensajeGanar(int cantidad);
    
void mensajePerder();
    
void modificarArchivo(listaPalabra *listaAux);

/* FUNCION PRINCIPAL */
    
int main()  
    {  
        
menu();  
        return(
0);  
    }  
    
/* FUNCION PARA MOSTRAR EL MENU PRINCIPAL */
void menu()  
{
char resp;  
  do  
  { 
system ("color 3");   
    
system("cls");  
    
printf("\n\n\t\t      * * * * * MENU DE OPCIONES * * * * *");  
    
printf("\n\t\t---------------------------------------------------");  
    
printf("\n\t\t\t      Juego de el ahorcado ");  
    
printf("\n\t\t---------------------------------------------------\n\n\n\n");  
    
printf("\t\t\t\t   (1) Jugar \n");  
    
printf("\t\t\t\t   (0) salir\n");  
    do 
    {   
        
fflush(stdin);
        
resp=getch();  
    }while (
resp '0' || resp '1');  
      switch(
resp)  
      {  
          case 
'1'Jugar();  
                    break;  
          case 
'0'system("cls");
                 
printf("\n\n\n\n    **    *  *****  ******       **       ** ******  **    **  *****  ******    ");
                 
printf("    * *   *  *   *  **            **     **  **      * *  * *  *   *  **        ");
                 
printf("    *  *  *  *   *   ***           **   **   ****    *  **  *  *   *   ***      ");
                 
printf("    *   * *  *   *     ***          ** **    **      *      *  *   *     ***    ");
                 
printf("    *    **  *****  ******           ***     ******  *      *  *****  ******    ");  
                    break;  
      }  
  }  
  while(
resp!='0');  
}  

void imprimir (listaPalabra *lista)
{
     
listaPalabra *auxiliar;
     
auxiliar lista;
     
     while (
auxiliar != NULL)
     {
           
printf("%s la lista:\n",auxiliar->palabra);
           
auxiliar auxiliar->sig;
     }
     
     return;
}

/* FUNCION PARA CARGAR ARCHIVO Y LLENAR LISTA PARA JUGAR */
    
void Jugar() 
     {  
        
system ("color b");  
         
system("cls");  
         
int cantidad,i,j,aux,x,indice,z,conseguido,listaLlena=0,nuevoNumero,comprobarNumero,continuar=0;  
         
char caracter,palabra[30];
                  
        
// PEDIMOS CANTIDAD DE PALABRAS Y SE VALIDA QUE SEA ENTRE 3 Y 10 
         
printf("\n\n\n\n\n\n\t\tCon cuantas palabras desea jugar? (3 a 10)\n"); 
         
cantidad=validarCantidad(&cantidad);      
         
// INICIALIZAMOS VARIABLES Y LISTA, Y LIMPIAMOS PALABRA 
         
x=1j=0vida=5;
         
listaPalabra*lista;
        
listaPalabra*listaAux
        
limpiarCadena(palabra,SIZE_MAX_PALABRA); 
         
lista=crearLista(lista);
         
listaAux=crearLista(listaAux);
         
         
//lista=crearLista(listaAux);
        // BUCLE QUE RECORRE DEPENDIENDO DE LA CANTIDAD DE PALABRAS QUE EL USUARIO DESEE, Y LAS ALMACENA EN UNA LISTA  
         
for (i=1;i<=cantidad;i++)  
         {  
             
conseguido=0;
               
FILE *archivo;  
               
archivofopen("listaDePalabras.txt","r");   
               if (
archivo== NULL)  
               {  
                
printf("El archivo no se encuentra"); // VALIDADACION DE QUE EXISTA EL ARCHIVO
               
}  
            else  
            {    
// BUCLE HASTA EL FINAL DEL ARCHIVO                         
                
while (feof(archivo)==0)  
                {  
                    do  
// BUCLE QUE VALIDA QUE EL CARACTER NO SEA UN SALTO DE LINEA  
                    
{   
                     
caracter=fgetc(archivo);  
                    }while((
caracter=='\n'));  
                       
                    if (
caracter!=';'// CONDICIONAL QUE VALIDA QUE AUN NO SE HA LLEGADO AL PUNTO Y COMA  
                    
{                        
                        
palabra[j]=caracter;  // MIENTRAS NO SE LLEGUE AL PUNTO Y COMA, GUARDA EL CARACTER EN PALABRA
                        
j++;  
                    }  
                    else  
                    {   
                        
fscanf(archivo,"%d",&aux);
                        
//caracter=fgetc(archivo);  // SI SE LLEGO AL PUNTO Y COMA, SE LEE EL SIGUIENTE CARACTER QUE SERIA EL NUMERO
                        //aux= (int)(caracter-48);   // SE CONVIERTE ESTE NUMERO EN ENTERO
                        
if (caracter=fgetc(archivo)!='\n')  // Y SE PREGUNTA SI HAY UN SALTO DE LINEA, PORQUE DE NO HABERLO ES DECIR QUE ES EL NUMERO 10
                        
{
                               
aux*=10;        // SI HAY SALTO DE LINEA SE MULTIPLICA EL AUX POR 10, Y NOS QUEDARIA EL NUMERO 10 GUARDADO EN AUX.                         
                          
}                   // OJO!!! ESTO SE HIZO ASI PORQUE SOLO TRABAJAREMOS CON 10 PALABRAS, SI HAY MAS DE 10, ESTA FORMA NO FUNCIONARA   
                          
if (aux==i)  // SE COMPARA EL NUMERO DE LA PALABRA CON EL NUMERO QUE ESTAMOS BUSCANDO
                          
{                                                            
                             
lista=insertarEnLista(palabra,lista);    // SI ES EL NUMERO QUE BUSCAMOS, SE GUARDA EN LA LISTA        
                            
conseguido=1;                                                            
                          }
                         if (
listaLlena==0) {      // ESTE CONDICIONAL LLENA UNA LISTA AUXILIAR QUE SERA USADA PARA LLENAR EL ARCHIVO .TXT
                        
listaAux=insertarEnLista(palabra,listaAux);    //ESTE IF SE EJECUTA SOLO LA PRIMERA VEZ DEL CICLO, YA LUEGO NO ENTRA MAS
                      
}                                    
                          
limpiarCadena(palabra,SIZE_MAX_PALABRA); // SE LIMPIA LA PALABRA PARA ASI PODER ALMACENAR LA SIGUIENTE
                          
j=0;                         
                    }                       
                }
                
listaLlena=1// ESTA ASIGNACION ES PARA QUE NO SE LLENE MAS LA LISTA AUXILIAR
                
if (conseguido==0)   // valida que realmente halla la cantidad de palabras correctas
                
{
                    
printf("\n Disculpe pero hay menos palabras que las deseadas, verifique el archivo \n\n\n\n"); //se avisa al usuario del error
                    
vida=-1;        // se asigna -1 para que no continue con el juego y regrese al menu principal
                    
system ("PAUSE");  // se hace una pausa para que el usuario lea el mensaje
                    
break;             // se rompe el ciclo
                
}    
                
close(archivo);  // CERRAMOS EL ARCHIVO
            
}  
          }              
          
// BUCLE PARA BUSCAR PALABRA POR PALABRA Y LLAMAR A DESARROLLO 
          
        
for(1<=cantidadz++) 
         { 
               
lista=buscarPalabra(lista);   
             
desarrollo(cantidad,z);   //LA VARIABLE Z ES USADA SOLO PARA SABER EN QUE PALABRA ESTAMOS E IMPRIMIRLO POR PANTALLA       
        
}      
        
modificarArchivo(listaAux);           
    }  
    
      
void modificarArchivo(listaPalabra *listaAux)
      {
          
int numeroNuevo,i,continuar=1,j=0,contador;
          
char numero,comprobarNumero[10];
          
FILE *archivo1;
          
archivo1fopen("listaDePalabras.txt","w");
          for (
contador=0;contador<10contador++)
          {      
                 
listaAux=buscarPalabra(listaAux);
            do
              {          
                
numeroNuevo=(rand() % 10);
                
numero= (char)(numeroNuevo+48);
                
continuar=1;
                for (
i=0i<strlen(comprobarNumero);i++)
                {
                    if (
comprobarNumero[i]==numero)
                    {
                        
continuar=0;                        
                    }                    
                }
               }while(
continuar==0);
            
fprintf(archivo1,"%s%s%i\n",variable,";",numeroNuevo+1); 
            
comprobarNumero[j]=numero;
            
j++;
        }
        
fclose(archivo1);
             
      }

/* FUNCION INICIALIZAR LISTA */
    
listaPalabra crearLista(listaPalabra *inicio)  
    {  
           
inicio=NULL;  
           return 
inicio;  
    } 
 
/* FUNCION PARA INSERTAR EN LISTA */
    
listaPalabra *insertarEnLista(char palabra[30],listaPalabra *inicio)  
    {  
        
listaPalabra *nuevoNodo;  
        
listaPalabra *aux;  
         
        
nuevoNodo=(listaPalabra*)malloc(sizeof(listaPalabra));  
        
strcpy(nuevoNodo->palabra,palabra); 
        
nuevoNodo->sig=NULL;      
         
        if (
inicio == NULL)  
        {  
            
inicio=nuevoNodo;                    
        }  
        else  
        {  
            
aux=inicio;              
            while (
aux->sig !=NULL)  
            {  
                  
aux=aux->sig;                   
            }             
            
aux->sig=nuevoNodo;             
        }    
        return 
inicio;      
    }
    
/* FUNCION PARA RECORRER LISTA EN BUSCA DE LA PALABRA */
    
listaPalabra *buscarPalabra (listaPalabra *lista
    { 
        
//int indice;
         
if (lista != NULL
         {
            
char aux[25];                
            
listaPalabra *auxiliar;                    
            
auxiliar lista;                            
            
strcpy(variable,lista->palabra);          
            
lista lista->sig;            
         }            
         return 
lista;      
    } 
    
/* FUNCION QUE DESARROLLA LA PARTIDA DEL JUEGO */
    
void desarrollo(int cantidadint i
    { 
        
system("color a");
        
int cont=0,indice,contador=0,adivino,encontrada
        
char letra,resp,palabra[50],introducidas[55],restantes[55];
        
char aux[55]="A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z   "
         
        
// INICIALIZAR VARIABLES EN SU VALOR ORIGINAL 
        
limpiarCadena(palabra,SIZE_MAX_PALABRA);
        
limpiarCadena(introducidas,SIZE_MAX_ALFABETO);
        
strcpy(restantes,aux);
    
        
// BUCLE PARA LLENAR LA PALABRA DE RAYAS Y ESPACIOS 
           
for (indice=0;indice < (strlen(variable))*2;indice+=2
        { 
            
palabra[indice]=95
            
palabra[indice+1]=32
        }             
        
indice=0;
    
        
// BUCLE QUE SE MANTIENE DURATE TODA LA PALABRA O LA PARTIDA, HASTA QUE LA PALABRA NO ACABE O LAS VIDAS NO SE ACABEN 
        
while((vida 0) && (cont strlen(variable))) 
        {                      
            
letra=entradaDatos(palabra,introducidas,restantes,cantidad,i,letra);
           
           
// BUCLE QUE VALIDA QUE YA HALLAS METIDO ESA LETRA 
            
for (contador=0,encontrada=0;contador<25;contador++)
            {     
                  if (
letra==introducidas[contador])
                  {
                     
encontrada=1;
                     break;
                  }
            }
        
            
// BUCLE QUE ACTUALIZA LAS LETRAS EN RESTANTES
            
for (contador=0;(contador<52) && (encontrada==0);contador++)
            {
                  if (
restantes[contador]==letra)
                  {
                      while(
contador<52)
                      {                           
                          
restantes[contador]=restantes[contador+2];
                          
restantes[contador+1]=restantes[contador+3];
                          
contador++;
                      }
                      break;
                   }   
            }    
        
             
// BUCLE QUE INTERCAMBIA LA RAYA POR LA LETRA EN CASO DE QUE SI ADIVINE LA LETRA     
            
for (contador=0,adivino=0;(contador strlen(variable)) && (encontrada==0);contador++) 
            {          
                   if(
letra==variable[contador]) 
                   { 
                       
palabra[contador*2]=letra;  
                       
adivino=1
                       
cont++;        
                   }         
            }             
        
            
// CONDICIONAL QUE AGRAGA LA LETRA A INTRODUCIDAS  
            
if (encontrada==0)
            {
                   
introducidas[indice]=letra
                   
introducidas[indice+1]=45;
                   
indice+=2;
            }           
            
            
// CONDICIONAL QUE QUITA UNA VIDA, SI NO ADIVINO Y SI LA LETRA NO HA SIDO INTRODUCIDA AUN 
            
if ((adivino==0) && (encontrada==0)) 
            { 
                
vida--; 
            }              
        }
    
        
// CONDICIONAL PARA CUANDO PIERDAS TODDAS LAS VIDAS, MUESTRE MENSAJE 
        
if (vida==0)
        {
               
mensajePerder();  
           }    
    
        
// CONDICIONAL PARA CUANDO ADIVINES TODAS LAS PALABRAS Y AUN TENGAS VIDAS 
        
if ((== cantidad) && (vida >0)) 
        {    
             
mensajeGanar(cantidad);
        }
    }
    
/* FUNCION PARA LIMPIAR LAS CADENAS NECESARIAS */
    
void limpiarCadena(char *cadena,int size)
    {
        
int indice;
        for(
indice 0indice sizecadena[indice++] = '\0');  
    }

/* FUNCION PARA VALIDAR LA CANTIDAD DE PALABRAS INTRODUCIDAS POR EL USUARIO */
    
int validarCantidad(int *cantidad)
    {
        
int continuar=0;
        while (
continuar==0)
        {                        
            
fflush(stdin);  
            if (
scanf("%d",cantidad))
            {                     
                 if((*
cantidad 3) || (*cantidad 10)) 
                    {
                        
system("cls");
                        
printf("\n\n\n\n\n\n\t\tCon cuantas palabras desea jugar? (3 a 10)");       
                           
printf("\n\n\t   Debe introducir un numero comprendido entre 3 y 10 \n");               
                    }
                    else 
                    {
                        
continuar=1;
                    }                          
            }
            else
            {
                  
system("cls");
                
printf("\n\n\n\n\n\n\t\tCon cuantas palabras desea jugar? (3 a 10)");       
                   
printf("\n\n\t             Debe introducir unicamente numeros \n");    
            }
        }
         return *
cantidad;
    }

/* FUNCION VALIDAR ENTRADA DE DATOS */
    
char entradaDatos(char palabra[], char introducidas[],char restantes[], int cantidadint i,char letra)
    { 
        
char resp;
         do
        {                     
            
interfaz(palabra,introducidas,restantes,cantidad,i);
            
fflush(stdin);
            
letra=getch();
            if (
letra>=97 && letra<=122)
            { 
               
letra-=32
            }
            if (
letra==48)
            {
              do
              {    
                 
fflush(stdin);            
                
printf("\n Esta seguro de abandonar la partida? S/N");
                
fflush(stdin);
                
resp=getch();
                if (
resp>=97 && resp<=122)
                { 
                   
resp-=32;
                }
                if (
resp=='S'
                {            
                    
vida=-1;
                }
                if (
resp=='N'
                {
                      
letra=00;
                }
              }
            while ((
resp>00 && resp<=77) || (resp>=79 && resp<=82)||(resp>=84 && resp<=255));
            }
        }while((
letra>=00 && letra<=47) || (letra>=49 && letra<=64) || (letra>=91 && letra<=255));
        return 
letra;    
    }

/* FUNCION PARA MOSTRAR INTERFAZ PRINCIPAL DEL JUEGO */
    
void interfaz(char palabra[], char introducidas[],char restantes[], int cantidadint i)
    {
          
int contador;
          
system("cls"); 
            
printf("\n\n\n      %s \n\n",palabra);         
               
printf("\n\n     Letras introducidas= %s",introducidas); 
             
printf("\n\n     Letras restantes= %s",restantes);  
              
printf("\n\n     palabra %i de %i ",i,cantidad); 
              
printf("\n\n\n     Vidas(%i)= ",vida); 
             
contador=0;         
            while (
contador<vida
            {  
                
printf(" %c ",3);  
                
contador++; 
            }          
            
printf("\n\n\n     Salir de la partida tecla(0)"); 
            
printf("\n\n\n\n\t                          Ingrese letra\n");
    }
    
/* FUNCION PARA MOSTRAR MENSAJE POR GANAR */
    
void mensajeGanar(int cantidad)
    { 
char resp;    
        do
           {
               
system("cls");system("color b"); 
               
printf("\n\n\n    ******     ***     ***    **     ***     ******  ******** ******     ");
               
printf("\n    **        ** **    ** **  **    ** **    ***        **    **       ");
               
printf("\n    ** ***   **   **   **  ** **   **   **     **       **    ***       ");
               
printf("\n    **   *  ** *** **  **   ****  ** *** **     ***     **    **        ");
               
printf("\n    ****** **       ** **    *** **       ** ******     **    ******     ");
               
printf("\n\n\n              FELICIDADES!!! Logro adivinar las %i palabras",cantidad);
               
printf("\n\n                      Desea volver a jugar? S/N \n\n");
                  
fflush(stdin);
               
resp=getch();
               if (
resp>=97 && resp<=122)
               { 
                   
resp-=32;
               }
       }while ((
resp>=00 && resp<=77) || (resp>=79 && resp<=82)||(resp>=84 && resp<=255));
       switch(
resp)  
       {  
               case 
'S'Jugar();   
                      break;  
            case 
'N'vida--;  
                      break;  
       } 
    }

/* FUNCION PARA MOSTRAR MENSAJE POR PERDER */
    
void mensajePerder()
    {  
char resp;
        if(
vida!=-1)
           {
           do
           {
               
system("cls"); 
               
printf("\n\n\n\n  ******     ***     ***     ***  ******     ******* **       ** ****** ******* ");
               
printf("  **        ** **    ** ** ** **  **         **   **  **     **  **     **   ** ");
               
printf("  ** ***   **   **   **  ***  **  ****       **   **   **   **   ****   ******  ");
               
printf("  **   *  ** *** **  **       **  **         **   **    ** **    **     **   ** ");
               
printf("  ****** **       ** **       **  ******     *******     ***     ****** **    **"); 
            
printf("\n\n                 lo siento! mejor suerte para la proxima ;) \n\n"); 
               
printf("\n\n                         Desea volver a jugar? S/N \n\n");
                  
fflush(stdin);
               
resp=getch();
               if (
resp>=97 && resp<=122)
               { 
                   
resp-=32;
               }
               }while ((
resp>=00 && resp<=77) || (resp>=79 && resp<=82)||(resp>=84 && resp<=255));
               switch(
resp)  
               {  
                  case 
'S'Jugar(); 
                          break;  
                  case 
'N'vida--;  
                          break;  
               } 
       }
    } 
Responder Con Cita
  #26  
Antiguo 05-12-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
sin verlo en el depurador no puedo decirte pero tiene toda la pinta de que al terminar la primera vez se queda algo residual en el flujo de entrada. Prueba a poner un fflush(stdin) antes de la funcion que rellena la lista. Seguramente no sea un espacio sino un salto de pagina o eof o algo asi.
Responder Con Cita
  #27  
Antiguo 05-12-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
mira, estoy en la calle viendolo desde el movil pero creo que di con el fallo. Tienes dos funciones, ganar y perder o algo asi donde muestras el mensaje de que gana o pierde y luego preguntas si quiere jugar una nueva partida y usas un fgetch para obtener la respuesta. Pon un fflush(stdin) despues de ese fgetch en ambas funciones y si tienes mas comprobaciones de ese estilo en otras funciones haz igual. ¿Cual es el problema? fgetch() captura un caracter pero tu en realidad introduces 2, el que deseas y el intro que es un salto de linea. Asegurate siempre de si es necesario un fflush detras de un getch o fgetch (será necesario siempre que se tenga que ntroducir un caracter por teclado y pulsar intro. Ya nos cuentas si se solucionó. Por cierto, si el trabajo tiene que ser en C, no puede haber declaraciones de variables en cualquier sitio, eso se permite en c++ pero en c no.
Responder Con Cita
  #28  
Antiguo 06-12-2014
jcdca jcdca is offline
Miembro
NULL
 
Registrado: nov 2014
Posts: 15
Poder: 0
jcdca Va por buen camino
si tienes razón no es un espacio en blanco, pensé que si porque cuando imprimía la lista para ver que pasaba, una de las palabras salia mas separada del margen que las otras por eso pensé que era un espacio, pero no lo es, ya lo comprobé, puse el fflush que me dijiste cuando relleno la lista, pero nada, sigue poniéndome ese carácter, no se que pueda ser jeje

y en cuanto a los fflush que me dices que faltan en la parte de mostrar los mensajes si gane o perdí, debe ser que lo viste mal, si los tengo, o sea que eso tampoco es. y los de las variables en cualquier lugar imagino que te refierieres a la que declaro como globales fuera de las funciones no? o a alguna que tengo en medio de alguna sentencia o algo así?
Responder Con Cita
  #29  
Antiguo 06-12-2014
jcdca jcdca is offline
Miembro
NULL
 
Registrado: nov 2014
Posts: 15
Poder: 0
jcdca Va por buen camino
lo depure y la segunda vez que pasa, con la palabara queso, que es la primera del archivo me la agrega con '377QUESO' y no se porque hace eso, la variable que contiene la palabra se llama justamente así, variable, y la limpio antes de agregar la nueva palabra, es decir que ya se bebe guardar así con esos números en la lista, pero cuando yo lo guardo en la lista, la guardo con una variable llamada palabra, esa también la limpio, y esa palabra la lleno con la variable caracter que es la que recorre el archivo, y esa variable caracter la valide con un ciclo, del cual no se sale si caracter es algo distinto a una letra o un punto y como, es decir lo único que puede a ver en esa palabra son letras, como llegan esos numero no se jejeje
Responder Con Cita
  #30  
Antiguo 06-12-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Antes de nada pido perdon a los admins por lo que voy a hacer pero el movil en esta web no me deja poner saltos de linea y supongo que es por algun script.
Código:
printf("\n                                                                         "); 

printf("\n\n\n              FELICIDADES!!! Logro adivinar las %i palabras",cantidad); 

printf("\n\n                      Desea volver a jugar? S/N \n\n"); 

fflush(stdin); 

resp=getch(); 

if (resp>=97 && resp<=122)
   resp-=32;
while ((resp>=00 && resp<=77) || (resp>=79 && resp<=82)||(resp>=84 && resp<=255)); 

  switch(resp)   


justo despues del getch necesitas un fflush para limpiar el flujo de entrada ya que al salir del while tendras un '\n' residual que se meterá en el primer lugar que solicites info con un scanf o getch. En la de perdiste igual. Lo otro, cuando yo creo un proyecto de C y pego tu codigo saltan las alarmas, en C no puedes declarar variables en cualquier sitio, en una funcion cambias el color del texto de la consola y luego declaras una variable. A mi en C no me deja ni compilar ya que eso no se permite.

Última edición por nlsgarcia fecha: 06-12-2014 a las 23:50:21. Razón: Sintaxis Code
Responder Con Cita
  #31  
Antiguo 06-12-2014
jcdca jcdca is offline
Miembro
NULL
 
Registrado: nov 2014
Posts: 15
Poder: 0
jcdca Va por buen camino
aa ok no sabia que despues habia que poner otro, pense que solo era antes del getch, bueno ya se lo pongo y lo de la variable, debe ser que se me paso, voy a revisar todo el codigo a ver, no sabia eso de c pero igual yo siempre las coloco al principio de la funcion por costumbre, debe ser que se me paso, y ya solucione lo del problema de la palabra, ya les dijo que era y les paso el codigo final
Responder Con Cita
  #32  
Antiguo 07-12-2014
jcdca jcdca is offline
Miembro
NULL
 
Registrado: nov 2014
Posts: 15
Poder: 0
jcdca Va por buen camino
bueno aquí esta, puse en verde lo que le agregue... el problema era que cuando llega al final del archivo, el entra en el ciclo donde se valida que caracter sea distinto de \n... y después de ese ciclo, hay un if que valida el punto y coma, pero como es el final del archivo a caracter en ese momento le agraga '377' porque ya no hay nada en el archivo, y cuando vuelvo a abrir el archivo tengo que limpiar la variable palabra para que no tenga ese '377', solo pasa con la palabra que esta al principio porque para las demás si limpiaba la palabra, pero antes de empezar ese ciclo no la limpiaba, por eso el error... era una tontería jeje, pero bueno suele pasar. acomode las variables, lo tenia así en varios sitios, no me di cuenta.Gracias

Código PHP:
#include <stdio.h>  
#include <stdlib.h>  
#include <string.h> 

#define SIZE_MAX_PALABRA 30
#define SIZE_MAX_ALFABETO 55

/* DEFINICION DE TIPOS */
    
struct nodo  
    
{  
         
char palabra[30];  
         
struct nodo*sig;  
    };  

    
typedef struct nodo listaPalabra;  

/* DEFINICION DE VARIABLES GLOBALES */
    
char variable[30];
    
int vida =5
 
/* PROTOTIPOS DE FUNCIONES */
    
void menu();
    
void Jugar(); 
    
listaPalabra crearLista(listaPalabra *inicio);
    
listaPalabra *insertarEnLista(char palabra[30],listaPalabra *inicio);
    
listaPalabra *buscarPalabra (listaPalabra *lista);
    
void desarrollo(int cantidadint i,listaPalabra *listaAux);
    
void limpiarCadena(char *cadena,int size);    
    
int validarCantidad(int *cantidad);
    
char entradaDatos(char palabra[], char introducidas[],char restantes[], int cantidadint i,char letra);    
    
void interfaz(char palabra[], char introducidas[],char restantes[], int cantidadint i);
    
void mensajeGanar(int cantidad,listaPalabra *listaAux);
    
void mensajePerder(listaPalabra *listaAux);
    
void modificarArchivo(listaPalabra *listaAux);

/* FUNCION PRINCIPAL */
    
int main()  
    {  
        
menu();  
        return(
0);  
    }  
    
/* FUNCION PARA MOSTRAR EL MENU PRINCIPAL */
void menu()  
{
char resp;  
  do  
  { 
system ("color 3");   
    
system("cls");  
    
printf("\n\n\t\t      * * * * * MENU DE OPCIONES * * * * *");  
    
printf("\n\t\t---------------------------------------------------");  
    
printf("\n\t\t\t      Juego de el ahorcado ");  
    
printf("\n\t\t---------------------------------------------------\n\n\n\n");  
    
printf("\t\t\t\t   (1) Jugar \n");  
    
printf("\t\t\t\t   (0) salir\n");  
    do 
    {   
        
fflush(stdin);
        
resp=getch();  
    }while (
resp '0' || resp '1');  
      switch(
resp)  
      {  
          case 
'1'Jugar();  
                    break;  
          case 
'0'system("cls");
                 
printf("\n\n\n\n    **    *  *****  ******       **       ** ******  **    **  *****  ******    ");
                 
printf("    * *   *  *   *  **            **     **  **      * *  * *  *   *  **        ");
                 
printf("    *  *  *  *   *   ***           **   **   ****    *  **  *  *   *   ***      ");
                 
printf("    *   * *  *   *     ***          ** **    **      *      *  *   *     ***    ");
                 
printf("    *    **  *****  ******           ***     ******  *      *  *****  ******    ");  
                    break;  
      }  
  }  
  while(
resp!='0');  
}  

/* FUNCION PARA CARGAR ARCHIVO Y LLENAR LISTA PARA JUGAR */
    
void Jugar() 
     {       
         
int cantidad,i,j,aux,x,indice,z,conseguido,listaLlena=0,nuevoNumero,comprobarNumero,continuar=0;  
         
char caracter,palabra[30];
         
         
system ("color b");  
         
system("cls"); 
                  
        
// PEDIMOS CANTIDAD DE PALABRAS Y SE VALIDA QUE SEA ENTRE 3 Y 10 
         
printf("\n\n\n\n\n\n\t\tCon cuantas palabras desea jugar? (3 a 10)\n"); 
         
cantidad=validarCantidad(&cantidad);      
         
// INICIALIZAMOS VARIABLES Y LISTA, Y LIMPIAMOS PALABRA 
        
x=1j=0vida=5;
         
listaPalabra*lista;
        
listaPalabra*listaAux
        
limpiarCadena(palabra,SIZE_MAX_PALABRA); 
         
lista=crearLista(lista);
         
listaAux=crearLista(listaAux);
         
         
//lista=crearLista(listaAux);
        // BUCLE QUE RECORRE DEPENDIENDO DE LA CANTIDAD DE PALABRAS QUE EL USUARIO DESEE, Y LAS ALMACENA EN UNA LISTA  
         
for (i=1;i<=cantidad;i++)  
         {   
             
conseguido=0;
               
FILE *archivo;  
               
archivofopen("listaDePalabras.txt","r");   
               if (
archivo== NULL)  
               {  
                
printf("El archivo no se encuentra"); // VALIDADACION DE QUE EXISTA EL ARCHIVO
               
}  
            else  
            {    
// BUCLE HASTA EL FINAL DEL ARCHIVO 
               
[color="lime"limpiarCadena(palabra,SIZE_MAX_PALABRA);
                
j=0;[/color]                                         
                while (
feof(archivo)==0)  
                {  
                    do  
// BUCLE QUE VALIDA QUE EL CARACTER NO SEA UN SALTO DE LINEA  
                    
{   
                     
caracter=fgetc(archivo);  
                    }while (
caracter=='\n');  
                       
                    if (
caracter!=';'// CONDICIONAL QUE VALIDA QUE AUN NO SE HA LLEGADO AL PUNTO Y COMA  
                    
{                        
                        
palabra[j]=caracter;  // MIENTRAS NO SE LLEGUE AL PUNTO Y COMA, GUARDA EL CARACTER EN PALABRA
                        
j++;  
                    }  
                    else  
                    {   
                        
fscanf(archivo,"%d",&aux);
                          if (
aux==i)  // SE COMPARA EL NUMERO DE LA PALABRA CON EL NUMERO QUE ESTAMOS BUSCANDO
                          
{                                                            
                             
fflush(stdin);
                            
lista=insertarEnLista(palabra,lista);    // SI ES EL NUMERO QUE BUSCAMOS, SE GUARDA EN LA LISTA        
                            
conseguido=1;                                                            
                          }
                         if (
listaLlena==0) {      // ESTE CONDICIONAL LLENA UNA LISTA AUXILIAR QUE SERA USADA PARA LLENAR EL ARCHIVO .TXT
                        
listaAux=insertarEnLista(palabra,listaAux);    //ESTE IF SE EJECUTA SOLO LA PRIMERA VEZ DEL CICLO, YA LUEGO NO ENTRA MAS
                      
}                                    
                          
limpiarCadena(palabra,SIZE_MAX_PALABRA); // SE LIMPIA LA PALABRA PARA ASI PODER ALMACENAR LA SIGUIENTE
                          
j=0;                         
                    }                       
                }
                
                
listaLlena=1// ESTA ASIGNACION ES PARA QUE NO SE LLENE MAS LA LISTA AUXILIAR
                
if (conseguido==0)   // valida que realmente halla la cantidad de palabras correctas
                
{
                    
printf("\n Disculpe pero hay menos palabras que las deseadas, verifique el archivo \n\n\n\n"); //se avisa al usuario del error
                    
vida=-1;        // se asigna -1 para que no continue con el juego y regrese al menu principal
                    
system ("PAUSE");  // se hace una pausa para que el usuario lea el mensaje
                    
break;             // se rompe el ciclo
                
}    
                
fclose(archivo);  // CERRAMOS EL ARCHIVO
            
}  
          }              
          
// BUCLE PARA BUSCAR PALABRA POR PALABRA Y LLAMAR A DESARROLLO       
        
for(1<=cantidadz++) 
         { 
               
lista=buscarPalabra(lista);   
             
desarrollo(cantidad,z,listaAux);   //LA VARIABLE Z ES USADA SOLO PARA SABER EN QUE PALABRA ESTAMOS E IMPRIMIRLO POR PANTALLA       
        
}      
        
modificarArchivo(listaAux);           
    }      

/* FUNCION INICIALIZAR LISTA */
    
listaPalabra crearLista(listaPalabra *inicio)  
    {  
           
inicio=NULL;  
           return 
inicio;  
    } 
 
/* FUNCION PARA INSERTAR EN LISTA */
    
listaPalabra *insertarEnLista(char palabra[30],listaPalabra *inicio)  
    {  
        
listaPalabra *nuevoNodo;  
        
listaPalabra *aux;  
         
        
nuevoNodo=(listaPalabra*)malloc(sizeof(listaPalabra));  
        
strcpy(nuevoNodo->palabra,palabra); 
        
nuevoNodo->sig=NULL;      
         
        if (
inicio == NULL)  
        {  
            
inicio=nuevoNodo;                    
        }  
        else  
        {  
            
aux=inicio;              
            while (
aux->sig !=NULL)  
            {  
                  
aux=aux->sig;                   
            }             
            
aux->sig=nuevoNodo;             
        }    
        return 
inicio;      
    }
    
/* FUNCION PARA RECORRER LISTA EN BUSCA DE LA PALABRA */
    
listaPalabra *buscarPalabra (listaPalabra *lista
    { 
         if (
lista != NULL
         {
            
char aux[25];                
            
listaPalabra *auxiliar;                    
            
auxiliar lista
            
limpiarCadena(variable,SIZE_MAX_PALABRA);                           
            
strcpy(variable,lista->palabra);          
            
lista lista->sig;            
         }            
         return 
lista;      
    } 
    
/* FUNCION QUE DESARROLLA LA PARTIDA DEL JUEGO */
    
void desarrollo(int cantidadint i,listaPalabra *listaAux
    {         
        
int cont=0,indice,contador=0,adivino,encontrada
        
char letra,resp,palabra[50],introducidas[55],restantes[55];
        
char aux[55]="A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z   ";
        
        
system("color a"); 
         
        
// INICIALIZAR VARIABLES EN SU VALOR ORIGINAL 
        
limpiarCadena(palabra,SIZE_MAX_PALABRA);  //PARA ASI INICIAR LA PALABRA NUEVA EN BLANCO
        
limpiarCadena(introducidas,SIZE_MAX_ALFABETO);//PARA ASI INICIAR LA PALABRA NUEVA EN BLANCO
        
strcpy(restantes,aux);//PARA ASI INICIAR LA PALABRA NUEVA CON TODAS LAS LETRAS DEL ABECEDARIO
    
        // BUCLE PARA LLENAR LA PALABRA DE RAYAS Y ESPACIOS 
           
for (indice=0;indice < (strlen(variable))*2;indice+=2
        { 
            
palabra[indice]=95;  //RAYAS EN CODIGO ASCII
            
palabra[indice+1]=32//ESPACIO EN BLANCO EN CODIGO ASCII
        
}             
        
indice=0;
    
        
// BUCLE QUE SE MANTIENE DURATE TODA LA PALABRA O LA PARTIDA, HASTA QUE LA PALABRA NO ACABE O LAS VIDAS NO SE ACABEN 
        
while((vida 0) && (cont strlen(variable))) 
        {                      
            
letra=entradaDatos(palabra,introducidas,restantes,cantidad,i,letra); //ENTRADA DE DATOS NOS DEVOLVERA LA LETRA INTRODUCIDA POR EL USUARIO
           
           // BUCLE QUE VALIDA QUE YA HALLAS METIDO ESA LETRA 
            
for (contador=0,encontrada=0;contador<25;contador++)
            {     
                  if (
letra==introducidas[contador])
                  {
                     
encontrada=1;           //SI ENCONTRADA ES =1  ENTONCES NO SE TE QUITARA UNA VIDA, PORQUE YA METISTE LA LETRA ANTES
                     
break;                  // Y TAMPOCO SE EJECUTARAN LAS INSTRUCCIONES SIGUIENTES
                  
}
            }
        
            
// BUCLE QUE ACTUALIZA LAS LETRAS EN RESTANTES
            
for (contador=0;(contador<52) && (encontrada==0);contador++) 
            {                                                            
                  if (
restantes[contador]==letra)
                  {
                      while(
contador<52)
                      {                           
                          
restantes[contador]=restantes[contador+2];
                          
restantes[contador+1]=restantes[contador+3];
                          
contador++;
                      }
                      break;
                   }   
            }    
        
             
// BUCLE QUE INTERCAMBIA LA RAYA POR LA LETRA EN CASO DE QUE SI ADIVINE LA LETRA     
            
for (contador=0,adivino=0;(contador strlen(variable)) && (encontrada==0);contador++) 
            {          
                   if(
letra==variable[contador]) 
                   { 
                       
palabra[contador*2]=letra;  //ASIGNAMOS LA LETRA EN LA POSICION DE LA PALABRA POR DOS(POR QUE SON DOS CARACTERES POR PALABRA, ESPACIO Y RAYA)
                       
adivino=1;                  //Y A ADIVINO LE ASIGNAMOS UNO PARA QUE NO RESTE UNA VIDA
                       
cont++;        
                   }         
            }             
        
            
// CONDICIONAL QUE AGRAGA LA LETRA A INTRODUCIDAS  
            
if (encontrada==0)
            {
                   
introducidas[indice]=letra
                   
introducidas[indice+1]=45;
                   
indice+=2;
            }           
            
            
// CONDICIONAL QUE QUITA UNA VIDA, SI NO ADIVINO Y SI LA LETRA NO HA SIDO INTRODUCIDA AUN 
            
if ((adivino==0) && (encontrada==0)) 
            { 
                
vida--; 
            }              
        }
    
        
// CONDICIONAL PARA CUANDO PIERDAS TODDAS LAS VIDAS, MUESTRE MENSAJE 
        
if (vida==0)
        {
               
mensajePerder(listaAux);  
           }    
    
        
// CONDICIONAL PARA CUANDO ADIVINES TODAS LAS PALABRAS Y AUN TENGAS VIDAS 
        
if ((== cantidad) && (vida >0)) 
        {    
             
mensajeGanar(cantidad,listaAux);
        }
    }
    
/* FUNCION PARA LIMPIAR LAS CADENAS NECESARIAS */
    
void limpiarCadena(char *cadena,int size)
    {
        
int indice;
        for(
indice 0indice sizecadena[indice++] = '\0');  
    }

/* FUNCION PARA VALIDAR LA CANTIDAD DE PALABRAS INTRODUCIDAS POR EL USUARIO */
    
int validarCantidad(int *cantidad)
    {
        
int continuar=0;
        while (
continuar==0)
        {                        
            
fflush(stdin);  
            if (
scanf("%d",cantidad))
            {                     
                 if((*
cantidad 3) || (*cantidad 10)) 
                    {
                        
system("cls");
                        
printf("\n\n\n\n\n\n\t\tCon cuantas palabras desea jugar? (3 a 10)");       
                           
printf("\n\n\t   Debe introducir un numero comprendido entre 3 y 10 \n");               
                    }
                    else 
                    {
                        
continuar=1;
                    }                          
            }
            else
            {
                  
system("cls");
                
printf("\n\n\n\n\n\n\t\tCon cuantas palabras desea jugar? (3 a 10)");       
                   
printf("\n\n\t             Debe introducir unicamente numeros \n");    
            }
        }
         return *
cantidad;
    }

/* FUNCION VALIDAR ENTRADA DE DATOS */
    
char entradaDatos(char palabra[], char introducidas[],char restantes[], int cantidadint i,char letra)
    { 
        
char resp;
         do
        {                     
            
interfaz(palabra,introducidas,restantes,cantidad,i);
            
fflush(stdin);
            
letra=getch();
            if (
letra>=97 && letra<=122)
            { 
               
letra-=32
            }
            if (
letra==48)
            {
              do
              {    
                 
fflush(stdin);            
                
printf("\n Esta seguro de abandonar la partida? S/N");
                
fflush(stdin);
                
resp=getch();
                if (
resp>=97 && resp<=122)
                { 
                   
resp-=32;
                }
                if (
resp=='S'
                {            
                    
vida=-1;
                }
                if (
resp=='N'
                {
                      
letra=00;
                }
              }
            while ((
resp>00 && resp<=77) || (resp>=79 && resp<=82)||(resp>=84 && resp<=255));
            }
        }while((
letra>=00 && letra<=47) || (letra>=49 && letra<=64) || (letra>=91 && letra<=255));
        return 
letra;    
    }

/* FUNCION PARA MOSTRAR INTERFAZ PRINCIPAL DEL JUEGO */
    
void interfaz(char palabra[], char introducidas[],char restantes[], int cantidadint i)
    {
              
int contador;
            
system("cls"); 
            
printf("\n\n\n      %s \n\n",palabra);         
               
printf("\n\n     Letras introducidas= %s",introducidas); 
             
printf("\n\n     Letras restantes= %s",restantes);  
              
printf("\n\n     palabra %i de %i ",i,cantidad); 
              
printf("\n\n\n     Vidas(%i)= ",vida); 
             
contador=0;         
            while (
contador<vida
            {  
                
printf(" %c ",3);  
                
contador++; 
            }          
            
printf("\n\n\n     Salir de la partida tecla(0)"); 
            
printf("\n\n\n\n\t                          Ingrese letra\n");
    }
    
/* FUNCION PARA MOSTRAR MENSAJE POR GANAR */
    
void mensajeGanar(int cantidad,listaPalabra *listaAux)
    { 
        
char resp;    
        do
           {
               
system("cls");system("color b"); 
               
printf("\n\n\n    ******     ***     ***    **     ***     ******  ******** ******     ");
               
printf("\n    **        ** **    ** **  **    ** **    ***        **    **       ");
               
printf("\n    ** ***   **   **   **  ** **   **   **     **       **    ***       ");
               
printf("\n    **   *  ** *** **  **   ****  ** *** **     ***     **    **        ");
               
printf("\n    ****** **       ** **    *** **       ** ******     **    ******     ");
               
printf("\n\n\n              FELICIDADES!!! Logro adivinar las %i palabras",cantidad);
               
printf("\n\n                      Desea volver a jugar? S/N \n\n");
                  
fflush(stdin);
               
resp=getch();
               
fflush(stdin);
               if (
resp>=97 && resp<=122)
               { 
                   
resp-=32;
               }
       }while ((
resp>=00 && resp<=77) || (resp>=79 && resp<=82)||(resp>=84 && resp<=255));
       switch(
resp)  
       {  
               case 
'S'modificarArchivo(listaAux);
                      
Jugar();   
                      break;  
            case 
'N'vida--;  
                      break;  
       } 
    }

/* FUNCION PARA MOSTRAR MENSAJE POR PERDER */
    
void mensajePerder(listaPalabra *listaAux)
    {  
        
char resp;
        if(
vida!=-1)
           {
           do
           {
               
system("cls"); 
               
printf("\n\n\n\n  ******     ***     ***     ***  ******     ******* **       ** ****** ******* ");
               
printf("  **        ** **    ** ** ** **  **         **   **  **     **  **     **   ** ");
               
printf("  ** ***   **   **   **  ***  **  ****       **   **   **   **   ****   ******  ");
               
printf("  **   *  ** *** **  **       **  **         **   **    ** **    **     **   ** ");
               
printf("  ****** **       ** **       **  ******     *******     ***     ****** **    **"); 
            
printf("\n\n                 lo siento! mejor suerte para la proxima ;) \n\n"); 
               
printf("\n\n                         Desea volver a jugar? S/N \n\n");
                  
fflush(stdin);
               
resp=getch();
               
fflush(stdin);
               if (
resp>=97 && resp<=122)
               { 
                   
resp-=32;
               }
               }while ((
resp>=00 && resp<=77) || (resp>=79 && resp<=82)||(resp>=84 && resp<=255));
               switch(
resp)  
               {  
                  case 
'S'modificarArchivo(listaAux); 
                            
Jugar(); 
                          break;  
                  case 
'N'vida--;  
                          break;  
               } 
       }
    }
    
//FUNCION PARA MODIFICAR EL ARCHIVO DE TEXTO
      
void modificarArchivo(listaPalabra *listaAux)
      {
          
int numeroNuevo,i,continuar=1,j=0,contador;
          
char numero,comprobarNumero[10];
          
limpiarCadena(comprobarNumero,10);
          
FILE *archivo1;                               //CREAMOS VARIABLE TIPO TEXTO
          
archivo1fopen("listaDePalabras.txt","w");   //ABRIMOS EL ARCHIVO EN MODO ESCRITURA
          
for (contador=0;contador<10contador++)      //CICLO QUE SE EJECUTA 10 VECES(LAS 10 PALABRAS)
          
{      
                 
listaAux=buscarPalabra(listaAux);         //BUSCAMOS LA PALABRA EN LA LISTA AUXILIAR 
            
do
              {          
                
numeroNuevo=(rand() % 10);            //GENERAMOS UN NUMERO ALETROIO MOD 10(ENTRE 0 Y 9)
                
numero= (char)(numeroNuevo+48);       //CAMBIAMOS EL NUMERO A CHAR
                
continuar=1;
                for (
i=0i<strlen(comprobarNumero);i++) //CILO HASTA QUE SE ACABE LA VARIABLE COMPROBARNUMERO(CONTIENE LOS NUMEROS QUE YA SALIERON)
                
{
                    if (
comprobarNumero[i]==numero)  //SI EL NUMERO SE ENCUENTRA EN LA CADENA, ES PORQUE YA SALIO ANTES
                    
{
                        
continuar=0;                  //COMO YA SALIO ANTES SE ASIGNA CERO A CONTINUAR PARA QUE SE REPITA EL CICLO    
                    
}                    
                }
               }while(
continuar==0);    // SE REPITE EL CICLO SOLO SI EL NUMERO YA SALIO
            
fprintf(archivo1,"%s;%i\n",variable,numeroNuevo+1); //SE ESCRIBE EN EL ARCHIVO LA PALABRA,EL ;, Y EL NUMERO ALETORIO MAS 1(SE SUMA UNO PORQUE EL NUMERO GENERADO ES ENTRE 0 Y 9)
            
comprobarNumero[j]=numero;               //SE GUARDA EL NUMERO GENERADO EN LA VARIABLE
            
j++;                                    //SE SUMA LA VARIABLE QUE INDICA LA POSICION DE LA VARIABLE COMPROBARNUMERO
        
}
        
fclose(archivo1);  //CERRAMOS EL ARCHIVO             
      

Responder Con Cita
  #33  
Antiguo 07-12-2014
jcdca jcdca is offline
Miembro
NULL
 
Registrado: nov 2014
Posts: 15
Poder: 0
jcdca Va por buen camino
jajaja no me lo puso en verde, bueno lo que esta encerrado entre el codigo que dice color="lime" eso es lo que agregue jejeje.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Guardar un DBGrid como archivo *.dbf richisaurio Conexión con bases de datos 13 25-01-2013 17:53:32
¿como guardar un archivo de texto como ANSI? JXJ Varios 2 09-09-2011 21:26:29
Posible Guardar QuickReport Como Archivo jirbert Varios 5 24-07-2008 10:27:40
Como guardar un TChart en archivo gif? crespopg Gráficos 1 04-05-2007 23:18:26
Como guardar un objeto en un archivo ? cmurua71 OOP 7 18-11-2005 21:26:30


La franja horaria es GMT +2. Ahora son las 16:25:15.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi