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