diff --git a/README.md b/README.md index 91ab44d..a06dfc9 100644 --- a/README.md +++ b/README.md @@ -1,107 +1,50 @@ # Adivina el Número - Guess the Number -## Índice - -- [1. Resumen del Proyecto](#1-resumen-del-proyecto) -- [2. Consideraciones Generales](#2-consideraciones-generales) -- [3. Objetivos de Aprendizaje](#3-objetivos-de-aprendizaje) - ---- - -![GUESS THE -NUMBER](https://firebasestorage.googleapis.com/v0/b/laboratoria-945ea.appspot.com/o/guess-the-number.png?alt=media) - ## 1. Resumen del Proyecto _Guess The Number_ 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". - ![Demostración animada de sesión de juego](https://firebasestorage.googleapis.com/v0/b/laboratoria-945ea.appspot.com/o/guess-the-number-demo.gif?alt=media) -## 2. Consideraciones Generales - -- 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. - -### **Criterios de Aceptación Mínimos del Proyecto** - -- 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. - -**_¡Diviértete construyendo tu juego de adivinanza de números! 🎲🎮_** - -- [Versión en Python](./docs/README-python.md) -- [Versión en Java](./docs/README-java.md) -- [Versión en C#](./docs/README-csharp.md) - -## 3. Objetivos de Aprendizaje - - -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. - -### Java - -- [ ] **Modificadores de acesso (public, private, protected)** - -- [ ] **Uso de condicionales** - -- [ ] **Uso de bucles (Loops)** - -#### Tipos de data - -- [ ] **Datos primitivos vs no primitivos** - -- [ ] **Cadenas** - -- [ ] **Arreglos** - -#### Colecciones - -- [ ] **ArrayList** - -#### Testing - -- [ ] **JUnit** - -- [ ] **Mockito** - -### Programación Orientada a Objetos (OOP) - -- [ ] **Clases** - -- [ ] **Objetos** - -- [ ] **Métodos** -- [ ] **Atributos** +**Elementos del juego** -- [ ] **Constructores** +- player 1 +- Computadora +- Numero aleatorio con random +- Random que virifca y guarda dos numeros para crear el limite de consulta segun el Rango que computadora indique -- [ ] **Encapsulamiento** +**En este proyecto trabaje todo desde una solo archivo Python ya que lo veo mas practico, la distribucion fue la siguiente:** +- Main.py : en este archivo cree la importacion de dos librerias una llamada random y la otra llamada time (manejo y usos se los dejare abajo) +- El objetivo principal era crear una variable Random que creara un numero aleatorio para que pueda ser adivinado. +- Llegamos a la creacion de una funcion llamada **Comparation_result** con su argumento **consult**, +este esta verifica si el numero que generamos en random es mayor o menor. -- [ ] **Abstracción** +**Ìngresamos al area del** **Ciclo o Bucle** + - En el bucle verificamos con un input el ingreso del valor de uno de los jugadores **player** una vez tengamos el numero de **player** + lo comparamos con : + - Numero correcto. + - Numero mernor. + - Numero mayor. + **Creamos una variable llamada **computadora_numero** donde con un random genera su numero para ser comparado y lograr la interaccion de player y "computadora"** + donde dicho numero es tambien verificado con: + - Numero correcto. + - Numero mernor. + - Numero mayor. + **En este while utilizamos la declaracion break para romper el ciclo y no crear ciclos infinitos o con errores que dificulten el proceso del while.** -- [ ] **Composición** +**Utilizo la funcion **time.sleep(1)** para pausar la ejecucion 1 segundo , esto lo hago para tener una mejor experiencia en el juego.** -- [ ] **Interfaces** +**Ingresando al modo Hacker** +- en esta seccion transformamos la interaccion de **computadora_numero** con la creacion de un random.randint(MIN_NUM, MAX_NUM) que guarde el ultimo valor de dicha variable bien sea por arriba o por abajo del numero random principal, esto genera un nuevo rango con el cual aseguramos que **computadora_numero** tenga una "ventaja" y aseguremos menor rango de numeros repetidos. -- [ ] **Herencia (super, extends, override)** +
Links de Consulta

-- [ ] **Lenguaje de Modelado Unificado (UML, class diagrams)** + * [MSTest V2 - GitHub](https://github.com/microsoft/testfx?tab=readme-ov-file) + * [Prueba unitaria de C# con MSTest y .NET](https://learn.microsoft.com/es-es/dotnet/core/testing/unit-testing-with-mstest) +

### Python @@ -384,20 +327,4 @@ Reflexiona y luego marca los objetivos que has llegado a entender y aplicar en t * [Prueba unitaria de C# con MSTest y .NET](https://learn.microsoft.com/es-es/dotnet/core/testing/unit-testing-with-mstest)

-### Control de Versiones (Git y GitHub) - -#### Git - -- [ ] **Git: Instalación y configuración** - -- [ ] **Git: Control de versiones con git (init, clone, add, commit, status, push, pull, remote)** - -- [ ] **Git: Integración de cambios entre ramas (branch, checkout, fetch, merge, reset, rebase, tag)** - -#### GitHub - -- [ ] **GitHub: Creación de cuenta y repos, configuración de llaves SSH** - -- [ ] **GitHub: Colaboración en Github (branches | forks | pull requests | code review | tags)** -- [ ] **GitHub: Organización en Github (projects | issues | labels | milestones | releases)** diff --git a/docs/FAQ-java.md b/docs/FAQ-java.md deleted file mode 100644 index fbf8a77..0000000 --- a/docs/FAQ-java.md +++ /dev/null @@ -1,28 +0,0 @@ -# FAQ - Java (preguntas frecuentes) - -- ¿Cómo puedo instalar lo necesario para comensar? - - Puedes consultar la siguiente - [Guía sobre Java setup](https://github.com/Laboratoria/java-setup) - -- ¿Cómo puedo aprender los conceptos básicos de POO? - - Puedes consultar la siguiente - [Guía sobre Programación orienta a objectos](https://github.com/Laboratoria/java-oop) - -- ¿Cómo puedo crear una aplicación en Java? - - Puedes consultar el siguiente video en - [IntelliJ](https://www.youtube.com/watch?v=VcvJBeYxVto) o [vscode](https://www.youtube.com/watch?v=cnQ9O9zX4ls) - -- Primeros pasos para crear el primer test - - Puedes consultar el siguiente video en - [del primer test en IntelliJ](https://www.youtube.com/watch?v=8VtSNVwyHg4) - o [del primer test en vscode](https://www.youtube.com/watch?v=8Jgw4Ne4Qqg) - -- Primeros pasos para crear el primer mock - - Puedes consultar el siguiente video en - [del primer mock en IntelliJ](https://www.youtube.com/watch?v=xiMOETNNk3w) - o [del primer mock en vscode](https://www.youtube.com/watch?v=YNJGfM_ztCo) diff --git a/docs/README-csharp.md b/docs/README-csharp.md deleted file mode 100644 index 2d55f3c..0000000 --- a/docs/README-csharp.md +++ /dev/null @@ -1,419 +0,0 @@ -# C# 💻 - -## 1. Preámbulo - -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. - -## 2. Consideraciones Generales - -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. - -## 3. Consideraciones Técnicas - -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. - -## 4. Hitos del Proyecto - -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. - -### Hito 1: Configuración del Entorno de Desarrollo - -#### Objetivos - -- 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"). - -#### Recursos - -- Guías para iniciar: - - + [Tutorial: Creación de una aplicación de consola de .NET con Visual Studio Code](https://learn.microsoft.com/es-es/dotnet/core/tutorials/with-visual-studio-code?pivots=dotnet-8-0) - + [Tutorial de .NET: Hola mundo en 5 minutos](https://dotnet.microsoft.com/es-es/learn/dotnet/hello-world-tutorial/intro) - + [Aprende C#](https://youtu.be/axHut2e84fc?si=AJcTUEMfxKnPSTC3) - + [C# Desde Cero: Primeros Pasos](https://youtu.be/L-f8u0hwi4Y?si=q0UD721sVsvuF-xs) - -### Hito 2: Estructuras de Control y Entrada/Salida - -#### Objetivos - -- 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. - -#### Desafío - -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: - - 1. Genera un número aleatorio entre 1 y 100. - 2. Implementa un bucle que solicite a la jugadora que adivine el número. - 3. 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`_). - -#### Recursos - -- Documentación sobre estructuras de control en C#: - - + [Selection Statements](https://learn.microsoft.com/es-es/dotnet/csharp/language-reference/statements/selection-statements) - + [Tutorial: Estructuras de control en C#](https://www.youtube.com/watch?v=VBf3nEinpfA&list=PLU8oAlHdN5BmpIQGDSHo5e1r4ZYWQ8m4B&index=14&ab_channel=pildorasinformaticas) - + [Generar números aleatorios con C#](https://www.discoduroderoer.es/generar-numeros-aleatorios-con-c-sharp/) - -- Tutoriales sobre cómo usar `Console.ReadLine()` y `Console.WriteLine()` - para la entrada/salida de datos: - - + [Console.ReadLine Method](https://learn.microsoft.com/es-es/dotnet/api/system.console.readline?view=net-8.0) - + [Console.WriteLine Method](https://learn.microsoft.com/en-us/dotnet/api/system.console.writeline?view=net-8.0) - + [Salto de linea en c#](https://es.stackoverflow.com/questions/247356/salto-de-linea-en-c) - -#### Para profundizar - -- Operadores de comparación: [Comparison Operators](https://learn.microsoft.com/es-es/dotnet/csharp/language-reference/operators/comparison-operators) -- convertir en número: [Convert.ToInt32](https://learn.microsoft.com/es-es/dotnet/api/system.convert.toint32?view=net-8.0) - -### Hito 3: Clases y Objetos - -#### Objetivos - -- Comprender y aplicar el uso de clases y objetos en C#. -- Introducir el concepto de campos (atributos) y métodos en una clase. - -#### Desafío - -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: - -1. Propiedad que almacena el nombre. -2. Propiedad que almacena el último intento realizado por la jugadora. -3. Constructor que inicializa el último intento en cero y el nombre según -el valor con el que fue instanciado. -4. 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: - -1. Propiedad que almacena un número aleatorio. -2. Propiedad que almacena una instancia de Jugadora (propiedad de tipo `Player`). -3. 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`. -4. 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. - -#### Recursos - -- Documentación sobre clases y objetos en C#: - - + [Classes and Objects in C#](https://learn.microsoft.com/es-es/dotnet/csharp/fundamentals/tutorials/classes) - + [programación orientada a objetos con C#](https://desarrolloweb.com/articulos/clases-objetos-c-sharp) - -#### Para profundizar - -- Modificadores de acceso: [Access Modifiers](https://learn.microsoft.com/es-es/dotnet/csharp/language-reference/keywords/access-modifiers) -- Interpolación de cadenas: [String interpolation](https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/tokens/interpolated) - -### Hito 4: Encapsulamiento y Métodos de Clase - -#### Objetivos - -- 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. - -#### Desafío - -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: - -1. Sus propiedades ahora deben ser privadas. -2. Agrega un método privado que nos va a permitir generar un número aleatorio (`RandomNumberGenerator()`). -3. Agrega un método privado que nos va a permitir validar la predicción -(`CheckGuess(int guess, int targetNumber)`). -4. Ahora los únicos métodos públicos son el constructor y -el método para inicializar el juego. - -- Características de la clase Player: - -1. La propiedad que almacena el último intento ahora es privada. -2. La propiedad de Nombre es pública. -3. Agregaremos un método público que nos permita consultar el último intento (`GetLastGuess()`). -4. El método constructor y el encargado de gestionar la lógica para hacer la -predicción (`MakeGuess()`) deben ser públicos. - -#### Recursos - -- Guías sobre encapsulamiento y acceso a los miembros de una clase en C#. - - + [Curso de programación orientada a objetos en C# .Net #5 | Encapsulamiento](https://www.youtube.com/watch?v=IObsX4M6Ekg&ab_channel=hdeleon.net) - -#### Para profundizar - -- Uso de `readonly`: [Diferencias entre const y readonly en C#](https://es.stackoverflow.com/questions/505650/diferencias-entre-const-y-readonly-en-c) -- Tipos nulos: [nullable-reference-types](https://learn.microsoft.com/es-es/dotnet/csharp/language-reference/builtin-types/nullable-reference-types) -- Paso por valor y paso por referencia: [Short C#](https://www.youtube.com/shorts/8DT70NSeTjI) -- Paso por valor y paso por referencia: [CURSO DE C#](https://youtu.be/j8sxDnr7nPY?t=2903) - -### Hito 5: Herencia y Polimorfismo - -#### Objetivos - -- 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#. - -#### Desafío - -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: - -1. Ahora es una clase abstracta. -2. Las propiedades son públicas. -3. Se agrega una propiedad de tipo `List` -para almacenar las predicciones realizadas. -4. El constructor es `protected`, y recibe como parámetro un nombre, -además de inicializar la lista. -5. El método de adivinación (`MakeGuess()`) ahora es abstracto. - -- Características de la clase AIPlayer: - -1. implementa la clase abstracta `Player`. -2. propiedad privada que nos permite generar un número aleatorio. -3. Implementación del método de adivinación (`MakeGuess()`) -que devuelve un número aleatorio. - -- Características de la clase HumanPlayer: - -1. implementa la clase abstracta `Player`. -2. Implementación del método de adivinación (`MakeGuess()`) -que pregunta a la usuaria por un número. - -- Características de la clase Game: - -1. Ahora tiene 2 propiedades nuevas: `_humanPlayer` y `_AIPlayer` de tipo `Player`. -2. Su constructor inicializa estas nuevas variables además de el número aleatorio. -3. 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()`) - -#### Recursos - -- Herencia en C#: [Inheritance in C#](https://learn.microsoft.com/es-es/dotnet/csharp/fundamentals/object-oriented/inheritance) -- Polimorfismo en C#: [Polymorphism in C#](https://learn.microsoft.com/es-es/dotnet/csharp/fundamentals/object-oriented/polymorphism) - -#### Para profundizar - -- Listas y arreglos en C#: [Working with lists and arrays in C#](https://learn.microsoft.com/es-es/dotnet/csharp/tour-of-csharp/tutorials/arrays-and-collections) -- Listas [arrays and collections](https://learn.microsoft.com/es-es/dotnet/csharp/tour-of-csharp/tutorials/arrays-and-collections) -- Ciclos [iteration statements](https://learn.microsoft.com/es-es/dotnet/csharp/language-reference/statements/iteration-statements) - -### Diagrama de Clases del Proyecto "Adivina el Número" - -El proyecto se estructura alrededor de las siguientes clases principales, -con las siguientes responsabilidades y relaciones: - -#### Clases - -##### Game - -- **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` (incluyendo `HumanPlayer` y `AIPlayer`). - -##### Player (abstracta) - -- **Responsabilidades**: - - + Definir una interfaz común para todos los jugadores. - + Mantener el nombre y el historial de suposiciones del jugador. - -- **Relaciones**: - - + Superclase de `HumanPlayer` y `AIPlayer`. - -##### HumanPlayer - -- **Responsabilidades**: - - + Permitir al usuario hacer suposiciones ingresando números. - -- **Relaciones**: - - + Hereda de `Player`. - -##### AIPlayer - -- **Responsabilidades**: - - + Generar suposiciones automáticamente (simulando una IA básica). - -- **Relaciones**: - - + Hereda de `Player`. - -#### Relaciones - -- `Game` tiene dos instancias de `Player`: -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, con `HumanPlayer` y `AIPlayer` -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. - -#### Recursos - -- ¿Cómo hacer un diagrama de clase? - [Diagrama de clases UML](https://miro.com/es/diagrama/que-es-diagrama-clases-uml/) -- Video: [Cómo hacer un DIAGRAMA de CLASES UML ✅ [ fácil y profesional ]](https://www.youtube.com/watch?v=zMpr6RIePf8&ab_channel=SaberProgramas) - -![Diagrama de Clases](https://raw.githubusercontent.com/Laboratoria/curriculum/bccce863b4bca2aac6cad8548866ed8697553c94/projects/05-guess-the-number/docs/classDiagramRelation.png) - -### Hito 6: Implementación de Pruebas Unitarias - -#### Objetivos - -- 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. - -#### Desafío - -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. - -#### Recursos - -- Introducción a MSTest y pruebas unitarias en .NET: - - + [Unit testing C# with MSTest and .NET Core](https://learn.microsoft.com/en-us/dotnet/core/testing/unit-testing-with-mstest) - + [MSTest - Microsoft Test Framework](https://learn.microsoft.com/en-us/dotnet/api/microsoft.visualstudio.testtools.unittesting?view=mstest-net-1.2.0) - -- Tutoriales y guías sobre cómo escribir pruebas unitarias efectivas: - - + [Unit Testing Best Practices](https://learn.microsoft.com/en-us/dotnet/core/testing/unit-testing-best-practices) - + [Getting started with MSTest](https://www.youtube.com/watch?v=6v9CvmNQyNw) - -#### Para profundizar - -- Principios de pruebas de software y desarrollo dirigido por pruebas (TDD): - - + [Test Driven Development (TDD)](https://learn.microsoft.com/en-us/dotnet/core/testing/test-driven-development) - -- Estrategias para mockear y testear interacciones con el usuario: - - + [Mocking in .NET Core Unit Tests](https://learn.microsoft.com/en-us/dotnet/core/testing/mocking) diff --git a/docs/README-java.md b/docs/README-java.md deleted file mode 100644 index 4c7f506..0000000 --- a/docs/README-java.md +++ /dev/null @@ -1,276 +0,0 @@ -# Java ☕ - -## 1. Preámbulo - -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. - -## 2. Consideraciones Generales - -- 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](https://www.jetbrains.com/idea/download/)). -- 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. - -### Diagrama de Clases - -![Diagrama de Clases](https://firebasestorage.googleapis.com/v0/b/laboratoria-945ea.appspot.com/o/class-diagram.png?alt=media) - -#### `GuessTheNumberGame` - -**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. - -#### `Player` - -**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. - -#### `HumanPlayer` y `ComputerPlayer` (heredan de `Player`) - -**Propósito:** -Representa a las jugadoras _Humana_ y _Computadora_, respectivamente. - -**Métodos:** - -- `makeGuess()`: Método que cada clase que hereda de `Player` debe implementar. - -**Relaciones:** - -- La clase `GuessTheNumberGame` interactúa con las clases `HumanPlayer` - y `ComputerPlayer` para gestionar el juego. -- Tanto la clase `HumanPlayer` como `Computer Player` son subclases de `Player`, - 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. - -## 3. Consideraciones Técnicas - -- 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. - -## 4. Hitos del proyecto - -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. - -![MARCOS](https://firebasestorage.googleapis.com/v0/b/laboratoria-945ea.appspot.com/o/marcos.png?alt=media) - -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. - -### 4.1 Hito 1 - Configuración del entorno de trabajo - -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](https://www.jetbrains.com/idea/download/), - en casos extremos de recursos computacionales se puede utilizar el VSCode). - -#### Contenidos que pueden ayudarte en la configuración del entorno - -- [Tutoriales para la preparación del entorno Java](https://github.com/Laboratoria/java-setup) -- [¿Cómo instalo Java?](https://www.java.com/pt-BR/download/help/download_options_pt-br.html) -- [Install IntelliJ IDEA](https://www.jetbrains.com/help/idea/installation-guide.html) -- [Guía paso a paso para instalar Intellij Idea en Mac](https://www.geeksforgeeks.org/step-by-step-guide-to-install-intellij-idea) - -### 4.2 Hito 2 - Primeros pasos con el lenguaje - -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. - -#### Contenidos que pueden ayudarte en los primeros pasos con Java - -- [Learn the Basics of Java Programming](https://www.freecodecamp.org/news/learn-the-basics-of-java-programming/) -- [Programación Orientada a Objetos com Java](https://www.freecodecamp.org/news/object-oriented-programming-concepts-java/) -- [Java Basic Syntax](https://www.geeksforgeeks.org/java-basic-syntax/) -- [Java Data Types And Variables – Explained for Beginners](https://www.freecodecamp.org/news/java-data-types-and-variables/) -- [Learn Java](https://www.w3schools.com/java/default.asp) -- [Java Classes and Objects](https://www.w3schools.com/java/java_classes.asp) -- [Java Methods](https://www.w3schools.com/java/java_methods.asp) - -### 4.3 Hito 3 - Comprensión del Diagrama de Clases - -Dejamos un [Diagrama de Clases](#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. - -#### Contenidos que pueden ayudarte en la comprensión del Diagrama de Clases - -- [¿Qué son los Diagramas de Clase?](https://diagramasuml.com/diagrama-de-clases/) - -### 4.4 Hito 4 - Iniciando el juego - -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. - -#### Contenidos que pueden ayudarte a comenzar el juego - -- [Java: Cómo leer y presentar datos con los comandos de entrada y salida](https://www.programarya.com/Cursos/Java/Entrada-de-datos) -- [Java Scanner](https://www.baeldung.com/java-scanner) -- [Java User Input](https://www.w3schools.com/java/java_user_input.asp) -- [Número Aleatorio](https://www.baeldung.com/java-17-random-number-generators) - -### 4.5 Hito 5 - Agregando más jugadoras - -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. - -### 4.6 Hito 6 - Configuración para la construcción de pruebas unitarias - -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 - -#### Contenidos que pueden ayudarte a agregar dependencias de pruebas - -- [Agregar JUnit5 en IntelliJ](https://www.jetbrains.com/help/idea/junit.html#intellij) -- [Testing Java with VSCode](https://code.visualstudio.com/docs/java/java-testing) - -### 4.7 Hito 7 - Creación de pruebas unitarias - -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. - -#### Contenidos que pueden ayudarte a crear pruebas unitarias - -- [Calidad y JUnit: Introducción a la automatización de pruebas unitarias en tu software Java en el día a día](https://www.tutorialspoint.com/junit/index.htm) -- [Tutorial de Mockito](https://www.digitalocean.com/community/tutorials/mockito-tutorial) - -### 4.8 Hito 8 (Edición Hacker) - Creación de una "inteligencia" para jugar contra la computadora - -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. - -## 5. Recomendaciones - -**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. - -## 6. Pistas / Tips - -Consulta los [FAQ](./FAQ-java.md) -Súmate al canal de Slack -[#project-guess-the-number](https://claseslaboratoria.slack.com/archives/C067E8ZT9CY) -para conversar y pedir ayuda del proyecto. diff --git a/docs/README-python.md b/docs/README-python.md deleted file mode 100644 index 0d11ba5..0000000 --- a/docs/README-python.md +++ /dev/null @@ -1,201 +0,0 @@ -# Python 🐍 - -## 1. Preámbulo - -Python es uno de los lenguajes de programación más populares y versátiles en la -actualidad. Su éxito radica en su simplicidad y legibilidad, convirtiéndolo en -una opción ideal para aquellos que se inician en la programación. A pesar de la -diversidad de plataformas y herramientas disponibles, es esencial tener un -sólido entendimiento de los conceptos fundamentales de Python. Además, Python -es un lenguaje de programación multiparadigma, lo que significa que puedes -utilizar diferentes estilos de programación para resolver problemas, lo que -añade a su flexibilidad y poder. El objetivo de este proyecto es presentarte el -mundo de Python mediante un juego sencillo y entretenido. - -## 2. Consideraciones Generales - -- Duración del proyecto: Se estima que este proyecto tomará de 1 a 2 sprints. -- Debe implementarse en Python. Las únicas dependencias externas que se pueden - utilizar son pytest para pruebas unitarias. -- El juego se llevará a cabo en el terminal. Las pruebas se pueden ejecutar en - el terminal o en su IDE (VSCode es más que adecuada). -- 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. - -## 3. Consideraciones Técnicas - -El juego se llevará a cabo en la terminal usando Python. 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 Python para la generación de números aleatorios. Se deben -realizar pruebas unitarias para sus clases y métodos utilizando PyTest y -simulación de generación de números aleatorios con unittest.mock. - -## 4. Hitos - -A continuación, te dejamos algunos hitos como sugerencia para que construyas tu -proyecto. - -### 4.1 Crear el entorno de desarrollo - -El primer paso es configurar tu entorno de desarrollo. Para este proyecto, -necesitarás Python 3 y un editor de texto o un entorno de desarrollo integrado -(IDE). - -1. Instala Python 3 si aún no lo tienes. Puedes descargarlo desde el [sitio -oficial de Python](https://www.python.org/downloads/). - -2. Elige un editor de texto o un IDE. Algunas opciones populares son -[PyCharm](https://www.jetbrains.com/pycharm/), [Visual Studio -Code](https://code.visualstudio.com/), o [Sublime -Text](https://www.sublimetext.com/). - -3. Configura tu editor o IDE para usar Python 3. - -#### Algunas referencias sobre el tema - -- [Visual Studio Code para - Python](https://code.visualstudio.com/docs/languages/python) - -### 4.2 Crear un script de Python - -A continuación, crearás un script de Python simple para asegurarte de que tu -configuración funciona correctamente. - -1. Crea un nuevo archivo llamado `main.py`.
-2. Ejecuta `main.py`. - -#### Referencias - -- [Cómo escribir y ejecutar un script de - Python](https://entrenamiento-python-basico.readthedocs.io/es/3.7/leccion1/holamundo.html#ejecucion) - -### 4.3 Implementar el juego - -Ahora que tienes un entorno de desarrollo de Python funcionando, puedes empezar -a implementar el juego. - -1. Genera un número aleatorio entre 1 y 100. Puedes usar la función `randint` -en el módulo `random` para hacer esto. - -2. Implementa un bucle que solicite a la jugadora que adivine el número. Usa la -función `input` para obtener la entrada de la jugadora. - -3. Compara la entrada de la jugadora con el número secreto. Si la jugadora -adivina correctamente, termina el juego. Si la jugadora adivina -incorrectamente, proporciona una pista sobre si el número secreto es mayor o -menor que la entrada de la jugadora. - -4. Implementa la lógica para el turno del ordenador. El ordenador puede hacer -una suposición aleatoria, o puedes implementar alguna estrategia para que sus -suposiciones sean más inteligentes. - -5. Continúa el juego hasta que la jugadora o el ordenador adivinen -correctamente el número. - -6. Añade pruebas unitarias para tu código. Python tiene un módulo incorporado -llamado `unittest` que puedes usar para esto. - -#### Referencias - -- [Generación de números aleatorios en - Python](https://docs.python.org/3/library/random.html) -- [Bucles en - Python](https://docs.python.org/3/tutorial/controlflow.html#for-statements) -- [La función input en - Python](https://docs.python.org/3/library/functions.html#input) -- [Comparaciones en - Python](https://docs.python.org/3/library/stdtypes.html#comparisons) -- [Pruebas unitarias en Python con - unittest](https://docs.python.org/4/library/unittest.html) - -### 4.4 Mejorar el juego - -Una vez que tengas una versión básica del juego funcionando, puedes hacer -mejoras. - -1. Lleva un registro de las suposiciones de la jugadora y del ordenador. Cuando -el juego termine, muestra todas las suposiciones que hizo la jugadora ganadora. - -2. Añade una opción para jugar de nuevo. Cuando el juego termine, pregunta a la -jugadora si quiere jugar de nuevo. - -3. Añade comentarios a tu código para explicar qué hace cada parte. Esto hará -que tu código sea más fácil de entender y mantener. - -#### Referencias - -- [Manejo de listas en - Python](https://docs.python.org/3/tutorial/introduction.html#lists) -- [Cómo escribir comentarios en - Python](https://www.w3schools.com/python/python_comments.asp) - -### 4.5 Crear una "inteligencia" para jugar contra la computadora (Edición Hacker) - -Una vez que hayas implementado el juego básico y hecho algunas mejoras, puedes -llevar las cosas al siguiente nivel creando una "inteligencia" para jugar -contra la computadora. Esta "inteligencia" podría ser simplemente otra -implementación del juego que utiliza una estrategia diferente, o podría ser un -algoritmo de aprendizaje automático que mejora con cada juego que juega. - -1. Implementa una nueva versión del juego que utiliza una estrategia diferente. -Por ejemplo, en lugar de adivinar al azar, esta versión podría intentar -adivinar el número más probable basándose en las suposiciones anteriores. - -2. Prueba tu nueva "inteligencia" jugando contra la computadora. ¿Puedes -ganarle a la computadora con tu nueva estrategia? - -3. Si te sientes ambicioso, podrías intentar implementar un algoritmo de -aprendizaje automático. Este algoritmo podría aprender de cada juego que juega, -mejorando sus suposiciones con cada juego. Podrías usar una biblioteca de -aprendizaje automático como scikit-learn para hacer esto. - -4. Asegúrate de añadir pruebas unitarias para tu nueva "inteligencia". También -podrías querer añadir algunas métricas para rastrear cómo mejora tu algoritmo -con cada juego que juega. - -#### Referencias - -- [Introducción a - scikit-learn](https://scikit-learn.org/stable/getting_started.html) -- [Cómo implementar un algoritmo de aprendizaje - automático](https://machinelearningmastery.com/start-here/#algorithms) - -## 5. Extensión: Versión Orientada a Objetos (OOP) - -Una vez que hayas implementado y perfeccionado la versión base del juego, -es posible que desees considerar la posibilidad de reescribirlo utilizando -el paradigma de la Programación Orientada a Objetos (OOP). Esta sería una -ampliación (no un requisito) que te permitiría familiarizarte con los -objetivos de aprendizaje de la programación orientada a objetos. Quizás te -resulte útil si tus futuros proyectos en Python involucran el uso de -frameworks que se basan en este paradigma. Por ejemplo, algunas -herramientas como los ORM (mapeadores objeto-relacional) que se -encuentran en el mundo de Python -están diseñadas para funcionar con la programación orientada a objetos. - -1. Crea una clase `Game` que represente una instancia del juego. Esta clase -puede tener métodos como `start`, `play_turn`, `check_guess`, y `end_game`. - -2. Crea una clase `Player` que represente a una jugadora. Esta clase puede -tener atributos como `name` y `guesses`, y métodos como `make_guess`. - -3. Crea una subclase `ComputerPlayer` que herede de la clase `Player`. Esta -clase puede sobrescribir el método `make_guess` para implementar la lógica de -adivinación del ordenador. - -4. En la clase `Game`, usa instancias de las clases `Player` y `ComputerPlayer` -para representar a la jugadora y al ordenador. - -5. Añade pruebas unitarias para tus clases y métodos. Python tiene un módulo -incorporado llamado `unittest` que puedes usar para esto. - -### Referencias - -- [Programación Orientada a Objetos en - Python](https://docs.python.org/3/tutorial/classes.html) diff --git a/src/__pycache__/main.cpython-312.pyc b/src/__pycache__/main.cpython-312.pyc new file mode 100644 index 0000000..3924edf Binary files /dev/null and b/src/__pycache__/main.cpython-312.pyc differ diff --git a/src/__pycache__/test.cpython-312.pyc b/src/__pycache__/test.cpython-312.pyc new file mode 100644 index 0000000..0b23973 Binary files /dev/null and b/src/__pycache__/test.cpython-312.pyc differ diff --git a/src/__pycache__/utils.cpython-312.pyc b/src/__pycache__/utils.cpython-312.pyc new file mode 100644 index 0000000..5b42941 Binary files /dev/null and b/src/__pycache__/utils.cpython-312.pyc differ diff --git a/src/main.py b/src/main.py new file mode 100644 index 0000000..1da1f5b --- /dev/null +++ b/src/main.py @@ -0,0 +1,34 @@ +"""setear numero aleatorio""" +"""- funcion que dada una variable numero esta diga si esta por arriba, por abajo o si es el numero + *si es el numero romper el ciclo""" +import random +import time +from utils import player_validation +"""variable mayuscula para que sea una variable global (buenas practicas)""" +RANDOM_NUM: int = random.randint(1,101) +MIN_NUM = 1 +MAX_NUM = 101 +COUNTER = 0 +RECORDS = [] + +print(f"Numero a adivinar {RANDOM_NUM}") + + +"""ciclo refactorizar """ +while True: + COUNTER += 1 + result, MIN_NUM, MAX_NUM, choosen = player_validation("me", RANDOM_NUM, MIN_NUM, MAX_NUM) + RECORDS.append({"player": "me", "turn": COUNTER, "choosen": choosen}) + if result == "winner": + print("Felicidades, ganaste!") + break + time.sleep(1) + + result, MIN_NUM, MAX_NUM, choosen = player_validation("computadora", RANDOM_NUM, MIN_NUM, MAX_NUM) + RECORDS.append({"player": "computer", "turn": COUNTER, "choosen": choosen}) + if result == "winner": + print("Computadora ha ganado!") + break + +print(f"Juego finalizado en {COUNTER} rondas") +print(*RECORDS, sep="\n") \ No newline at end of file diff --git a/src/test.py b/src/test.py new file mode 100644 index 0000000..d7f4a15 --- /dev/null +++ b/src/test.py @@ -0,0 +1,47 @@ +import unittest +from utils import comparation_result + + +class TestComparationResultFunction(unittest.TestCase): + + def test_ok(self): + self.assertEqual(comparation_result(3, 3), 'winner') + self.assertEqual(comparation_result(3, 4), 'menor') + self.assertEqual(comparation_result(4, 3), 'mayor') + + def test_errors(self): + self.assertEqual(comparation_result("3", 3), 'error') + self.assertEqual(comparation_result(3, "3"), 'error') + self.assertEqual(comparation_result("l", 3), 'error') + self.assertEqual(comparation_result(3, "l"), 'error') + self.assertEqual(comparation_result(" ", "l"), 'error') + + def test_missing_arguments(self): + with self.assertRaises(TypeError) as result: + self.assertEqual(comparation_result(3,), 'error') + self.assertEqual( + str(result.exception), "comparation_result() missing 1 required positional argument: 'num'" + ) + + with self.assertRaises(TypeError) as result: + self.assertEqual(comparation_result(), 'error') + self.assertEqual( + str(result.exception), "comparation_result() missing 2 required positional arguments: 'consult' and 'num'" + ) + + """def test_upper(self): + self.assertEqual('foo'.upper(), 'FOO') + + def test_isupper(self): + self.assertTrue('FOO'.isupper()) + self.assertFalse('Foo'.isupper()) + + def test_split(self): + s = 'hello world' + self.assertEqual(s.split(), ['hello', 'world']) + # check that s.split fails when the separator is not a string + with self.assertRaises(TypeError): + s.split(2)""" + +if __name__ == '__main__': + unittest.main() \ No newline at end of file diff --git a/src/utils.py b/src/utils.py new file mode 100644 index 0000000..c415217 --- /dev/null +++ b/src/utils.py @@ -0,0 +1,44 @@ +import random + +RANDOM_NUM: int = random.randint(1,101) + + +def comparation_result(consult, num): + # validamos que sean enteros + # isinstance entrega booleano + if not isinstance(consult, int) or not isinstance(num, int): + return "error" + if (consult > num): + return "mayor" + elif (consult < num): + return "menor" + else: + return "winner" + + +def player_validation(player_type, num, min_n, max_n): + if player_type == "me": + turn = int(input("Te toca jugar, por favor ingresa un numero\n")) + player = "" + + elif player_type == "computadora": + print("\nComputador jugando " + "-"*10) + turn = random.randint(min_n, max_n) + player = player_type.title() + print(f"Computadora ha elegido el numero {turn}") + + comparar = comparation_result(turn, num) + + if comparar == "winner": + print("Felicidades acertaste al numero correcto") + else: + if comparar == "menor": + if player_type == "computadora": + min_n = turn + print(f"{player} El numero que elegiste es menor" ) + else: + if player_type == "computadora": + max_n = turn + print(f"{player} El numero que elegiste es mayor") + return comparar,min_n, max_n, turn + \ No newline at end of file