Pens. comp. para ingeniería

Proyecto Integrador: Toros y vacas

Objetivo

Durante esta actividad, los alumnos serán capaces de:


Subcompetencias a demostrar con esta evidencia

Competencias Subcompetencias Criterio
SING0300:
Solución de problemas
SING0301A:
Evaluación del problema
  • Diseño de funciones para estructurar un programa y cada función tiene un propósito específico.
  • Diseño de los casos de prueba para los casos generales del problema.
  • Identificación de los casos límite al diseñar los casos de prueba.
SING0303A:
Implementación de acciones
  • Programa que funciona de manera correcta para todos los casos solicitados explícitamente en la descripción del problema.
  • Uso correcto de los estatutos para resolver el programa.
SING0400:
Compromiso con la sustentabilidad
SING0401A:
Aplicación de estándares y normas
  • Programa que usa las convenciones de codificación del lenguaje y que contiene comentarios para aclarar su funcionalidad.
SEG0700:
Transformación digital
SEG0702A:
Tecnologías de vanguardia
  • Utilización de al menos un ambiente de programación.
  • Selección de la herramienta pertinente para desarrollar códigos, a partir de un conjunto de ambientes disponibles.
  • Solución de problemas utilizando programación.
  • Programa que considera todos los casos solicitados explícitamente en la descripción del problema.

Introducción

Patricio Ávila, en su artículo de junio de 2018 titulado “Qué le depara a México la prueba PISA 2018” de la revista El mundo de la educación, señala lo siguiente:

El Programa Internacional de Evaluación de los Alumnos (PISA, por sus siglas en inglés) califica cada tres años a los estudiantes que están terminando la educación obligatoria (en promedio con 15 años de edad) en tres áreas distintas: lectura, matemáticas y ciencias. Haciendo una revisión superficial de los datos aportados por la OCDE, es relativamente sencillo darse cuenta de que la separación entre los países con mejores resultados y México aún es abismal”

Esta es a la situación a la que nos hemos enfrentado en México cada tres años por un largo tiempo: “un mal desempeño de nuestros estudiantes”. Hay muchos factores que dan lugar a este tipo de resultados, pero ¿y nosotros como alumnos y profesores qué estamos haciendo para mejorar esta situación? ¿qué podríamos hacer?

Para este proyecto se te pedirá elaborar un juego para niños que les permita desarrollar o mejorar sus habilidades cognitivas.

Descripción del juego

El programa de Toros y vacas (en inglés: Bulls and Cows) comienza seleccionando al azar un código secreto de cuatro dígitos distintos. El jugador tiene que adivinarlo en la menor cantidad de intentos. No hay límite en cuanto al número de intentos.

Después de cada intento el programa debe indicar cuántos toros y cuántas vacas obtuvo el jugador:

Por ejemplo:

— Código secreto: 2435
— Intento del jugador: 1234
— Resultado: Un toro y dos vacas (el toro es el 3 y las vacas son 2 y 4).

El juego termina cuando el jugador obtenga cuatro toros, es decir, cuando haya descubierto todos los dígitos y posiciones correctas del código secreto.

Especificaciones del programa

  1. Este proyecto debe ser elaborado de manera individual.
  2. El programa debe estar escrito en el lenguaje Python 3 y debe implementar puntualmente todas las reglas del juego de Toros y vacas tal y como están descritas arriba.

  3. Todo el código del programa debe estar compuesto de una serie de funciones contenidas en un solo archivo fuente llamado toros_y_vacas.py.

  4. En la parte superior del archivo se debe incluir un comentario similar al siguiente, reemplazando los datos ficticios con los datos personales (matrícula y nombre) del autor del programa:

    # ------------------------------------------------------------
    # Autor: A01166611 Pepper Pots
    # 22 de octubre, 2019.
    #
    # TOROS Y VACAS
    # =============
    # Descripción del proyecto.
    # ------------------------------------------------------------
    
        .
        . (El resto del programa va aquí)
        .
    
  5. Todas las funciones del programa deben incluir al inicio una cadena de documentación que describa brevemente el comportamiento de la función seguido, cuando sea apropiado, de uno o varios casos de prueba. Por ejemplo:

    def imprime_titulo():
        """Despliega el nombre y autor de la aplicación.
    
        >>> imprime_titulo()
        T O R O S   Y   V A C A S
        =========================
        © 2019 por Pepper Pots
        """
        print('T O R O S   Y   V A C A S')
        print('=========================')
        print('\N{Copyright Sign} 2019 por Pepper Pots')
    
  6. Al iniciar la ejecución del programa se debe desplegar el título de la aplicación (nombre del programa y autor) y se le debe ofrecer al jugador la opción de ver las instrucciones del juego.

  7. El programa debe indicar en qué número de intento va el juego cada vez que se solicite el ingreso del código del jugador.

  8. Si durante un intento el jugador ingresa como código una entrada inválida (una cadena que contenga caracteres que no sean dígitos, o que el número de dígitos sea distinto a cuatro, o que existan dígitos repetidos) el programa debe desplegar un mensaje de error y solicitar una nueva entrada. Una entrada inválida no incrementa el contador de número de intentos.

  9. Durante cualquier intento, en lugar de ingresar un código el jugador debe tener la opción de teclear la letra “X” para indicar que se rinde y que desea terminar el juego en ese momento. Si eso ocurre, el juego concluye desplegando cuál era el código secreto.

  10. Cuando el jugador obtenga cuatro toros, el juego termina felicitando al jugador e informándole en cuántos turnos logró adivinar el código secreto.

  11. Al concluir un juego, ya sea porque el jugador ganó o porque se rindió, el programa debe preguntarle al usuario si desea jugar otra vez. En caso afirmativo se debe iniciar un nuevo juego. De lo contrario el programa debe terminar.

  12. Las entradas del usuario que requieran caracteres alfabéticos deben considerarse sin hacer distinción entre mayúsculas y minúsculas.

  13. La información desplegada respecto al número de intentos, toros y vacas debe estar correctamente pluralizada. Por ejemplo, el programa debe decir “Lo lograste en 1 intento”, en lugar de “Lo lograste en 1 intentos”.

  14. Todo el código debe apegarse a las convenciones de codificación del lenguaje Python.

Ejemplo de corrida

A continuación se proporciona un ejemplo de una corrida completa del programa (la entrada del usuario está en azul):

T O R O S   Y   V A C A S
=========================
© 2019 por Pepper Pots

¿Deseas ver las instrucciones? (S/N): s

INSTRUCCIONES

El programa seleccionará un código secreto de cuatro dígitos
distintos y tú tienes que adivinar cuál es en la menor
cantidad de intentos. No hay límite en cuanto al número de
intentos.

Después de cada uno de tus intentos el programa te dirá
cuántos "toros" y cuántas "vacas" obtuviste:

- Un "toro" indica que uno de los dígitos que ingresaste
  coincide exactamente con el valor y la posición de uno
  de los dígitos en el código secreto.

- Una "vaca" indica que uno de los dígitos que ingresaste
  coincide con el valor de uno de los dígitos en el código
  secreto, pero que está en una posición incorrecta.

El juego termina cuando obtengas cuatro "toros", es decir,
cuando hayas descubierto todos los dígitos y posiciones
correctas del código secreto.

==== Intento #1 ====
Ingresa un código (X para rendirte): 1234
Obtuviste 0 toros y 1 vaca.

==== Intento #2 ====
Ingresa un código (X para rendirte): 2345
Obtuviste 0 toros y 1 vaca.

==== Intento #3 ====
Ingresa un código (X para rendirte): 3456
Obtuviste 2 toros y 0 vacas.

==== Intento #4 ====
Ingresa un código (X para rendirte): 3578
Obtuviste 0 toros y 2 vacas.

==== Intento #5 ====
Ingresa un código (X para rendirte): 0459
Obtuviste 1 toro y 0 vacas.

==== Intento #6 ====
Ingresa un código (X para rendirte): 1406
Obtuviste 2 toros y 0 vacas.

==== Intento #7 ====
Ingresa un código (X para rendirte): 8476
Obtuviste 2 toros y 2 vacas.

==== Intento #8 ====
Ingresa un código (X para rendirte): 7486
Obtuviste 4 toros y 0 vacas.

¡Felicidades! Lo lograste en 8 intentos.

¿Deseas volver a jugar? (S/N): s

==== Intento #1 ====
Ingresa un código (X para rendirte): 1234
Obtuviste 0 toros y 1 vaca.

==== Intento #2 ====
Ingresa un código (X para rendirte): 12345
Debes ingresar exactamente cuatro dígitos distintos.

==== Intento #2 ====
Ingresa un código (X para rendirte): 1231
Debes ingresar exactamente cuatro dígitos distintos.

==== Intento #2 ====
Ingresa un código (X para rendirte): 1111
Debes ingresar exactamente cuatro dígitos distintos.

==== Intento #2 ====
Ingresa un código (X para rendirte): me rindo
Debes ingresar exactamente cuatro dígitos distintos.

==== Intento #2 ====
Ingresa un código (X para rendirte): x

Te rendiste.
El código secreto era: 7863

¿Deseas volver a jugar? (S/N): s

==== Intento #1 ====
Ingresa un código (X para rendirte): 4597
Obtuviste 4 toros y 0 vacas.

¡Felicidades! Lo lograste en 1 intento.

¿Deseas volver a jugar? (S/N): n

Funciones sugeridas

A continuación se describen las funciones que pueden servir como base para construir el programa.

  1. Función que imprime los títulos de la aplicación (nombre del programa y autor).

  2. Función que imprime las instrucciones del juego si el usuario así lo desea.

  3. Función que devuelve un nuevo código secreto (una cadena de caracteres de cuatro dígitos al azar), por ejemplo: "2435". Para ello se puede usar la función sample del módulo random.
  4. Función que evalúa un intento del jugador. Recibe dos argumentos (el código secreto y el código seleccionado por el jugador) y devuelve una tupla con el número de toros y el número de vacas obtenidas. Por ejemplo, si las entradas son "2435" y "1234", entonces debe devolver (1, 2).

  5. Función que recibe como argumento un número entero y una cadena de caracteres con una palabra. Devuelve una cadena formada por la concatenación del número y la palabra adecuadamente pluralizada. Por ejemplo, si las entradas son 2 y "vaca", el valor devuelto debe ser: "2 vacas". Por otro lador, si las entradas son 1 y "toro", el valor devuelto debe ser: "1 toro".

  6. Función que recibe como argumento una cadena de caracteres y devuelve True o False dependiendo si es o no una entrada válida del usuario. Es válida si está conformada exactamente por cuatro dígitos no repetidos. Por ejemplo, si la entrada es "1234" devuelve True. Por otro lado, si la entrada es "1213" devuelve False.

  7. Función que controla la lógica de un juego completo. Usa un contador para determinar el número de intentos que lleva el jugador. Usa la función del punto 3 para generar un código secreto. De manera repetida solicita al usuario que ingrese su entrada. Si la entrada es "X", se termina el juego y se indica cuál era el código secreto. De lo contrario, se utiliza la función del punto 6 para determinar si la entrada es válida. Si no lo es, vuelve a solicitar una nueva entrada. Cuando ya se tiene una entrada válida, se procede a evaluarla usando la función del punto 4 y se despliega el resultado utilizando la pluralización correcta con ayuda de la función del punto 5. El juego termina si el jugador obtuvo cuatro toros. En ese caso se le felicita y se muestra en cuántos intentos lo logró (pluralizado correctamente con la ayuda de la función del punto 5).
  8. Función principal del programa. Despliega los títulos y posiblemente las instrucciones del juego haciendo uso de las funciones de los puntos 1 y 2. Posteriormente, se invoca la función del punto 7. Al concluir cada juego se le pregunta al usuario si desea volver a jugar. En caso afirmativo se vuelve a invocar la función del punto 7. En caso negativo el programa finaliza.

¿Qué se debe entregar?

Como se indicó anteriormente, todo el código del programa debe estar en un solo archivo fuente llamado toros_y_vacas.py.

Instrucciones para subir archivo

Para entregar el archivo toros_y_vacas.py, ingresa los siguientes datos:

Solicitar NIP

Fecha límite: Martes, 22 de octubre.