Programando desde 0: 13- Primer proyecto dificil: Master Mind.
-
-
Senior Member - Moderador
09/02/2012#1 Programando desde 0: 13- Primer proyecto dificil: Master Mind.Primer proyecto dificil: MASTER MIND
Esta no será una lección propiamente dicha, sino que les propondré realizar un proyecto, bastante difícil por cierto. Voy a pedirles explísitamente que participen en esto, que posteen, comenten y sobretodo que pregunten. Es muy importante para mí obtener sus comentarios, ya sea un simple "Lección leida" o un "Buena lección" así como también un "No entendí nada". O sea, comenten.
Con el Adivinador no se como les fue, no se si lo pudieron realizar o si al menos lo intentaron, eso también sería bueno saberlo.
En este caso el ejercicio será de una dificultad mucho mayor. Se tratará de un juego bastante común en páginas web, el Master Mind,solo que en este caso ha sido adaptado por los profesores de la Facultad de Ingeniería para ser propuesto para programarse en Pascal con los conociemientos que ustedes mismos han obtenido de las lecciones dadas hasta ahora.
¿Por qué les propongo esto? Para que realmente terminen de asimilar lo que les he impartido hasta ahora. Para que tengan un pantallazo inicial de lo complejo que puede ser un problema a ser programado y cómo a veces resulta hasta imposible de realizar, aunque en verdad no lo es. Para que vean que parte de la gran dificultad de la programación radica en primera instancia en entender el problema planteado. Antes de pensar tansiquiera en el lenguaje de programación hay que entender al máximo lo que se quiere resolver, y eso no es para nada sencillo.
Yo les daré todo el planteo y ustedes intentarán modelar el programa y hacerlo acorde a lo que les pido. Luego de eso estaré al pendiente de todas sus preguntas para ayudarlos, pero la idea no es que esperen a que yo les publique el código que hice sino que realmente intenten hacer esto.
Dada su complejidad les llevará varios días hacerlo bien. Además, como esto no es curso formal, no estarán abocados a hacer esto, así que se extenderá un poco más. La idea, antes de continuar con las lecciones siguientes, es hacer esto. Todos aquellos que aún no han llegado hasta aquí no se preocupen, sigan a su ritmo.
Si desisten en esto pues, no aprenderán a programar bien a menos que hagan un curso formal en alguna institución. Este es un intento por mi parte de que realmente puedan aprender. Ojalá les sirva de algo.
---------------------------------------------
Master Mind:
El Master Mind es un juego de estrategia, donde un jugador intenta adivinar un código creado por otro jugador. El código tiene una cantidad fija de caracteres tomados de un conjunto conocido.
Llamemos adivinador al jugador que debe adivinar, y pensador al jugador que piensa el código. El adivinador sucesivamente va proponiendo un código que intenta adivinar el código del pensador. Cada una de estas propuestas recibe una nota por parte del pensador de acuerdo con el grado de aproximación que tenga la propuesta con el código pensado. Esas notas actúan como pistas que le permiten al adivinador aproximarse más al código del pensador en cada intento. El juego termina cuando el adivinador descubre el código del pensador.
O sea, el adivinador intentará adivinar un código que solo el pensador conoce, en un número máximo de intentos. El pensador le dará al adivinador las notas correspondientes para que este tenga una guía de cómo proponer su siguiente código.
-------------------------------------------------
El código
Los códigos válidos tanto para el pensador como para el adivinador son los que cumplen con las siguientes características:
Tienen una cantidad fija de caracteres. Llamemos LARGO_CODIGO a esa cantidad.
Los caracteres válidos son las letras mayúsculas comprendidas entre PRIMERA_LETRA y ULTIMA_LETRA.
No pueden contener caracteres repetidos.
Existen diferentes modalidades de juego, según los valores de los parámetros LARGO_CODIGO, PRIMERA_LETRA y ULTIMA_LETRA. En algunas modalidades también se admiten caracteres repetidos.
Por ejemplo, si suponemos:Entonces los siguientes son códigos válidos:Código:LARGO_CODIGO = 6 PRIMERA_LETRA = A ULTIMA_LETRA = H.
porque son de largo 6 y contienten letras que están comprendidas entre la letra 'A' y la letra 'H'.Código:ABCDEF FAGBCH FCDEAB GDHBCA HEFGBD
Los siguientes, en cambio, son códigos no válidos:ya sea porque no son de largo 6 y/o porque contienen caracteres que no están comprendidos entre la 'A' y la 'H'.Código:AHJKAB AABCDE BBBBBB A12BCD ABC FGHFGH
------------------------------------------
Las notas
La nota que adjudica el pensador a cada propuesta del adivinador consiste de una pareja de números (B,R). Esta pareja de números se calcula de la siguiente manera:
B es la cantidad de caracteres que aparecen en la propuesta del adivinador y en el código del pensador en la misma posición. A este número se le llama: la cantidad de buenos de la propuesta.
R es la cantidad de caracteres de la propuesta del adivinador que también aparecen en el código del pensador pero en diferente posición . A este número se le llama: la cantidad de regulares de la propuesta.
Ejemplos de notas:
Supongamos que el código del pensador es ABCFGH.
Propuesta Buenos Regulares
ABCDEF 3 1
DEFHCB 0 4
AGCFBH 4 2
ABCFGH 6 0
Para ser más explísito y redundar un poco:
Supongamos que el pensador se inventa el código ABCD para que el adivinador aivine. Como primer intento el adivinador presenta el código AFGH. Como ven no ha acertado, pero una de las letras de su código coincide con la del código del pensador, por tanto hay una bien. Esa A corresponde a un BUENO ya que además de ser la misma letra está en la misma posición que en el código del pensador, en este caso, en el primer lugar.
Un REGULAR corresponde a una letra que esta en ambos códigos pero en una posición diferente. Por ejemplo, si para adivinar el ABCD el adivinador presentara el FAGH solo la letra A está en ambos códigos, pero en el del pensador está en primer lugar y en el del adivinador está en segundo lugar. Ambas notas se presentan a la vez.
Veamos un ejemplo suponiendo que las letras que puede haber en el código van de la A a la F inclusive. En este ejemplo las letras pueden repetirse, pero para lo que ustedes tendrán que programar recuerden que NO PUEDEN REPETIRSE LETRAS.
El código del pensador es FDDA:
Primer intento: ABCD Buenos: 0 Regulares 2
Como ven no hay letras que coincidan en posición, pero tenemos en el código del adivinador una A que está en el primer lugar (en el del pensador está en el último) y una D en último lugar (en el del pensador está en segundo o tercer lugar) y corresponden cada una a un regular.
Segundo intento: BADC Buenos: 1 Regulares: 1
Ahora la D coincide en el tercer lugar de ambos códigos. Notar que en el código del pensador hay también una D en el segundo lugar, pero esta no hace que la D del tercer lugar del código del adivinador sea un regular ya que esta coincide con la D del tercer lugar. La A siegue estando en posiciones distintas.
Tercer intento: EDAE Buenos: 1 Regulares: 1
Cuarto intento: EDAF Buenos: 1 Regulares: 2
Quinto intento: DDAF Buenos: 1 Regulares: 3
Sexto intento: FADD Buenos: 2 Regulares: 2
Séptimo intento: FDDA Buenos: 4 Regulares: 0
En este caso el adivinador ha ganado. Noten que si suman Buenos + Regulares el resultado siempre será menor o igual al número de letras en el código (en este caso 4) y sólo será igual si todas las letras en el código del adivinador están en el del pensador. Nunca puede ser mayor.
--------------------------------------
El programa
En esta proyecto deberán implementar en pascal, un programa que se comporte como el pensador, mientras que el usuario hará las veces del adivinador. El programa deberá generar un código al azar, que el usuario intentará adivinar en una cantidad de intentos inferior a MAXIMO_INTENTOS. Para cada intento del usuario, el programa despliega la cantidad de buenos y regulares que correspondan.
El programa termina cuando el usuario advina la propuesta, o cuando el adivinador llega a una cantidad de intentos igual a MAXIMO_INTENTOS,
Los valores de MAXIMO_INTENTOS, LARGO_CODIGO, PRIMERA_LETRA y ULTIMA_LETRA se los diré más adelante.
Para fijar ideas, suponderemos en lo que sigue que:Comienzo del Programa: Al comenzar el programa despliega el siguiente texto:Código:MAXIMO_INTENTOS = 10, LARGO_CODIGO = 4, PRIMERA_LETRA = A ULTIMA_LETRA = H
Ingreso de propuestas: A partir de ahí comienza a pedir los códigos del usuario y a cada uno de ellos le adjudica la nota. El programa despliega el número de propuesta que corresponde: 1), 2) hasta 10). A cada propuesta le responde en la línea siguiente la cantidad de buenos y regulares (en ese orden) de la propuesta leída.Código:Dispone de 10 intentos para adivinar
Los códigos que allí aparecen corresponden al ingreso de la propuesta por parte del usuario.Código:1) ABCD 2 0 2) ACBD 1 2
Validación de códigos: Cuando el código ingresado no es válido, se vuelve a pedir el código sin incrementar el número de intentos:Un código no válido es cualquier combinación de caracteres que no respete las reglas especificadas en la sección El código.Código:4) AABC ERROR 4) ABFD 1 1 5)
Finalización del programa: Luego del décimo intento, si el usuario no adivinó el código, el programa despliega el siguiente mensaje y el programa termina:Cuando el usuario ingresa un código que corresponde a 4 buenos, se despliega el siguiente mensaje y el programa termina.:Código:10) ABCDF 2 1 Se alcanzó el número máximo de intentos El código era: ABHGC Fin del juego
----------------------------------------Código:7) AFGH 4 0 Correcto. Ha acertado Fin del juego
Se pide
Implementar un programa en Pascal que imite el comportamiento que acabo de describir. Debe ser exactamente igual, tanto los mensajes como todo lo descrito. Si esto les sale bien luego ustedes podrán agregarle todas las mejoras que quieran.
Pueden usar solo y únicamente lo dado en las lecciones anteriores, incluyendo arreglos.
----------------------------------------
Dificultades evidentes
Al intentar realizar este programa tendrán las siguientes dificultades:
*Entender bien el problema planteado para poder empezar a trabajar en él.
*Crear un código al azar.
*Realizar las lecturas de la entrada estándar.
*Calcular las notas del código planteado por el usuario.
Recuerden que en los códigos no habrá caracteres repetidos, eso dificultaría mucho las cosas y será pedido más adelante cuando comencemos a ver subprogramas.
Mucha suerte. Estaré a su disposición para guiarlos en esto. -
-
Estoy estudiando programación en la UTN y la verdad no vi nunca Pascal. Solo estoy con C/C++ y empezando a usar visual basic habiendo pasado y entendido un poco de Assembler. En fin, el proyecto tiene su dificultad, yo creo que me tomaria un tiempito hacerlo. Lo mas jodido es la diferencia entre "Buenos" y "Regulares" eso al que lo piense y pruebe lo va volver loco. Es un buen juego para probar, armarse el codigo fuente y aprender a validar las cosas que nos pide en este caso el Profesor Vlady_18. Saludos
-
Hola Vlady_18, estoy en la lección 06, je, je, pero me metí a este enlace para observar que podré hacer más adelante, claro si me esfuerzo, me fascina el curso y la manera en que explicas los temas, mis felicitaciones de verdad, ojala haya más personas como tu tan amables e interesadas en que otras personas aprendan, sinceramente te aprecio por lo que haces. Un saludo y hasta el momentu ni una duda, pero ya me tendrás preguntandote. Que estes muy bien.
-
Interesante el proyecto del Master Mind. Comencé el domingo viendo las primeras parte del curso, veo si para el jueves termino este proyecto y avanzo con el resto.
¿Una consulta los proyectos hay que mandártelos para que los veas o simplemente hacerlos?Última edición por Internauta1989; Hace 1 semana a las 14:54
-
-
Senior Member - Moderador
Hace 1 semana#8 Re: Programando desde 0: 13- Primer proyecto dificil: Master Mind.La idea sería que los hagas y si quieres los subes para mostrar tu trabajo. Puedes también publicar el código para compartirlo con otros o bien, si quieres simplemente mi opinión puedes enviármelo. Eso quedará a tu gusto. Lo primordial es que los hagan ya que es la base de todo.
Saludos. -
-
Veré entonces si puedo subirlo cuando termine. Hasta ahora llevo la mitad del programa, me falta las comparaciones de las palabras(Resulto un poco mas complicado de lo que pensaba).
Espero terminar entre el domingo o el lunes y lo subo.
