Fecha y hora actual: Miércoles 26 Sep 2018 02:42
Índice del Foro

Foros de programación informática, diseño gráfico y Web

En esta comunidad intentaremos dar soporte de programación a todos los niveles, desde principiantes a profesionales de la informática, desarrollo de programas, programación web y mucho más.

Programando desde 0: 13- Un proyecto dificil: Master Mind.

Responder al Tema Ir a página Anterior1234567

Índice del Foro > Programación en general > Programando desde 0: 13- Un proyecto dificil: Master Mind.

Autor Mensaje
Kyshuo Ayame
Moderador Global


Registrado: 07 Ene 2011
Mensajes: 1027

Mensaje Publicado: Miércoles 29 Mar 2017 19:21

Título del mensaje: Programando desde 0: 13- Un proyecto dificil: Master Mind.

Responder citando

Estimado compañero, he estado analizando tu código y he encontrado varios problemas. Esto, obviamente es normal, es parte del aprendizaje y es bueno que pase.

El código me ha resultado bastante complejo de seguir, así que como primera recomendación te pediré que uses los comentarios y expliques en cada bloque qué es lo que pretendes hacer. Eso nos facilita a todos para leerlo.

Lo segundo es que al publicarlo uses la etiqueta CODE para que el código quede indentado.

Lo tercero es que te acoples a la letra del ejercicio, ya que PIMERA_LETRA y ULTIMA_LETRA son constantes definidas ya para el ejercicio, y tú no solo no las usas sino que además te has matado creando un código que genere estos valores al azar.

Ahora vamos al caso, donde solo me centraré en el principio de tu código analizando línea por línea:

Código:
  1. randomize;
  2. ordpletra:=random(26-largodec);
  3. pletra:=char(ordpletra+65);
  4.  
  5. repeat
  6. orduletra:=random(26-ordpletra);
  7. uletra:=char(ordpletra+orduletra+65);
  8. until (orduletra>=largodec);


Creo que lo has complicado más de lo necesario. La constante largodec está asignada en 6, así que veamos la primera línea:

Código:
  1. ordpletra:=random(26-largodec);


Genera un valor entre 0 y 19 ya que en esencia estás haciendo random(20). Luego intentas asignar un caracter a pletra en la siguiente línea:

Código:
  1. pletra:=char(ordpletra+65);


Veamos los rangos de valores. Usaré paréntesis rectos para esto. Por ejemplo, si una variable puede tener un valor entre 1 y 5 inclusive escribiré [1,5]:

ordPLetra --> [0,19]
ordPLetra + 65 --> [65,84] --> Es lo que está entre paréntesis.
pLetra --> [A,T]

Básicamente, tus cálculos y elecciones al azar hacen que pLetra pueda ser cualquier letra entre A y T inclusive.

Ahora entramos en tu bloque REPEAT con esta primera línea:

Código:
  1. orduletra:=random(26-ordpletra);


Como ordPLetra oscila entre 0 y 19, la expresión 26-ordPLetra oscila entre 0 y 25. ¿Por qué? Porque el valor mínimo que ordPLetra puede tener es 0, en ese caso 26-0= 26 y por tanto random(26) oscila entre 0 y 25 inclusive. Resumiendo:

ordULetra --> [0,25]

Luego tienes esta línea:

Código:
  1. uletra:=char(ordpletra+orduletra+65);


Sumas todos los ordinales + 65 y obtienes un caracter. Pues bien, veámoslo:

ordPLetra --> [0,19]
ordULetra --> [0,25]
ordPLetra + ordULetra --> [0,44]

Dependiendo entonces de los valores de ambas variables, los cuales son al azar en los rangos indicados, al sumarlas puedes tener cualquier valor entre 0 y 44. Por tanto la expresión completa tiene este rango:

ordPLetra + ordULetra + 65 --> [65,109]

Todos estos cálculos tienen como resultado que uLetra pueda ser cualquier caracter entre A y m.

Como ves, pocas líneas y cálculos en esencia complejos. La condición de salida del REPEAT es:

Código:
  1. orduletra>=largodec


Pues bien, ordULetra oscila entre 0 y 25 por tanto el REPEAT terminará en cualquier momento y estarás trabajando con un letras que oscilan entre A y m, es decir que valen todos estos caracteres:

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m

Incluye al espacio en blanco. Todo este problema se resuelve respetando la letra del ejercicio donde tienes ya definidas las constantes PRIMERA_LETRA y ULTIMA_LETRA. Te estás complicando sin sentido ya que el ejercicio en sí es bastante complejo como para que le agregues más dificultad.

El largo del código es 4, no 6, así que también usa la letra. Haz el ejercicio TAL CUAL se te plantea.

Aguardaré tus comentarios. Buen trabajo.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
ystudent
Usuario Iniciado


Registrado: 23 Feb 2017
Mensajes: 30

Mensaje Publicado: Lunes 03 Abr 2017 12:00

Título del mensaje: Programando desde 0: 13- Un proyecto dificil: Master Mind.

Responder citando

Hola Kyshuo

Pido disculpas por no seguir la letra del ejercio, no usar comentarios, ni indentar mi codigo. No volvera a suceder. He seguido las recomendaciones que me diste y el programa me ha funcionado correctamente. Ahora me queda, como propósito personal, lograr otro Mastermind en el que el codigo a adivinar sea totalmente aleatorio y me funcione. Me puedes echar una mano con eso? (Tengo un par de ideas/preguntas que me tienen bloqueado) Mientras, sigo avanzando en el curso que me parece muy bueno y me tiene super enganchado.

Gracias por compartir tus conocimientos y tiempo.

Saludos

Volver arriba
Ver perfil del usuario Enviar mensaje privado
Kyshuo Ayame
Moderador Global


Registrado: 07 Ene 2011
Mensajes: 1027

Mensaje Publicado: Lunes 03 Abr 2017 17:57

Título del mensaje: Programando desde 0: 13- Un proyecto dificil: Master Mind.

Responder citando

No entendí mucho tu pregunta: La consigna establece que el código sea al azar:

Cita:
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 código será generado dentro del rango establecido como primera letra y última letra. Si por ahí va tu duda dime cuáles son tus preguntas concretamente y te ayudaré con gusto.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
ystudent
Usuario Iniciado


Registrado: 23 Feb 2017
Mensajes: 30

Mensaje Publicado: Martes 04 Abr 2017 07:20

Título del mensaje: Programando desde 0: 13- Un proyecto dificil: Master Mind.

Responder citando

Sí, tienes razón. El ejercicio tiene una consigna clara e hice mi programa Mastermind cumpliéndola (después de que me corrigieras). Es decir, usé un codigo de 4 letras mayusculas generadas al azar, contenidas entre la primera letra A y la ultima H y sin caracteres repetidos. Así el programa me funcionó perfectamente.

La duda que tenía era para generar un código con letras primera y ultima generadas tambien al azar, que fue lo que intenté hacer (por error) en un principio, cuando me lancé a hacer el código sin leerme la consigna completa pero me he releido la correccion que me hiciste y he encontrado mi error así que no te robo más tiempo con este ejercicio.

Saludos y gracias!

Volver arriba
Ver perfil del usuario Enviar mensaje privado
Kyshuo Ayame
Moderador Global


Registrado: 07 Ene 2011
Mensajes: 1027

Mensaje Publicado: Martes 04 Abr 2017 15:55

Título del mensaje: Programando desde 0: 13- Un proyecto dificil: Master Mind.

Responder citando

No hay problema. Si lo que tu quieres es progresar usando una idea propia es incluso mejor, ya que uno se entusiasma más con sus ideas. Si no me equivoco entonces quieres que PRIMERA LETRA y ULTIMA LETRA sean al azar.

Te comento algo antes. el proyecto MasterMind en realidad cuenta de tres partes, que te comento a continuación:

  1. La primera es la que acabas de hacer: el sistema genera un código de 4 letras al azar, que no se repitan, y luego el usuario intenta adivinar el código según las notas recibidas. La dificultad de este ejercicio radica más que nada en las notas.
  2. La segunda parte es idéntica solo que se admiten letras repetidas en el código, por ejemplo AABC. Aunque parezca tonto, eso hace que el cálculo de la nota, sobre todo de los regulares, se complique bastante.
  3. La tercera parte implementa el sistema adivinador, es decir, tú le pasas las notas al programa y este te tira códigos intentando adivinar, tomando en cuenta las notas que le pasaste. Esta parte por supuesto se complica bastante pero es algo que en este curso debes poder hacer.


La segunda parte podrías hacerlo con los conocimientos de estas lecciones, pero es recomendable que completes hasta la 19. Si llegado el caso te interesa me avisas y te paso la letra del proyecto, ya que no lo publiqué aquí, habiéndolo cambiado por el proyecto Base de Productos.

La tercera parte está pensada como proyecto final, pero no la publiqué aquí ya que me pareció más interesante usar el juego Buscaminas y el juego Iguales como proyectos, pero si te interesa conocer el algoritmo para que tu programa adivine cualquier código en base a las notas que le des también puedo pasártelo y por supuesto ayudarte a hacerlo.

Volviendo a tu propuesta de generar PRIMERA LETRA y ÚLTIMA LETRA al azar también podemos analizarlo.

Aguardo tus comentarios.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
ystudent
Usuario Iniciado


Registrado: 23 Feb 2017
Mensajes: 30

Mensaje Publicado: Jueves 06 Abr 2017 17:08

Título del mensaje: Programando desde 0: 13- Un proyecto dificil: Master Mind.

Responder citando

Hola!

Sí que me gustaria completar las 3 partes del mastermind asi que te agradeceré me mandes la letra del ejercicio completo cuando puedas. Ya he terminado la clase 19 (con alguna duda en el ejercicio 2 que ya te preguntaré en el foro de esa clase) asi que podria ir avanzando la segunda parte y luego veria como cumplir la tercera, con tu ayuda jeje.

Respecto a generar aleatoriamente las primera y ultima letra del codigo del pensador, me he vuelto a leer la explicacion que me diste y comprobarlo con mi codigo y de nuevo me han saltado dudas. Te las expondré en la siguiente publicación con mi código comentado y indentado.

Saludos y gracias por la ayuda!!!

Volver arriba
Ver perfil del usuario Enviar mensaje privado
Wul



Registrado: 30 Jul 2018
Mensajes: 3

Mensaje Publicado: Lunes 30 Jul 2018 20:02

Título del mensaje: Programando desde 0: 13- Un proyecto dificil: Master Mind.

Responder citando

Buenas Kyshuo, llego algo tarde espero que me puedas ayudar. Con este programa y con el anterior me a pasado igual: cuando ingreso los datos se guardan si o si, incluso los finales de linea y la tecla de borrar!!! me e vuelto loco buscando el problema y resulta que por algún motivo se guarda TODO. Cuando hago la segunda ronda de los arreglos se guarda el fin de linea, si borro una letra se guarda la letra y el borrar Triste . Gracias con antelación.

Este proyecto lo tengo casi terminado solo faltan pequeños detalles que se me han pasado, pero esto me a amargado el día XD y como en un principio ya hace lo que debe pues voy a la siguiente lección mientras.

Ya que estoy y aunque no se si leerás esto, te quería agradecer por haber echo este curso de programación, hace unos dos años intenté aprenderlo pero lo fui dejando y solo llegue a la lección 10 esta vez quiero llegar hasta el final.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
Kyshuo Ayame
Moderador Global


Registrado: 07 Ene 2011
Mensajes: 1027

Mensaje Publicado: Jueves 30 Ago 2018 18:58

Título del mensaje: Programando desde 0: 13- Un proyecto dificil: Master Mind.

Responder citando

Hola Wul. Perdona la demora en responder. Necesitaría ver tu código para rastrear el problema.

Este curso ya está descontinuado y tengo la intención de rehacerlo utilizando Lazarus y Modern Pascal para creación de aplicaciones competentes, incluyendo videos y demás, algo que no hice en su momento.

Sin embargo las bases que enseñé se mantienen hoy día en cualquier lenguaje, así que siempre será muy poderoso.

Pásame tu código y lo analizaré.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
Wul



Registrado: 30 Jul 2018
Mensajes: 3

Mensaje Publicado: Viernes 31 Ago 2018 14:59

Título del mensaje: Programando desde 0: 13- Un proyecto dificil: Master Mind.

Responder citando

Buenas Kyshuo, me pasa siempre no solo en este(no se si sera alguna opción de pascal, pero no e tocado nada :/ ). Aquí dejo un código simple donde en la segunda cadena se guarda el fin de linea y ademas me faltan dos letras en la segunda palabra una supongo que por el fin de linea y otra no tengo ni idea(dejando siempre las 5 letras que pide).

[Acabo de comprobarlo de nuevo y el borrar y la letra que se borra solo se guarda cuando lo pruebo desde pascal, si lo ejecuto normal me queda (De lobos y perro cuando lo devuelve sale: lobos, fin de linea, per)] e probado mas cosas pero estoy viendo que me esta quedando esto muy largo perdon, aquí el código:

PROGRAM Problema;

TYPE
arr1= array[1..5] of char;

VAR

a,b: arr1;
i: integer;

BEGIN
write('Escribe una palabra de 5 letras: ');
for i:=1 to 5 do
read(a[i]);
writeln;

write('Escribe otra: ');
for i:=1 to 5 do
read(b[i]);
writeln;

write('Has escrito ');
for i:=1 to 5 do
write(a[i]);
write(' y ');
for i:=1 to 5 do
write(b[i]);
END.


PD: Entonces sigue siendo útil este curso ¿no?, para tener unas bases y tal. ¿Los programas que mencionas son unos bases como este o mas avanzados?

Volver arriba
Ver perfil del usuario Enviar mensaje privado
Kyshuo Ayame
Moderador Global


Registrado: 07 Ene 2011
Mensajes: 1027

Mensaje Publicado: Viernes 31 Ago 2018 16:59

Título del mensaje: Programando desde 0: 13- Un proyecto dificil: Master Mind.

Responder citando

Estimado, el asunto con tu código es muy simple: primero tu lees 5 letras, lo cual está bien, pero obviamente presionas ENTER al finalizar la escritura, lo cual es lo mismo que decir que escribes un fin de línea. El ENTER en realidad hace eso, escribe un caracter, como una letra cualquiera, que se conoce como salto de línea. Por tanto, al hacer read más tarde, lees ese caracter.

Tu usas WriteLn para bajar de línea, pero es mejor que utilices un ReadLn vacío en vez de WriteLn, de este modo leerás el fin de línea (eso es lo que diferencia a read de readln) y lo consumirás, bajando el cursor. Cambia tus WriteLn por ReadLn y el código funcionará.

Si quieres agrega un ReadLn al final, luego del último FOR, para poder ver la salida antes de que se cierre la consola.

Cita:
Entonces sigue siendo útil este curso ¿no?, para tener unas bases y tal. ¿Los programas que mencionas son unos bases como este o mas avanzados?


El curso sigue siendo sumamente útil, porque es un curso de programación, es decir, no es un curso de Pascal, sino que te enseña a pensar como programador. Cualquier curso moderno de hoy día, sin importar el lenguaje que enseñe (Java, C++, C#, C, PHP, etc.) te enseñará las mismas cosas que aprendes aquí:

  • Entrada y salida
  • Variables y constantes
  • Tipos de datos
  • Iteración con FOR
  • Iteración condicional con WHILE y REPEAT (en otros lenguajes es WHILE y DO-WHILE pero es exactamente lo mismo).
  • Arreglos
  • Enumerados
  • Recursividad
  • Luego programación orientada a objetos.


Lo que sí te recomiendo es usar el IDE Lazarus, que es mucho más moderno que el FreePascal IDE que usé cuando inicié este curso. Lo puedes bajar en https://www.lazarus-ide.org/

Es mucho más robusto, moderno, cómodo y flexible. Además permite crear aplicaciones gráficas simplemente arrastrando y soltando herramientas dibujando las ventanas, pero para ello obviamente primero tienes que saber programar, porque puedes dibujar ventanas super buenas pero no podrás darles funcionalidad porque para ello tienes que codificar en Pascal.

Anímate a instalarlo. Cuando lo abras por primera vez y vayas a crear un proyecto nuevo, ve al menú Proyecto --> Nuevo proyecto y elige la opción Programa, ya que si eliges Aplicación Lazarus te creará todo el código para programar y dibujar aplicaciones gráficas, y no es lo que estás aprendiendo ahora.

Verás este código:
Código:
  1. program Project1;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. uses
  6. {$IFDEF UNIX}{$IFDEF UseCThreads}
  7. cthreads,
  8. {$ENDIF}{$ENDIF}
  9. Classes
  10. { you can add units after this };
  11.  
  12. begin
  13. end.


Simplemente borra todo y deja las líneas básicas que has aprendido aquí:
Código:
  1. program Project1;
  2.  
  3. begin
  4. end.


Comienza a programar como siempre. Cualquier duda me avisas.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
Wul



Registrado: 30 Jul 2018
Mensajes: 3

Mensaje Publicado: Viernes 31 Ago 2018 21:53

Título del mensaje: Programando desde 0: 13- Un proyecto dificil: Master Mind.

Responder citando

Muchas gracias , lo e modificado y ahora funciona correctamente. Algo tan simple y no lo había probado jajaja.

De acuerdo. Lo probaré pero e de hacer un parón por unas tres/cuatro semanas, si cuando vuelva tengo alguna duda con Lazarus te preguntaré pero por cuestiones de tiempo ahora mismo no puedo.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
Responder al Tema Ir a página Anterior1234567
Mostrar mensajes anteriores:   
Ir a:  
Todas las horas están en GMT + 2 Horas

Temas relacionados

Tema Autor Foros Respuestas Publicado
El tema está bloqueado: no pueden editarse ni agregar mensajes.

Solicito programadores para mi proyecto

alexpin Bolsa de trabajo 0 Miércoles 23 May 2018 22:53 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Llamada a web service desde form

mrrobot2 Programación Web en general 1 Martes 14 Nov 2017 00:50 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Se requiere programador para Proyecto de Juego,...

Otilio Programación de juegos o videojuegos 5 Martes 03 Oct 2017 00:04 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Crear web desde 0

javitc Programación Web en general 9 Sábado 30 Sep 2017 21:23 Ver último mensaje
El tema está bloqueado: no pueden editarse ni agregar mensajes.

Busco personas para un proyecto de Facebook

Andres Gonzales Bolsa de trabajo 0 Domingo 19 Mar 2017 22:35 Ver último mensaje
Panel de Control
No puede crear mensajes, No puede responder temas, No puede editar sus mensajes, No puede borrar sus mensajes, No puede votar en encuestas,