Es una simulación de un juego de rol, en donde el usuario elige un personaje, y a través de diferentes situaciones, opta por distintos caminos, los cuales lo llevarán a uno de los tres desenlaces.
PERSONAJE nuevoPersonaje()
{
PERSONAJE cr;
cr.nombre = malloc(sizeof(char)*30); //Inicializar al personaje porque la estructura tiene un arreglo de caracteres
puts("¿Cuál es tu nombre? ");
gets(cr.nombre);
return cr;
}
ACERTIJOS nuevo_acertijo(int numero_acertijo){
FILE * f;
ACERTIJOS cr;
char * nombre = malloc(sizeof(char)*50);
srand(time(NULL)); //Semilla
sprintf(nombre, "Acertijos/Acertijo%i.acr",numero_acertijo );//Abre los acertijos de manera aleatoria (A partir del número uno)
f = fopen(nombre,"r");
fscanf(f, "%s", nombre);
while(fscanf(f, "%s", nombre) != EOF)
{
printf("%s", nombre);
printf(" ");
}
fclose(f);
printf("\n");
return cr;
}
//Analiza el número random que se le da, lo compara con el arreglo y si lo tiene pide otro. Si no, lo guarda y permite que se imprima el acertijo
int buscarNumero(int numero, int arreglo [], int tamanio)
{
int i, stop = 0;
for(i = 0; (i < tamanio && stop == 0); i++){
if(arreglo[i] == numero)
stop = 1;
}
return stop;
}
//La función de solucionario va a analizar cada uno de las respuestas que se le den al juego, si son correctas, el usuario podrá seguir jugando
int solucionario (char solucion[30], int numero_acertijo)
{
strlwr(); es una función que convierte a los caracteres que están en mayúsculas en minúsculas
strupr(); convierte a los caracteres que están en minúsculas a mayúsculas */
//**INICIO DEL JUEGO*****//
int main()
{
setvbuf(stdout, NULL, _IONBF, 0);
char opcion;
char solucion [30];
char * nombre;
int numeros [NUM_ACERTIJOS];
int random;
int fstop;
int control_acertijos = 0;
//PERSONAJE nuevo = nuevoPersonaje();//Se manda a llamar la función y se crea un nuevo personaje.
int limpieza = 0;
while (limpieza < 20)
{
numeros [limpieza] = 0;
limpieza ++;
} // Llena los números del arreglo con ceros, para quitarle la basura.
//CAP. 1.- EL PRISIONERO
puts("Prisionero: … Sé que mi hogar va a ser el mar, donde él esté, yo estoy… Yo-jo todos los marinos, la bandera izar, tiren fuerte, ladrones y pordioseros, nunca moriremos… Yo-jo todos juntos, la bandera izar…");
do
{
puts("¿Hay alguien allí?");
printf("a) Sí\nb) No\n");
fflush(stdin);
scanf("%c", &opcion);
} while(opcion != 'a' && opcion != 'A' && opcion != 'b' && opcion != 'B');
fflush(stdin);//¡¡¡ESTA COSA ES MÁGICAAAAAAAAA!!!
if(opcion == 'a' || opcion == 'A')
{
PERSONAJE nuevo = nuevoPersonaje();
printf("Prisionero: '¿%s?'\n", nuevo.nombre); // Manda llamar el nombre del nuevo personaje
}
else if(opcion == 'b' || opcion == 'B')
{
puts("Prisionero: Y somos tan malos como un huracán, todos brindando, Yo-jo...Yo-jo...Yo-jo piratas siempre seremos… ");
puts("Prisionero: ¡¿Quién está allí?!");
PERSONAJE nuevo = nuevoPersonaje();//Se manda a llamar la función y se crea un nuevo personaje.
printf("Prisionero: '¿%s?'\n", nuevo.nombre); // Manda llamar el nombre del nuevo personaje
}
//El prisionero pide que lo liberen
puts("Prisionero: Hace tiempo que no venía nadie por aquí...");
do
{
puts("Prisionero: ¿Podrías liberarme?");
printf("a) Sí\nb) No\n");
scanf("%c", &opcion);
fflush(stdin);
} while(opcion != 'a' && opcion != 'A' && opcion != 'b' && opcion != 'B');
if(opcion == 'a' || opcion == 'A')
{
puts("Prisionero: Para liberarme necesitas resolver el acertijo que está grabado en la pared... ¡¡¡Pero cuidado!!! Sólo tienes una oportunidad \n");
//Se generará un número random que llevará al usuario a un acertijo
do
{
random = rand()%20 + 1;
fstop = buscarNumero(random, numeros, NUM_ACERTIJOS); //Llama a la función que verifica si el número del acertijo es repetido o no
} while(fstop);
numeros[control_acertijos] = random;
control_acertijos ++;
if(control_acertijos == 19) //Sólo si se pidieran más de veinte acertijos se reiniciaría el contador de acertijos, pero sería mejor introducir nuevos.
control_acertijos = 0;
nuevo_acertijo(random); // Guarda el acertijo generado dentro del random (OJO: el primer acertijo siempre es el dos, aun no entiendo por qué... ya antes había salido diferente)
puts("Solución:\n");
fflush(stdin);
gets(solucion);
//printf("%d", strncmp("mañana", strlwr(solucion), strlen(solucion)-1)); //Prueba de lo que imprime
if(solucionario(solucion,random))
puts("¡Excelente :)!\n");
//AQUÍ SALE HACIA EL PRISIONERO ES LIBERADO
else
{
puts("Prisionero: ¡Vaya! Tenías la respuesta en la punta de la lengua, si no pudiste con algo tan simple no podrás terminar el juego\n\n");
puts("\t\t\t\t\t GAME OVER");
return 0;
}
}
//ELSE DE LA PRIMER PREGUNTA DE LIBERACIÓN, DEBE TERMINAR CUANDO EL PRISIONERO SEA LIBERADO
else if(opcion == 'b' || opcion == 'B')
{
puts("Prisionero: Puedo ayudarte a salir de aquíKJHKHGHJ");
do
{
puts("¿Liberar al prisionero?");
fflush(stdin);
printf("a) Sí\nb) No\n");
scanf("%c", &opcion);
} while(opcion != 'a' && opcion != 'A' && opcion != 'b' && opcion != 'B');
if(opcion == 'a' || opcion == 'A')
{
puts("Prisionero: Para liberarme necesitas resolver el acertijo que está grabado en la pared... ¡¡¡Pero cuidado!!! Sólo tienes una oportunidad \n");
//Se generará un número random que llevará al usuario a un acertijo
do
{
random = rand()%20 + 1;
fstop = buscarNumero(random, numeros, NUM_ACERTIJOS); //Llama a la función que verifica si el número del acertijo es repetido o no
} while(fstop);
numeros[control_acertijos] = random;
control_acertijos ++;
if(control_acertijos == 19) //Sólo si se pidieran más de veinte acertijos se reiniciaría el contador de acertijos, pero sería mejor introducir nuevos.
control_acertijos = 0;
nuevo_acertijo(random); // Guarda el acertijo generado dentro del random (OJO: el primer acertijo siempre es el dos, aun no entiendo por qué... ya antes había salido diferente)
puts("Solución:\n");
fflush(stdin);
gets(solucion);
if(solucionario(solucion,random))
puts("¡Excelente :)!\n");
//AQUÍ SALE HACIA EL PRISIONERO ES LIBERADO
else
{
puts("Prisionero: ¡Vaya! Tenías la respuesta en la punta de la lengua, si no pudiste con algo tan simple no podrás terminar el juego\n\n");
puts("\t\t\t\t\t GAME OVER");
return 0;
}
}
else if(opcion == 'b' || opcion == 'B')
//VIENE DE LA PROPUESTA: PUEDO AYUDARTE A SALIR DE AQUÍ
{
puts("Prisionero: Si me liberas te daré una bolsa llena de chocolates :)");
do
{
puts("¿Liberar al prisionero?");
fflush(stdin);
printf("a) Sí\nb) No\n");
scanf("%c", &opcion);
} while(opcion != 'a' && opcion != 'A' && opcion != 'b' && opcion != 'B');
if(opcion == 'a' || opcion == 'A')
{
puts("Prisionero: Para liberarme necesitas resolver el acertijo que está grabado en la pared... ¡¡¡Pero cuidado!!! Sólo tienes una oportunidad \n");
//Se generará un número random que llevará al usuario a un acertijo
do
{
random = rand()%20 + 1;
fstop = buscarNumero(random, numeros, NUM_ACERTIJOS); //Llama a la función que verifica si el número del acertijo es repetido o no
} while(fstop);
numeros[control_acertijos] = random;
control_acertijos ++;
if(control_acertijos == 19) //Sólo si se pidieran más de veinte acertijos se reiniciaría el contador de acertijos, pero sería mejor introducir nuevos.
control_acertijos = 0;
nuevo_acertijo(random); // Guarda el acertijo generado dentro del random (OJO: el primer acertijo siempre es el dos, aun no entiendo por qué... ya antes había salido diferente)
puts("Solución:\n");
fflush(stdin);
gets(solucion);
if(solucionario(solucion,random))
puts("¡Excelente :)!\n");
//AQUÍ SALE HACIA EL PRISIONERO ES LIBERADO
else
{
puts("Prisionero: ¡Vaya! Tenías la respuesta en la punta de la lengua, si no pudiste con algo tan simple no podrás terminar el juego\n\n");
puts("\t\t\t\t\t GAME OVER");
return 0;
}
}
else if(opcion =='b' || opcion == 'B')
{
//VIENE DEL SOBORNO DE LA BOLSA DE CHOCOLATES
puts("Prisionero: No tengo más que ofrecerte. Parece que seremos compañeros de celda...");
do
{
puts("Prisionero: Tengo un montón de ricos cocos, tirili, ahí están en fila míralos, grandes, chichos, tan enanos como ves…");
puts("¿Liberar al prisionero?");
fflush(stdin);
printf("a) Sí\nb) No\n");
scanf("%c", &opcion);
//POR EL MOMENTO, SI EL USUARIO DECIDE NO LIBERAR AL PRISIONERO, EL JUEGO SE CICLARÁ
} while(opcion != 'a' && opcion != 'A');
if(opcion == 'a' || opcion == 'A')
{
puts("Prisionero: Para liberarme necesitas resolver el acertijo que está grabado en la pared... ¡¡¡Pero cuidado!!! Sólo tienes una oportunidad \n");
//Se generará un número random que llevará al usuario a un acertijo
do
{
random = rand()%20 + 1;
fstop = buscarNumero(random, numeros, NUM_ACERTIJOS); //Llama a la función que verifica si el número del acertijo es repetido o no
} while(fstop);
numeros[control_acertijos] = random;
control_acertijos ++;
if(control_acertijos == 19) //Sólo si se pidieran más de veinte acertijos se reiniciaría el contador de acertijos, pero sería mejor introducir nuevos.
control_acertijos = 0;
nuevo_acertijo(random); // Guarda el acertijo generado dentro del random (OJO: el primer acertijo siempre es el dos, aun no entiendo por qué... ya antes había salido diferente)
puts("Solución:\n");
fflush(stdin);
gets(solucion);
if(solucionario(solucion,random))
puts("¡Excelente :)!\n");
//AQUÍ SALE HACIA EL PRISIONERO ES LIBERADO
else
{
puts("Prisionero: ¡Vaya! Tenías la respuesta en la punta de la lengua, si no pudiste con algo tan simple no podrás terminar el juego\n\n");
puts("\t\t\t\t\t GAME OVER");
return 0;
}
}
}
}
}
include
include
include
include
define NUM_ACERTIJOS 20
//**ESTRUCTURAS*****// typedef struct personaje { char * nombre; } PERSONAJE;
typedef struct ACERTIJOS{ char * nombre; char * solucion; }ACERTIJOS;
//**FUNCIONES*****//
PERSONAJE nuevoPersonaje() { PERSONAJE cr; cr.nombre = malloc(sizeof(char)*30); //Inicializar al personaje porque la estructura tiene un arreglo de caracteres puts("¿Cuál es tu nombre? "); gets(cr.nombre); return cr; }
ACERTIJOS nuevo_acertijo(int numero_acertijo){ FILE * f; ACERTIJOS cr; char * nombre = malloc(sizeof(char)*50); srand(time(NULL)); //Semilla sprintf(nombre, "Acertijos/Acertijo%i.acr",numero_acertijo );//Abre los acertijos de manera aleatoria (A partir del número uno) f = fopen(nombre,"r"); fscanf(f, "%s", nombre); while(fscanf(f, "%s", nombre) != EOF) { printf("%s", nombre); printf(" "); } fclose(f); printf("\n"); return cr; }
//Analiza el número random que se le da, lo compara con el arreglo y si lo tiene pide otro. Si no, lo guarda y permite que se imprima el acertijo int buscarNumero(int numero, int arreglo [], int tamanio) { int i, stop = 0; for(i = 0; (i < tamanio && stop == 0); i++){ if(arreglo[i] == numero) stop = 1; } return stop; }
//La función de solucionario va a analizar cada uno de las respuestas que se le den al juego, si son correctas, el usuario podrá seguir jugando int solucionario (char solucion[30], int numero_acertijo) {
}
/*Nota:
//**INICIO DEL JUEGO*****// int main() { setvbuf(stdout, NULL, _IONBF, 0); char opcion; char solucion [30]; char * nombre; int numeros [NUM_ACERTIJOS]; int random; int fstop; int control_acertijos = 0; //PERSONAJE nuevo = nuevoPersonaje();//Se manda a llamar la función y se crea un nuevo personaje. int limpieza = 0; while (limpieza < 20) { numeros [limpieza] = 0; limpieza ++; } // Llena los números del arreglo con ceros, para quitarle la basura.