- 1. Consideraciones Generales
- 2. Preámbulo
- 3. Resumen del Proyecto
- 4. Objetivos de Aprendizaje
- 5. Consideraciones Generales
- 6. Consideraciones Técnicas
- 7. Hitos del proyecto
- 8. Recomendaciones
- Este proyecto debe desarrollarse de manera individual.
- La estimación de tiempo para completar el proyecto es de 1 a 2 Sprints.
- Concéntrate en adquirir conocimientos en lugar de simplemente "terminar" el proyecto.
- Ten paciencia. No te preocupes demasiado por lo que aún no entiendes completamente.
- Tu aprendizaje se desarrollará a medida que progreses.
En la actualidad, Java es uno de los lenguajes de programación más utilizados en el mundo. A pesar de la diversidad de plataformas y herramientas disponibles, es fundamental tener una base sólida en los conceptos fundamentales de Java y en la programación orientada a objetos (OOP). El objetivo de este proyecto es introducirte al mundo de Java a través de un juego simple y divertido.
Es un juego interactivo que se desarrolla en el terminal, donde la jugadora y el ordenador se turnan para intentar adivinar un número aleatorio entre 1 y 100. Deben tener en cuenta la tentativa anterior, si fue "muy alta" o "muy baja".
Reflexiona y luego marca los objetivos que has llegado a entender y aplicar en tu proyecto. Piensa en eso al decidir tu estrategia de trabajo.
-
Datos primitivos vs no primitivos
-
Cadenas
-
Arreglos
-
Modificadores de acesso (public, private, protected)
-
Uso de condicionales
-
Uso de bucles (Loops)
-
ArrayList
-
JUnit
-
Mockito
-
Clases
-
Objetos
-
Métodos
-
Atributos
-
Constructores
-
Encapsulamiento
-
Abstracción
-
Composición
-
Interfaces
-
Herencia (super, extends, override)
-
Lenguaje de Modelado Unificado (UML, class diagrams)
- Duración del proyecto: Se estima que este proyecto tomará de 1 a 2 sprints.
- Debe implementarse en Java. Las únicas dependencias externas que se pueden utilizar son JUnit y Mockito para pruebas unitarias.
- El juego se llevará a cabo en el terminal. Las pruebas se pueden ejecutar en el terminal o en su IDE (se recomienda usar IntelliJ Community Edition).
- Se utilizará un número aleatorio entre 1 y 100 como número secreto.
- La jugadora y el ordenador se turnarán para adivinar el número.
- Después de cada turno, se mostrarán información sobre la suposición realizada.
- El juego terminará cuando se adivine el número. Se mostrará una lista de todas las tentativas de la jugadora ganadora.
Propósito: Maneja la lógica principal, decide qué jugador asume el próximo turno.
Atributos:
random
: Generador de números aleatorios.targetNumber
: Número aleatorio entre 1 y 100 a adivinar en la partida actual.
Métodos estáticos (static
):
main(String[] args)
: Inicia el juego y genera el número aleatorio.checkGuess(Player player)
: Ejecuta un turno, obtiene la suposición y evalúa el nuevo estado de la partida.
Propósito: Representa a una jugadora genérica. Es una clase abstracta. Define los atributos y métodos que todas las clases de jugadoras deben compartir:
Atributos:
name
: El nombre de la jugadora.guesses
: El historial de suposiciones de la jugadora.
Métodos:
makeGuess()
: Devuelve la suposición de la jugadora. Es un método abstracto.getName()
: Devuelve el nombre de la jugadora.getGuesses()
: Devuelve el historial de suposiciones de la jugadora.
Propósito: Representa a las jugadoras Humana y Computadora, respectivamente.
Métodos:
makeGuess()
: Método que cada clase que hereda dePlayer
debe implementar.
Relaciones:
- La clase
GuessTheNumberGame
interactúa con las clasesHumanPlayer
yComputerPlayer
para gestionar el juego. - Tanto la clase
HumanPlayer
comoComputer Player
son subclases dePlayer
, lo que implica que heredan todas sus propiedades y métodos, pero también tienen algunas características adicionales propias.
Este diseño de clases permite separar las responsabilidades, facilitando el mantenimiento y posibles extensiones del juego en el futuro.
Por ejemplo, podríamos añadir diferentes jugadoras "máquina" con diferentes estrategias para la suposición automática, un nuevo tipo de jugadora "remota" o incluso diferentes niveles de dificultad.
- La jugadora y el ordenador se turnarán en turnos para intentar adivinar el número.
- Después de cada tentativa, se debe mostrar:
- El nombre del jugador (persona o computadora).
- La suposición realizada.
- Un mensaje indicando si la suposición fue muy alta, muy baja o correcta.
- El juego terminará tan pronto como la jugadora o el ordenador adivine el número secreto. Debe mostrarse un mensaje de fin de juego, así como una lista de todas las tentativas realizadas por la jugadora ganadora.
- El juego se llevará a cabo en el terminal usando Java.
- La lógica del juego se basará en estructuras de control, incluyendo bucles, condicionales y colecciones.
- Es necesario dividir el código y mejorar su legibilidad y mantenimiento.
- Se debe utilizar una funcionalidad de la biblioteca de utilidades de Java para la generación de números aleatorios.
- Se deben realizar pruebas unitarias para sus clases y métodos utilizando JUnit y simulación de generación de números aleatorios con Mockito.
No trabajes como si fueras una fábrica haciendo una clase toda y luego otra. El riesgo de trabajar así es que obtendrás muchas partes sin ninguna o con media funcionalidad y aprenderás poco; no hagas lo contrario tampoco, muchas funcionalidades en la consola, pero sin una finalización que pueda ser utilizada por una usuaria no desarrolladora.
La metáfora a continuación puede ayudarte a entender mejor la idea.
Estas etapas, desde el monopatín hasta el automóvil, son lo que llamaremos "Hitos".
Estos hitos son pequeñas tareas a implementar, así que evita trabajar como una fábrica y podrás aprender un poco de cada cosa, agregando valor para tu usuaria al finalizar cada hito.
A continuación, te dejamos algunos hitos como sugerencia para que construyas tu proyecto.
Debes configurar tu entorno de trabajo, es decir:
- Descargar la versión elegida de Java e instalarla en tu computadora. Hoy, en octubre y noviembre de 2023, recomendamos la versión 21, ya que es la versión más compatible con la IDE IntelliJ.
- Instalar tu IDE (recomendamos usar IntelliJ Community Edition, en casos extremos de recursos computacionales se puede utilizar el VSCode).
- Tutoriales para la preparación del entorno Java
- ¿Cómo instalo Java?
- Install IntelliJ IDEA
- Guía paso a paso para instalar Intellij Idea en Mac
Crea la primera clase del proyecto que contenga el método main. Puedes agregar un comando que muestre "¡Hola mundo!" en la consola. Así podrás verificar si tus configuraciones son correctas. Además, puedes estudiar conceptos del lenguaje como:
- ¿Qué son las clases y cómo construirlas?
- ¿Qué son los métodos y cómo utilizarlos?
- ¿Qué tipos de datos existen en el lenguaje? (Recuerda los que más usaste en JavaScript y trata de buscar tipos similares).
- ¿Cómo crear un array usando Java?
- ¿Qué son los modificadores de acceso como:
public
,private
,protected
? - ¿Qué son los métodos constructores? ¿Cómo hacerlos?
- ¿Qué es el encapsulamiento? ¿Cómo hacerlo?
- ¿Qué es la herencia? ¿Cómo crearla en Java?
Recuerda también utilizar contenidos prácticos para comprender estos conceptos. ¡No pases mucho tiempo solo leyendo o viendo videos! ¡Crea códigos! Inténtalo, equivócate, inténtalo de nuevo, etc.
- Learn the Basics of Java Programming
- Programación Orientada a Objetos com Java
- Java Basic Syntax
- Java Data Types And Variables – Explained for Beginners
- Learn Java
- Java Classes and Objects
- Java Methods
Dejamos un Diagrama de Clases para que te sirva de base para construir tu proyecto. Pero es necesario comprender lo que significa antes de empezar a desarrollar lo que será tu proyecto. En este hito, puedes comprender lo que este diagrama está representando.
En este hito, puedes crear el juego para un solo jugador.
Comienza creando las clases que representan a la jugadora humana. Luego, elige el número objetivo, que debe ser un número aleatorio entre 1 y 100, y finalmente, crea la lógica para verificar si el número de la jugadora es menor o mayor que el valor objetivo. Muestra en la terminal si es un valor alto o bajo.
- Java: Cómo leer y presentar datos con los comandos de entrada y salida
- Java Scanner
- Scanner class in Java
- Java User Input
- Número Aleatorio
En este hito, puedes agregar otra jugadora al juego.
Comienza creando las clases que representan a la segunda jugadora, que podría ser la computadora. Desarrolla la lógica para alternar entre las jugadoras. Finalmente, agrega información adicional cuando alguna jugadora gane el juego. Puedes mostrar la cantidad de intentos y cuáles fueron los intentos de la jugadora.
En este hito, configura las bibliotecas JUnit5 y Mockito en tu IDE para que puedas crear pruebas unitarias.
Le recomendamos que utilice las bibliotecas presentes en el repositorio de Maven:
- org.junit.jupiter:junit-jupiter
- org.mockito:mockito-core
Crea las pruebas unitarias para tu proyecto. Asegúrate de cubrir con pruebas la lógica de tu juego basándote en comportamientos. Por ejemplo, crea pruebas que:
- Simulen que el número de la jugadora es mayor que el número objetivo.
- Simulen que el número de la jugadora es menor que el número objetivo.
- Simulen que el número es el mismo número objetivo.
- Calidad y JUnit: Introducción a la automatización de pruebas unitarias en tu software Java en el día a día
- Tutorial de Mockito
En este hito, que consideramos como Edición Hacker, puedes crear una lógica para que los número de la segunda jugadora, cuando estás jugando contra la computadora, sean más inteligentes. Estos número pueden considerar la información sobre si el número es alto o bajo en relación con el número objetivo, haciendo que el juego sea más emocionante.
Documentación de Java: La documentación oficial de Java es una excelente fuente de información sobre las clases y métodos disponibles en Java (recomendamos usar Java 21).
Diseño de la Estructura del Juego: Antes de empezar a escribir código, considera cómo quieres que funcione el juego. Piensa en cómo alternar los turnos entre la jugadora y la computadora, cómo generar y evaluar las suposiciones, y cómo mostrar información a la jugadora. Tómate un momento para analizar y diseñar tu solución antes de empezar a implementarla.
Separación de Responsabilidades: Recomendamos seguir el diagrama de clases proporcionado para obtener una clara separación de la lógica del juego en componentes o clases que permitan mantener el código organizado y legible.
Necesitarás Bucles y Condiciones: Los bucles y las declaraciones condicionales serán tus aliados en este proyecto para controlar los turnos, evaluar las suposiciones y determinar el ganador.
Manipulación de Números Aleatorios: Utiliza la clase Random
de java.util
para generar el número aleatorio secreto. Puedes encontrar información
sobre cómo usarla en la documentación de Java.
Pruebas Unitarias: A medida que desarrollas el juego, intenta escribir pruebas unitarias para verificar que las diferentes partes del juego funcionan como se espera. Puedes usar el framework JUnit para escribir tus pruebas.
Recuerda que este proyecto está diseñado para que apliques tu conocimiento previo en JavaScript, "traduciéndolo" a Java, y aprendas el paradigma de programación orientada a objetos en el proceso.
¡Diviértete construyendo tu juego de adivinanza de números! 🎲🎮