El juego de MASTERMIND
Análisis del problema
Diseño del programa
Implementación
// Este ejercicio muestra el uso de break en bucles for. Tb. muestra
// la utilización de bucles for() infinitos (función un_aleatorio())
#include<stdio.h>
#include<stdlib.h>
// La función rand() se define en stdlib.h.
// La función rand() proporciona un entero entre 0 y RAND_MAX, que es 32767 en stdlib.h
// En CW, ponen 32767
// En TurboC, ponen 0x7FFF
#include<time.h>
// Esto lo voy a utilizar para generar una semilla verdaderamente aleatoria.
// Para ser exactos, empleo la función clock(), que me indica el tiempo
// transcurrido desde el arranque el sistema.
#include<math.h>
// Esto lo necesitamos para disponer de logaritmos, y calcular
// el número máximo de intentos. La función ceil() proporciona,
// por cierto, el menor entero que es mayor que su argumento.
// La lógica de la búsqueda binaria tiene aquí su aplicación
#define maximo 512
int un_aleatorio(int);
void main(void)
{
int numero_buscado = un_aleatorio(maximo),numero_dado = 0;
int numero_pregunta;
printf("M A S T E R M I N D\n\n");
printf("He pensado un numero entre 1 y %d.¿Sabrás cual es en %d intentos?\n\n",
maximo,(int)(ceil(log(maximo)/log(2))));
for(numero_pregunta=1; numero_pregunta<=10;numero_pregunta++)
{
printf("Intento número %d : ",numero_pregunta);
scanf("%d",&numero_dado);
// Si el pringaíllo lo ha encontrado, salimos del bucle!
if (numero_dado == numero_buscado) break;
// En caso contrario, damos la pista correspondiente y seguimos
if (numero_dado < numero_buscado)
printf("\nNo, %d es menor que el número que he pensado.\n", numero_dado);
else
printf("\nNo, %d es mayor que el número que he pensado.\n", numero_dado);
} // Aquí acaba el bucle for
if (numero_dado != numero_buscado)
printf("\n\nJa! Había pensado el %d\n\n", numero_buscado);
else
printf("\n\nEnhorabuena! Era el %d!\n\n>Fin<\n\n",numero_buscado);
}
// Esta función se puede aprovechar para otras cosas similares.
// Ojo: no se debe utilizar para cálculo numérico, porque produce
// un reticulado entero.
int un_aleatorio(int max)
{
int resultado;
srand(clock());
for(;;)
{
resultado = rand();
if ((resultado>0) && (resultado<=max)) break;
}
return resultado;
}
Comprobación y Depuración
Documentación