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 cantidad, int i);
void limpiarCadena(char *cadena,int size);
int validarCantidad(int *cantidad);
char entradaDatos(char palabra[], char introducidas[],char restantes[], int cantidad, int i,char letra);
void interfaz(char palabra[], char introducidas[],char restantes[], int cantidad, int 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=1; j=0; vida=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;
archivo= fopen("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(z = 1; z <=cantidad; z++)
{
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;
archivo1= fopen("listaDePalabras.txt","w");
for (contador=0;contador<10; contador++)
{
listaAux=buscarPalabra(listaAux);
do
{
numeroNuevo=(rand() % 10);
numero= (char)(numeroNuevo+48);
continuar=1;
for (i=0; i<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 cantidad, int 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 ((i == cantidad) && (vida >0))
{
mensajeGanar(cantidad);
}
}
/* FUNCION PARA LIMPIAR LAS CADENAS NECESARIAS */
void limpiarCadena(char *cadena,int size)
{
int indice;
for(indice = 0; indice < size; cadena[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 cantidad, int 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 cantidad, int 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;
}
}
}
|