#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <time.h>
// Tabla de records
// crear estructura
typedef struct {
char nombre[20];
int intentos;
} tipoRecord;
// Funciones
void leerArchivoRecords(tipoRecord *);
void asignarRecordsIniciales(tipoRecord *);
void guardarArchivoRecords(tipoRecord *);
void mostrarTablaRecords(tipoRecord *);
int pedirNum(char *);
int jugarPartida();
void comprobarTablaRecords(int, tipoRecord *);
int main(int argc, char **argv)
{
// Variables
tipoRecord tablaRecords[10];
int c = 0; // Contador para bucles
int op = -1; // Opción del usuario
int inten = 0; // Intentos usados en cada partida
// Preparamos secuencia de nº aleatorios
srand(time(NULL));
// leer archivo de records y pasarlo a la tabla
leerArchivoRecords(tablaRecords);
// Mientras quiera seguir jugando
while(op != 2) {
// Mostrar records actuales
mostrarTablaRecords(tablaRecords);
// Mostrar menú
printf("1 Jugar 2 Salir\n");
// Pedir opción al usuario
op = pedirNum("Introduzca la opción ");
// Procesar opción de menú
switch(op) {
case 1: // Jugar partida
inten = jugarPartida();
comprobarTablaRecords(inten, tablaRecords);
break;
case 2: // Salir
printf("Hasta luego\n");
break;
}
} // Fin mientras
// Guardar archivo con tabla de records
guardarArchivoRecords(tablaRecords);
return 0;
}
// pasa los 10 records del archivo a la tabla
void leerArchivoRecords(tipoRecord *tr)
{
FILE *pf;
// Abrir de lectura
if((pf = fopen("records", "r")) == NULL) {
// Ha fallado la apertura (No existe el archivo)
asignarRecordsIniciales(tr);
guardarArchivoRecords(tr);
pf = fopen("records", "r");
}
// Leer contenido
fread(tr, sizeof(tipoRecord), 10, pf);
// Cerrar
fclose(pf);
}
// Guarda la tabla de records en el archivo
void guardarArchivoRecords(tipoRecord *tr)
{
FILE *pf;
// Abrir de escritura
if((pf = fopen("records", "w")) == NULL) {
// Ha fallado la apertura (error irrecuperable)
printf("Cascazo del 15\n");
exit(1);
}
// Guardar contenido
fwrite(tr, sizeof(tipoRecord), 10, pf);
// Cerrar
fclose(pf);
}
// Asigna valores iniciales a la tabla de records
void asignarRecordsIniciales(tipoRecord *tr)
{
int c = 0;
// Recorre los 10 records
for(c = 0; c < 10; c++) {
strcpy(tr[c].nombre, "Nadie"); // A cada record le asigna como nombre "nadie"
tr[c].intentos = 999999; // A cada record le asigna como intentos 999999
}
}
// Muestra los 10 records actuales
void mostrarTablaRecords(tipoRecord *tr)
{
int c = 0;
printf("***** RECORDS ACTUALES *****\n");
// Recorre los 10 records
for(c = 0; c < 10; c++) {
printf("%-20s %7d\n", tr[c].nombre, tr[c].intentos);
}
}
// pide un número por teclado mostrando antes el mensaje indicado en texto
int pedirNum(char *texto)
{
int resp = 0;
printf("%s", texto);
scanf("%d", &resp);
return resp;
}
int jugarPartida()
{
int ale = 0;
int num = 0;
int inten = 0;
// Nº aleatorio
ale = 1+(int) (100000.0*rand()/(RAND_MAX+1.0));
printf(" %d ",ale);
// Mientras aleatorio != usuario
while(ale != num) {
// Pedir nª al usuario
num = pedirNum("Introduzca un número ");
// comprobar nª usuario y aleatorio
// mayor, menor, igual, contar intentos
inten ++;
if(num > ale) {
printf("Te has pasado de largo\n");
} else {
if(num < ale) {
printf("Te has quedado corto\n");
} else {
printf("CORRECTO\n");
}
}
}
return inten;
}
// Comprueba si entra en la tabla de records
void comprobarTablaRecords(int inten, tipoRecord *tr)
{
int pos = 0;
int c = 0;
char nombre[20];
// Buscar la posición en la que quedaría "inten" en la tabla de 10 records
while(tr[pos].intentos < inten && pos < 10) {
pos++;
}
// Si entra
if(pos < 10) {
// Pedir nombre
printf("Ha entrado en la tabla de records\n");
printf("Indique su nombre: ");
scanf("%s", nombre);
// Mover los records 1 hacia abajo
c = 9;
while(c > pos) {
strcpy(tr[c].nombre, tr[c - 1].nombre); // Pasa el nombre 8 a la posición 9
tr[c].intentos = tr[c - 1].intentos;
c--;
}
// Insertar el nuevo record
strcpy(tr[pos].nombre, nombre);
tr[pos].intentos = inten;
}
}
No hay comentarios:
Publicar un comentario