En el corazón de la programación moderna, C# se erige como un pilar fundamental, combinando potencia, elegancia y versatilidad. Diseñado por Microsoft como parte de su plataforma .NET, C# ha evolucionado para ser mucho más que el lenguaje de elección para aplicaciones de Windows; se ha convertido en una herramienta indispensable para desarrollar aplicaciones web, móviles y de escritorio en un espectro amplio de dominios. El proyecto "Guess the Number", no solo es una presentación del universo de C#, es también una guía por los principios esenciales de la programación orientada a objetos y el manejo de los principios básicos de este lenguaje. Prepárate para embarcarte en una aventura que te llevará desde los fundamentos hasta los aspectos más interesantes de la programación en C#, todo ello mientras construyes un juego que desafiará tu ingenio.
Antes de sumergirnos en el código y la lógica detrás de "Guess the Number", es crucial establecer algunas consideraciones generales para garantizar una experiencia de aprendizaje fluida y efectiva:
-
Conocimientos previos: Aunque este proyecto está dirigido a principiantes en C#, se recomienda tener una comprensión básica de conceptos de programación como variables, bucles y condiciones. Esto facilitará el seguimiento de las explicaciones y la implementación del juego.
-
Experimentación activa: Te animamos a experimentar con el código más allá de las instrucciones y ejemplos proporcionados. Modificar y jugar con el código es una de las mejores maneras de aprender y consolidar tus habilidades de programación.
-
Paciencia y persistencia: El tiempo estimado para desarrollar este proyecto es de 2 sprints. Es normal enfrentarse a errores y desafíos. Tómate tu tiempo, practica y no dudes en buscar ayuda cuando la necesites.
Para garantizar el éxito de este proyecto, es importante prestar atención a las siguientes consideraciones técnicas:
-
Versión de .NET: Este proyecto se basa en .NET 5.0 o superior. Asegúrate de tener instalada la versión correcta del SDK de .NET para poder compilar y ejecutar el juego sin problemas.
-
Estructura del proyecto: El proyecto "Guess The Number" se organiza en una estructura de proyecto simple, con una clase principal que contiene el flujo lógico del juego. Familiarizarte con la estructura del proyecto te ayudará a entender mejor cómo funciona el código y cómo puedes expandirlo o modificarlo.
-
Documentación y Comentarios: Mantén tu código bien documentado y comenta las secciones complejas o importantes. Esto no solo te ayudará a ti y a otros a entender el código, sino que también es una práctica recomendada en el desarrollo de software.
-
Otros aspectos importantes:
-
Ambiente: Tu proyecto se debe poder ejecutar desde la terminal (inicia por crear un proyecto de consola).
-
Organización: tu código debe estár dividido para facilidad de mantenimiento.
-
Aleatoriedad: Debes utilizar
new Random()
para generar números aleatorios. -
Pruebas Unitarias: Debes realizar pruebas unitarias para validar tus funciones.
-
Para hacer este proceso de aprendizaje más manejable y gratificante, hemos dividido el proyecto en hitos claramente definidos. Cada hito representa un paso crucial en la construcción del juego, permitiéndote enfocarte en tareas específicas, comprender mejor cada componente del proyecto y, lo más importante, celebrar tus logros a medida que avanzas.
Estos hitos están diseñados no solo para guiarte a través del desarrollo del juego, sino también para proporcionarte oportunidades de experimentación y personalización. A continuación, presentaremos cada hito, explicando su objetivo, los conceptos clave que cubrirá y sugerencias para explorar más allá de los requisitos básicos.
Te animamos a abordar estos hitos con curiosidad y creatividad, adaptando el proyecto a tus intereses y desafiándote a ti misma para aprender más en cada paso.
- Instalar el .NET SDK y un IDE (Visual Studio Code o Visual Studio).
- Familiarizarse con el entorno de desarrollo y las herramientas básicas.
- Crear un proyecto de consola en C# y ejecutar un programa simple ("Hola Mundo").
-
Guías para iniciar:
- Familiarizarse con las estructuras de control básicas en C#
(
if
,else
,while
,for
). - Aprender a leer la entrada del usuario y mostrar mensajes en la consola.
Desarrollar un programa que solicite al usuario adivinar un número fijo, indicando después si su elección es correcta, demasiado alta o demasiado baja.
Para esto, tu proyecto debe contar con 2 clases: Program
y Game
(recuerda que las clases se deben ubicar en 2 archivos distintos),
la clase Game
implementará un método con las siguientes responsabilidades:
- Genera un número aleatorio entre 1 y 100.
- Implementa un bucle que solicite a la jugadora que adivine el número.
- Compara la entrada de la jugadora con el número secreto. Si la jugadora adivina correctamente, termina el juego. Si la jugadora no adivina el número, proporciona una pista sobre si el número secreto es mayor o menor que la entrada de la jugadora.
La clase Program
será la encargada de dar la bienvenida a la jugadora e inicializar
el juego (ejecutar alguna función de la clase Game
).
-
Documentación sobre estructuras de control en C#:
-
Tutoriales sobre cómo usar
Console.ReadLine()
yConsole.WriteLine()
para la entrada/salida de datos:
- Operadores de comparación: Comparison Operators
- convertir en número: Convert.ToInt32
- Comprender y aplicar el uso de clases y objetos en C#.
- Introducir el concepto de campos (atributos) y métodos en una clase.
Desarrollar clases en C# que encapsulen la funcionalidad requerida para jugar. Debes agregar una clase extra a lo que ya has logrado hasta este punto. Tu proyecto debe incluir:
Una clase Player
, que debe encapsular las características y acciones que una
jugadora puede realizar durante una partida.
- Características de la clase Player:
- Propiedad que almacena el nombre.
- Propiedad que almacena el último intento realizado por la jugadora.
- Constructor que inicializa el último intento en cero y el nombre según el valor con el que fue instanciado.
- Método que se encarga de hacer la predicción(
MakeGuess()
) solicitando por terminal un número y validando que sea correcto.
Una clase Game
que gestione la lógica del juego,
como iniciar una nueva partida, generar el número secreto y determinar
el resultado de los intentos del jugador.
- Características de la clase Game:
- Propiedad que almacena un número aleatorio.
- Propiedad que almacena una instancia de Jugadora (propiedad de tipo
Player
). - Constructor que inicializa su número aleatorio y
crea un nuevo objeto de tipo Player. Este constructor se inicializa
con un nombre, que despues será utilizado para el constructor de
Player
. - Al método existente, se le agrega la responsabilidad de instanciar él
comportamiento de la jugadora,
(es decir de ejecutar la función
Player.MakeGuess()
, en caso de que no lograra adivinar el número en su último intento. Si la jugadora logra adivinarlo, filnalizar el juego.
Tu clase Program
mantiene la responsabilidad de inicializar el juego,
es decir, dentro de su método Main
debes instanciar a la clase
Game
y ejecutar su método para iniciar el juego.
-
Documentación sobre clases y objetos en C#:
- Modificadores de acceso: Access Modifiers
- Interpolación de cadenas: String interpolation
- Aplicar el principio de encapsulamiento
para proteger el estado interno de la clase
Game
. - Crear métodos específicos para manejar las funcionalidades del juego.
Refactorizar el código del juego para que la lógica interna del juego
esté oculta y accesible solo a través de métodos públicos de la clase Game
.
- Características de la clase Game:
- Sus propiedades ahora deben ser privadas.
- Agrega un método privado que nos va a permitir generar un número aleatorio (
RandomNumberGenerator()
). - Agrega un método privado que nos va a permitir validar la predicción
(
CheckGuess(int guess, int targetNumber)
). - Ahora los únicos métodos públicos son el constructor y el método para inicializar el juego.
- Características de la clase Player:
- La propiedad que almacena el último intento ahora es privada.
- La propiedad de Nombre es pública.
- Agregaremos un método público que nos permita consultar el último intento (
GetLastGuess()
). - El método constructor y el encargado de gestionar la lógica para hacer la
predicción (
MakeGuess()
) deben ser públicos.
-
Guías sobre encapsulamiento y acceso a los miembros de una clase en C#.
- Uso de
readonly
: Diferencias entre const y readonly en C# - Tipos nulos: nullable-reference-types
- Paso por valor y paso por referencia: Short C#
- Paso por valor y paso por referencia: CURSO DE C#
- Explorar la herencia como medio para extender o modificar la funcionalidad de las clases existentes.
- Comprender el polimorfismo y cómo se puede implementar en C#.
Transformar la clase Player
a una clase abstracta y crear las clases
AIPlayer
y HumanPlayer
(derivadas) para representar diferentes tipos de jugadores, implementando
la lógica de adivinación específica para cada tipo mediante herencia y polimorfismo.
- Características de la clase Player:
- Ahora es una clase abstracta.
- Las propiedades son públicas.
- Se agrega una propiedad de tipo
List
para almacenar las predicciones realizadas. - El constructor es
protected
, y recibe como parámetro un nombre, además de inicializar la lista. - El método de adivinación (
MakeGuess()
) ahora es abstracto.
- Características de la clase AIPlayer:
- implementa la clase abstracta
Player
. - propiedad privada que nos permite generar un número aleatorio.
- Implementación del método de adivinación (
MakeGuess()
) que devuelve un número aleatorio.
- Características de la clase HumanPlayer:
- implementa la clase abstracta
Player
. - Implementación del método de adivinación (
MakeGuess()
) que pregunta a la usuaria por un número.
- Características de la clase Game:
- Ahora tiene 2 propiedades nuevas:
_humanPlayer
y_AIPlayer
de tipoPlayer
. - Su constructor inicializa estas nuevas variables además de el número aleatorio.
- El método para inicializar el juego, ahora además se encarga de
gestionar los turnos, permitiendo el turno de la jugadora y mostrando
la adivinación realizada por la computadora
(
_AIPlayer.MakeGuess()
)
- Herencia en C#: Inheritance in C#
- Polimorfismo en C#: Polymorphism in C#
- Listas y arreglos en C#: Working with lists and arrays in C#
- Listas arrays and collections
- Ciclos iteration statements
El proyecto se estructura alrededor de las siguientes clases principales, con las siguientes responsabilidades y relaciones:
-
Responsabilidades:
- Iniciar el juego.
- Generar y mantener el número secreto a adivinar.
- Controlar el flujo del juego, alternando turnos entre los jugadores.
-
Relaciones:
- Asociación con
Player
(incluyendoHumanPlayer
yAIPlayer
).
- Asociación con
-
Responsabilidades:
- Definir una interfaz común para todos los jugadores.
- Mantener el nombre y el historial de suposiciones del jugador.
-
Relaciones:
- Superclase de
HumanPlayer
yAIPlayer
.
- Superclase de
-
Responsabilidades:
- Permitir al usuario hacer suposiciones ingresando números.
-
Relaciones:
- Hereda de
Player
.
- Hereda de
-
Responsabilidades:
- Generar suposiciones automáticamente (simulando una IA básica).
-
Relaciones:
- Hereda de
Player
.
- Hereda de
Game
tiene dos instancias dePlayer
: una para el jugador humano y otra para la IA, demostrando una relación de asociación/composición.Player
es una clase abstracta que define la estructura y comportamiento comunes para todos los jugadores, conHumanPlayer
yAIPlayer
especializando esta definición mediante herencia.
Este diseño nos una clara separación de responsabilidades entre la gestión del juego y la lógica específica del jugador, facilitando la extensión y mantenimiento del código.
- ¿Cómo hacer un diagrama de clase? - Diagrama de clases UML
- Video: Cómo hacer un DIAGRAMA de CLASES UML ✅ [ fácil y profesional ]
- Implementar pruebas unitarias con MSTest para validar la lógica y funcionamiento del juego.
- Asegurar la calidad del software mediante la detección temprana de errores y comportamientos inesperados.
Crear una suite de pruebas unitarias que cubra los distintos componentes y funcionalidades del juego, incluyendo la generación del número secreto, la validación de entradas del usuario, y la lógica de juego para determinar victorias y derrotas.
-
Introducción a MSTest y pruebas unitarias en .NET:
-
Tutoriales y guías sobre cómo escribir pruebas unitarias efectivas:
-
Principios de pruebas de software y desarrollo dirigido por pruebas (TDD):
-
Estrategias para mockear y testear interacciones con el usuario: