Universidad de Costa Rica
Escuela de Ciencias de la Computación e Informática
CI-1201 Programación II - 2012b
Profesor Jeisson Hidalgo-Céspedes

Tarea 02

Implemente una variación del juego "Mente maestra" (originalmente en inglés master-mind o codebreaker). La computadora escoge un número al azar y el usuario debe tratar de adivinarlo. En cada intento del usuario, la computadora le dará dos pistas para ayudarle a encontrarlo: cuántos dígitos del número del usuario están en el número secreto de la computadora y cuántos de esos dígitos están en posición correcta. Por ejemplo:

$ ./mentemaestra
Mente maestra: yo invento un número y usted lo adivina
Nivel de dificultad [2-19, 0 para salir]: 4
Tengo un número de 4 dígitos. Adivina cuál es.

0 puntos. Intento 1: 1234
3 dígitos están en mi número, 0 en posición correcta: 3375 puntos.

3375 puntos. Intento 2: 5678
0 dígitos están en mi número, 0 en posición correcta: 0 puntos.

3375 puntos. Intento 3: 9012
3 dígitos están en mi número, 1 en posición correcta: 1500 puntos.

4875 puntos. Intento 4: 3942
3 dígitos están en mi número, 1 en posición correcta: 1125 puntos.

6000 puntos. Intento 5: 4192
Felicitaciones, adivinó mi número en 5 intentos: 1800 puntos.
Su nuevo marcador es 7800 puntos.

Nivel de dificultad [2-19, 0 para salir]: 3
Tengo un número de 3 dígitos. Adivina cuál es.

7800 puntos. Intento 1: 123
1 dígito está en mi número, 0 en posición correcta: 150 puntos.

7950 puntos. Intento 2: 456
1 dígito está en mi número, 1 en posición correcta: 150 puntos.

8100 puntos. Intento 3: 7890
8100 puntos. Intento 3: 789
1 dígito está en mi número, 0 en posición correcta: 50 puntos.

8150 puntos. Intento 4: 147
1 dígito está en mi número, 0 en posición correcta: 37 puntos.

8187 puntos. Intento 5: 258
1 dígito está en mi número, 1 en posición correcta: 60 puntos.

8247 puntos. Intento 6: 369
1 dígito está en mi número, 0 en posición correcta: 25 puntos.

8272 puntos. Intento 7: 0
Mi número era 438.

Nivel de dificultad [2-19, 0 para salir]: 0
$
Ejemplo de ejecución del programa

Para satisfacer diferentes gustos, el jugador puede escoger entre varios niveles de dificultad. Supóngase que el nivel de dificultad indica la cantidad de dígitos del número que debe adivinar el usuario. Al iniciar una partida, el jugador escogerá este nivel o el dígito 0 para salir del juego.

Una vez iniciada una partida, la computadora generá un número aleatorio de la cantidad de dígitos equivalente al nivel de dificultad que escogió. Dado que es confuso para el jugador, no se deben escoger los números con ceros a la izquierda. Es decir, su juego debe escoger números secretos en el rango { 10d - 1, ..., 10d - 1 }, donde d es el nivel de dificultad.

Una vez escogido un número secreto, el jugador intentará adivinarlo ingresando números de la misma cantidad de dígitos indicada por el nivel de dificultad. Si ingresa menos o más digitos, el sistema ignorará el número y se mantendrá en el mismo intento (ver línea 31 del ejemplo de ejecución).

Si en un intento el jugador no adivina el número secreto, el juego le indicará la cantidad de dígitos existentes y dígitos correctos. Los dígitos correctos (dc) son aquellos que se encuentran tanto en el número intentado como el número secreto en la misma posición. Los dígitos existentes (de) son aquellos dígitos del número intentado que se encuentran en el número secreto, estén o no estén en la misma posición. Para calcular los dígitos existentes usted debe buscar cada dígito del número intentado en el número secreto, y si lo encuentra, tachar el dígito en el número secreto, con el fin de que este número sea útil para el jugador. Sugerencia: utilice un arreglo de enteros para representar los dígitos del número secreto y poder tacharlos.

En cada intento i el sistema premia los aciertos con puntos y el jugador los va acumulando en su marcador. El premio debe ser en proporción a la cantidad de dígitos o nivel de dificultad d; ser significativo en los primeros intentos y disminuir en proporción a estos; y ser mayor por dígitos correctos (dc) que por dígitos existentes (de). A modo de sugerencia, los puntos del intento i se pueden obtener con la siguiente exponencial decreciente:

dc * 9 * 10d - 1 / (d * i) + (de - dc) * 9 * 10d - 1 / (2 * d * i)

Si en un intento el jugador acierta el número, el juego lo felicitará y acumulará en su marcador los puntos que merece para ese intento utilizando la misma fórmula anterior (línea 19 del ejemplo de ejecución). Si por el contrario, en un intento el jugador ingresa 0, se asumirá que se da por vencido, el juego revelará su número secreto (línea 44 del ejemplo de ejecución) y no se le otorgará ningún punto.

En caso de que el jugador acierte el número o se dé por vencido, se le dará la oportunidad de iniciar otra partida escogiendo un nuevo nivel de dificultad (d) ó 0 para salir del juego.

Para su solución usted debe implementar al menos una clase (por ejemplo Juego), la cual debe tener muchas operaciones, de las que sobresale el método jugar(). El main() de su programa debe únicamente crear un objeto que represente el juego como un todo e invocar su método jugar(). Si usted lo desea puede crear otras clases (como Partida e Intento), pero no es obligatorio.

Evaluación

  1. [5%] El juego se mantiene en un ciclo solicitando el nivel de dificultad (2 a 19). Si se ingresa 0 se sale del juego. Si se ingresa cualquier otro número, se ignora y se repite la pregunta del nivel de dificultad.
  2. [10%] Escoge números secretos únicamente en el rango { 10d - 1, ..., 10d - 1 }. Debe tenerse cuidado de inicializar la semilla del generador de números aleatorios y que la función rand() retorna números más pequeños que los requeridos por este rango.
  3. [10%] Si en el intento i el jugador acierta el número, se le felicita y premia con la cantidad correcta de puntos de acuerdo a la fórmula establecida. El juego permite entonces iniciar otra partida escogiendo un nuevo nivel de dificultad.
  4. [10%] Si en el intento i el jugador se da por vencido ingresando 0, se le revela el número secreto y no se le premia con puntos. El juego permite entonces iniciar otra partida escogiendo un nuevo nivel de dificultad.
  5. [5%] Si en el intento i el jugador ingresa un número de una cantidad no válida de dígitos, el juego lo ignora y se mantiene en el mismo intento. No se le otorgan puntos por ello.
  6. [10%] Si en el intento i el jugador ingresa un número válido pero distinto al secreto, se le despliega la cantidad correcta de dígitos correctos.
  7. [20%] Si en el intento i el jugador ingresa un número válido pero distinto al secreto, se le despliega la cantidad correcta de dígitos existentes.
  8. [20%] Si en el intento i el jugador ingresa un número válido pero distinto al secreto se incrementa su marcador con la cantidad de puntos indicada por la fórmula sugerida.
  9. [10%] Implementa al menos una clase Juego. El código está perfectamente indentado. Escribe comentarios significativos para ayudar a comprender la lógica de la solución.

Para presentar su solución, comprima los archivos fuente que utilizó y súbalos a la plataforma educativa en la asignación con nombre Tarea02.