**Participación y Pokemon partir de datos en JSON**
# Siguiendo la participación desde los repositorios de código.
En las sesiones bimodales es importante la participación proactiva de los aprendices y el docente, que puede ocurrir de maneras síncronas y asíncronas. En nuestro caso, dicha participación proactiva se ve a partir de la publicación continua en el repositorio propio y el repositorio compartido del LabCI, de las distintas actividades. Dado que estas actividades dejan huella computacional, podemos usar el computador mismo para hacer seguimiento de dichos cambios continuos. Este será el problema con el que introduciremos la aplicación del control de lectura.
Dado que la sesión 13 tiene el listado los repositorios del primer corte, usemos este documento para revisar la participación reciente.
![Recuperado Colección de los HedgeDocs que siguen un patrón de dirección común y secuencia. ](https://docutopia.sustrato.red/uploads/b0bb1012-6a9a-4949-93bf-ff224550d147.png)
![Actualizando clases Semánticas hasta hoy](https://docutopia.sustrato.red/uploads/520fd520-a608-4699-8ac0-472d5e26936c.png)
Con esa información revisemos aquellas líneas que contienen repositorios en ChiselApp.
Separemos ahora el texto de cada enlace de la dirección como tal a la que apuntan.
![Diccionario con cada estudiante y su respectivo repositorio.](https://docutopia.sustrato.red/uploads/d61bc4bb-4cf1-46c5-ae59-3f0640b3ba15.png)
Si nos fijamos en la respuesta anterior, hemos introducido informalmente algunos elementos que revisaremos en mayor detalle luego: colecciones, iteradores, variables y diccionarios. Por lo pronto, enfoquémonos en el diccionario que contiene la respuesta. Este tiene dos partes, que se muestran en la figura anterior: las llaves, ubicadas a la izquierda, y los valores, ubicados a la derecha. Si queremos seleccionar un repositorio aleatoriamente, para ver su evolución, apelamos a sus llaves, que equivalen a los nombres de los estudiantes:
![nombres de los estudiantes:](https://docutopia.sustrato.red/uploads/dd8693bd-4166-4fa5-aa00-7ca0c630b8e7.png)
>>> # ('Eduar Daza' 'Nestor Cristancho' 'Maxi López-Gómez' 'Valentina Vanegas' 'Rubén Torres' 'Thomas Martínez' 'Lizeth Colorado' 'Dario Montenegro' 'Juan Pablo Arias Romero' 'Valentina Penagos Ariza') Podemos aplicar aleatoriedas a esas llaves con el siguiente código.
![Aleatorias a esas llaves con el siguiente código.](https://docutopia.sustrato.red/uploads/b09581a5-93b4-451c-90ef-174f760e2d5d.png) Lo cual quiere decir que es posible seleccionar un repositorio también aleatoriamente para revisar su evolución (sin detrimento de quienes quieran socializar sus repositorios de modo voluntario)
>>> 'https://chiselapp.com/user/NESTORCRISTANCHO/repository/NESTOR/timeline' Si vemos la línea de tiempo desde la interfaz web, veremos algo de este estilo: ![Portafolio Nestor Cristancho Usemanticas Timeline](https://docutopia.sustrato.red/uploads/5226b38d-0611-4555-99b0-75921a4fb1e6.png)
**Vista web de la linea de tiempo del repositorio seleccionado aleatoriamente.** Nos interesa ver los datos en el repositorio y para ello apelaremos a su interfaz JSON, que es un formato ampliamente utilizado en el intercambio de datos en la web y que está habilitado para los repositorios publicados en ChiselApp.
# Pokemones e información a partir de datos en JSON
La información previa es información estructurada. Sin embargo su resultado está en HTML. Que es difícil de consumir. Podemos pasar de una línea de tiempo a información estructurada en JSON de la siguiente manera: https://chiselapp.com/user/NESTORCRISTANCHO/repository/NESTOR/timeline Grafoscopio tiene soporte para líneas de tiempo en Fossil. Sin embargo no lo usaremos en nuestro caso no lo usaremos, debido a un error, usaremos como ejemplo el PokeAPI. Definamos el enlace como una cadena de texto:
Convirtamos la cadena de texto en un enlace y recuperemos sus contenidos:
Usando bloques podemos pensar en algo como:
Si quisieramos hacerlo explícitamente con dos variables sería algo como:
Sin embargo, la aproximación original puede ser más sencilla:
# Proyecto final - Maestro Pokémon Nestor Fabian Cristancho **Importante:** Para este proyecto se debe tener MiniDocs atualizado al menos a la versión 3f26595 o posteriores, de acuerdo al procedimiento mostrado en clase.
![MiniDocs](https://docutopia.sustrato.red/uploads/b30437fc-095f-48aa-a596-fcb4bb03d318.png)
Para el proyecto final se extenderá esta narrativa de datos, usando la narrativa misma y los recursos vistos hasta el momento. La intensión es ver hasta qué punto cada estudiante maduró su pensamiento computacional y está en condiciones de usarlo, junto con las estrategias metacognitivas propias, para abordar un problema, incluyendo la búsqueda de información y su lectura crítica, de manera que pueda concebir estrategias para resolver un problema, modificar una narrativa de datos, crear nuevos elementos e indicar claramente dónde tiene dudas e inquietudes frente a una narrativa de datos o recursos y literactura técnica.
Se espera que cada estudiante: 1. Haga una lectura anotada en Hypothesis de la narrativa de datos inicial, formulando preguntas, sugerencias o aclaraciones al texto, como hicimos con representando y procesando datos en Pharo y con Challenge Yourself. Importante: Las anotaciones las haremos todæs a un mismo documento ubicado en esta dirección. 2. Importe esta narrativa a su propio GToolkit/Grafoscopio y exportarla en su propio portafolio, indexándolo desde la portada, de manera similar a como hizo cada cual con su ejercicio de Challenge Yourself. 3. Extender esta narrativa, dentro del repositorio de cada cual, de manera que se pueda:
- Agregar 2 rondas más de combates a la tabla pokemenTournament, para un total de 3 rondas, incluyendo la primera ronda agregada en el código previo. - Usar las utilidades de Data Frame para determinar quién es el Pokemon ganador, es decir, quien haya gando dos de los tres combates. Para esto es necesario leer apartados de [libro de Data Frame](https://mutabit.com/repos.fossil/labci/uv/wiki/herramientas/25A-DataFrame-wip.pdf), encontrando cómo se utiliza para contar las ocurrencias de un valor. En caso de dudas, anotarlas con Hypothesis en el libro mismo y compartirlas por correo electrónico.
4. Si sabemos que el código Pokemon atRandom , permite seleccionar un Pokemon al azar, ¿cómo debería modificarse el código anterior para que el Data Frame pokemonTournament guarde la batalla de dos Pokemones elegidos al azar en lugar de dos Pokemones predefinidos? - Describir las modificaciones solicitadas, como un conjunto de pasos finitos en frases, en español. - Si se alcanza, intentar traducir esas frases anteriores en español a su equivalente en código.
## Desarrollo Proyecto final - Maestro Pokémon Nestor Fabian Cristancho.
![Pikachu & Raichu](https://docutopia.sustrato.red/uploads/21d4ded7-bc0e-466c-91f0-8672b47afbe1.png)
![ditto](https://docutopia.sustrato.red/uploads/651efe17-fa96-44a5-8fd3-fb23c807aa54.png)
![charizard](https://docutopia.sustrato.red/uploads/d37c6010-c64e-4bc1-9e55-258bdd6725b7.png)
![caterpie](https://docutopia.sustrato.red/uploads/b225a5a8-9efa-4399-a37d-daa18cab1ebd.png)
![butterfree](https://docutopia.sustrato.red/uploads/b888e428-4271-47c1-bc33-b2d1bcddf82d.png)
![magikarp](https://docutopia.sustrato.red/uploads/a90da0ea-7d47-4945-b7c2-0b88399c631e.png)
![Vulpix](https://docutopia.sustrato.red/uploads/8da09c02-0cbc-43dd-a2be-80176da141bb.png)
![Jolteon](https://docutopia.sustrato.red/uploads/93c5b422-40ca-458a-96a3-fd27443f38aa.png)
![Flareon](https://docutopia.sustrato.red/uploads/297e95bf-8c9e-429a-adb8-0b17b306c54b.png)
![Vaporeon](https://docutopia.sustrato.red/uploads/4aafd839-0581-4e81-a67e-2f77dba80442.png)
Usar colecciones en Pharo/Smalltalk para coleccionar los pesos de todos los Pokemones:
![Recopilando los diccionario de datos a partir del nombre de cada Pokemon.](https://docutopia.sustrato.red/uploads/facc567f-b59c-4116-b84c-c0ad2a8b0d31.png)
Supongamos que queremos comparar alturas de los pokemones:
![Selección de altura y nombre de un Pokemon.](https://docutopia.sustrato.red/uploads/804ea861-e35e-4311-828b-2559dd1fd4db.png)
# Clases y batallas Pokemon Lo que hemos hecho con los bloques, vamos a abstraerlo usando las clases. Supongamos que queremos modelar una batalla entre Pokemones. Definamos nuestros contrincantes dos pokemones:
Esto nos permite preguntar datos particulares a cada peleador:
![Datos de un Pokemon como un diccionario anidado.](https://docutopia.sustrato.red/uploads/fbe8772f-769a-4489-865a-b5c8a221c3d1.png)
Podemos seleccionar un movimiento al azar, y conocer su nombre. Para ello usamos llaves de diccionarios anidadas, en las que una vez seleccionado un movimiento al azar, queremos adentrarnos en ese movimiento, usando el mensaje at: 'move' y una vez adentro seleccionamos su nombre, usando el mensaje at: 'name', lo que es lo mismo que anidar ambos mensajes en uno sólo, at: 'move' at: 'name'. El equivalente en código de lo anterior sería:
Lo que gráficamente puede ser representado como recorrer una jerarquía el en diccionario de datos de los movimientos de un pokemon, hasta llegar al nombre de uno de ellos, como se muestra en la siguiente figura: ![Seleccionando un movimiento al azar, y dentro del mismo seleccionar un movimiento (move) y, dentro de éste, un nombre (name).](https://docutopia.sustrato.red/uploads/4de2cf30-5a8d-4514-8ebe-e4b70810bfda.png) De este modo, podemos modelar una ronda de lucha como la selección aleatoria de un movimiento de ataque:
E incluso podemos definir un ganador al azar:
Supongamos que queremos colocar toda la información en una tabla. Para ello usaremos los llamados Data Frames, particularmente, adaptando, el ejemplo de la página 21, haciendo que las columnas guarden la información sobre los contrincantes, sus movimientos y el ganador y las filas guarden información sobre cómo se llevó a cabo cada ronda de combate.
Creemos una primera ronda de combate:
Como nos damos cuenta, la ronda anterior sólo depende de los valores de los dos peleadores, que empleamos repetidamente en el código anterior, así que podemos convertir esto en un bloque:
Con lo cual podemos invocar este para diferentes peleadores, o para los mismos con resultados distintos. Por ejemplo, cada vez que invoquemos el siguiente código, debería darnos algo distinto:
![Vista de impresión de la pelea entre dos Pokemones.](https://docutopia.sustrato.red/uploads/26147c9b-9cd9-43e6-8e2a-faddf8017e58.png)
Y agreguémosla a nuestro torneo: **Ronda 1 (JOLTEON VS CHARIZARD) **
![Batalla entre Jolteon vs Charizard ](https://docutopia.sustrato.red/uploads/b7e09492-80e6-40e0-a92b-1c4d3f84e1db.png)
![Primera Ronda](https://docutopia.sustrato.red/uploads/edb198b5-dd28-4c8d-8fdd-fd0ae7f2173e.png)
**(Visualización de la batalla para saber que pokémon es mas fuerte)** **Entrenador 1** manda a Charizard al campo de batalla. El poderoso Pokémon de tipo Fuego/Volador ruge y agita sus alas, listo para arrasar. **Entrenador 2** no se queda atrás y lanza a Jolteon, el veloz Pokémon de tipo Eléctrico, que aparece en una descarga de chispas. 🔥 Charizard intenta tomar la delantera con un Lanzallamas directo hacia Jolteon.
⚡ Pero Jolteon, gracias a su increíble velocidad, esquiva el ataque como un rayo. Y cuando menos se lo espera Charizard… ¡JOLTEON USA BOFETÓN! 🖐️⚡ Una ráfaga de electricidad acompaña el sonoro golpe que deja a Charizard tambaleando. El público queda en silencio… hasta que Charizard cae debilitado. **¡Ganador: Jolteon!**
**Ronda 2 (JOLTEON VS CHARIZARD) **
![Rugido atronador Charizard](https://docutopia.sustrato.red/uploads/76ffa3af-ab9d-47fb-953b-4343c1c18917.png)
![Jolteon, ágil como un rayo, chispeando electricidad](https://docutopia.sustrato.red/uploads/228e71ac-d694-4b67-b222-82b04ddbed0b.png)
![Segunda Ronda](https://docutopia.sustrato.red/uploads/1e66d364-c53e-4941-a90d-8298092bfde9.png)
**(Visualización de la batalla para saber que pokémon es mas fuerte)** En una esquina del campo de batalla: **Jolteon**, ágil como un rayo, chispeando electricidad, listo para atacar. En la otra: **Charizard**, imponente, con sus alas abiertas y una llama ardiente en su cola, decidido a no caer. Jolteon se adelanta con rapidez supersónica y lanza su movimiento: Golpe en el Dorso. Un ataque veloz, directo al costado de Charizard, que gruñe, resiste el impacto y retrocede levemente… pero no cae. 🔥 Y entonces… se desata el infierno.
Charizard, con los ojos encendidos de determinación, toma vuelo y carga su ataque definitivo: ¡VASTO IMPACTO!. El cielo se oscurece, el suelo tiembla, y con un rugido atronador Charizard desciende en picada, envuelto en llamas y energía, liberando todo su poder sobre Jolteon. 💥 ¡BOOOOOOOM! Una explosión sacude el campo de batalla. Cuando el humo se disipa… Jolteon cae derrotado. El público estalla en gritos. **¡Ganador absoluto: Charizard!**
**Ronda 3 (JOLTEON VS CHARIZARD) **
![Jolteon y Charizard ultima Ronda](https://docutopia.sustrato.red/uploads/8f09a3e6-1287-43c1-b0b7-5a06c791f9a6.png)
![Tercera Ronda ](https://docutopia.sustrato.red/uploads/9353ae98-0e06-419f-aa1b-26d080389876.png)
**(Visualización de la batalla para saber que pokémon es mas fuerte)** 🎙️ ¡Bienvenidos a la ronda final del gran torneo Pokémon! 🎙️ Dos titanes se enfrentan en este duelo inolvidable: 🔥 Charizard, con su imponente presencia y ferocidad. ⚡ Jolteon, ágil y veloz como el relámpago. El marcador está empatado a una ronda por lado. Esta es la tercera y definitiva. 🔔 ¡Que comience la última ronda! Jolteon no pierde tiempo y lanza su ataque: ¡Electroweb! ⚡🕸️ Una red eléctrica envuelve el campo, buscando atrapar a Charizard y reducir su velocidad.
🔥 Pero Charizard alza vuelo con fuerza, esquivando por poco las descargas. Desde el cielo, mira a su oponente con determinación. Y entonces… se prepara para su movimiento final. 💥 ¡CHARIZARD USA FISSURE! 🌋 El suelo se agrieta brutalmente bajo los pies de Jolteon. Una grieta gigantesca se abre, y antes de que pueda escapar… ⚡ ¡Jolteon es tragado por la tierra! Silencio total en la arena. El juez levanta la bandera. **¡Charizard es el campeón!**
En el siguiente cuadro podemos ver la información de los Pokémon que se utilizan para el combate y las características que poseen, a modo de ejemplo en clase, para el desarrollo de mi trabajo final.
![Primera file/ronda del combate Pokemon.](https://docutopia.sustrato.red/uploads/7d11540d-2817-448c-b461-882c740e3202.png)
**Importante** Obsérvese que, para ver los elementos del Data Frame es necesario cliquear en la solapa **“Tree”**, pues la vista de la solapa **“Data”** nos da el error de la siguiente gráfica:
![Vista errorea del Data Frame para guardar el torneo Pokemon. Si que quiere ver la vista correcta hay que cliquera la soalapa “Tree”, en lugar de la solapa “Data”, en la parte superior.](https://docutopia.sustrato.red/uploads/8444501b-051b-469b-9963-1a93e707727a.png)
Hasta acá hemos visto unos rudimentos de cómo traer la información de un API, en este caso la de los Pokemones para manipularla y organizarla de manera que nos permita modelar un aspecto real o ficticio, en nuestro caso la primera batalla de un torneo Pokemon entre dos contrincantes fijos. Con estos insumos y lo visto de introducción al pensamiento computacional durante el semestre, ya estamos en condiciones de aplicar lo visto en un último entregable.
## **También se puede plantear como alternativa que, en las rondas 1, 2 y 3, el Pokémon con mayor fuerza obtenga la victoria y se varíen los combatientes, seleccionando entre Fighter 1 y Fighter 6.**
Con esto se busca tener una mayor diversidad de Pokémon en los combates. Sé que aún me faltan más pasos por definir, pero sería bueno tenerlo presente para próximos trabajos, ya que así se podría escoger una mayor variedad de Pokémon en cada ronda o pelea. Además, recordando que todo entrenador Pokémon puede utilizar hasta tres Pokémon para enfrentarse contra tres de su contrincante.
**Ganador VAPOREON - TIPO AGUA** ![Ganador Vaporeon](https://docutopia.sustrato.red/uploads/f4b8f3ed-4085-43ce-8384-891305530f6c.png)
![Vaporeon](https://docutopia.sustrato.red/uploads/b7066374-67d9-49e6-bc40-77f1b33f7b04.png)
**Ganador JOLTEON TIPO - ELECTRICO** ![Jolteon](https://docutopia.sustrato.red/uploads/7ea15aad-ab77-4286-b7ac-43cc698fc21c.png)
![Jolteon](https://docutopia.sustrato.red/uploads/9b5a454b-af27-4d0e-a4ad-7d37b6cde952.png)
# Data Frame pokemonTournament guardar la batalla de dos Pokemones.
![Creando una serie de datos](https://docutopia.sustrato.red/uploads/d6ad47d1-9a52-4e23-9527-7798766b5997.png)
Se toma como referencia el capítulo 2.4 del libro Data Analysis Made Simple with Pharo DataFrame para adaptar el código de medición de tiempo a las batallas Pokémon. Además, se incorpora un bloque que recibe como argumento "each", representando cada elemento de la colección, y concatena su valor con la cadena "round" para mostrar el ganador de cada ronda.
## Data Frame para determinar quién es el Pokemon ganador
Intenté ejecutar el ejemplo con DataSeries de varias formas, pero al no encontrar la clase definida en el entorno, el sistema mostraba un aviso en rojo sugiriendo crearla. Sin embargo, preferí no hacerlo para evitar posibles desconfiguraciones u otros problemas. **Primera opción como referencia el capítulo 2.4** ( Dataseries como habla la narrativa pero no me ejecuto).
Como pueden observar así aparece el error al momento de ejecutar: ![No ejecuta el Dataseries](https://docutopia.sustrato.red/uploads/0d7802a2-f9b3-4b0c-8607-c9638cf2ef37.png)
**Tomado de la narrativa Data Frame** En este aspecto, DataSeries actúa como un Diccionario Ordenado. Se puede acceder a un elemento con una clave específica mediante el mensaje at:aKey; se puede modificar este elemento con at:aKeyput:newValue. Para eliminar un elemento, se utiliza removeAt:aKey. Si aKey no está presente en la serie de datos, se creará un nuevo elemento y se añadirá al final. **Como alternativa, se pueden utilizar métodos como at:ifAbsent:, at:ifAbsentPut:, etc.,** para proporcionar un **bloque personalizado** que se evaluará cuando no se encuentre aKey. **Segunda opción como referencia el capítulo 2.4** ( Como alternativa, se pueden utilizar métodos como at:ifAbsent:, at:ifAbsentPut:, etc.,).
![El ganador de cada batalla del torneo.](https://docutopia.sustrato.red/uploads/f86d0229-8e77-4b0b-b367-b602fd945633.png)
## Batallas Ganadas Los resultados permiten identificar al entrenador con mayor cantidad de victorias, evidenciando que el uso estratégico de las habilidades de sus Pokémon, incluso en condiciones desfavorables, puede influir significativamente en el desenlace de cada batalla.
![Otra forma de ver el ganador de cada Round](https://docutopia.sustrato.red/uploads/9a802296-07bb-4691-9033-eb1b2be88022.png)
Aquí se puede observar de forma precisa cuántas batallas ganaron los Pokémon Jolteon y Charizard. De manera automática, se realiza el conteo de victorias, lo que permite decretar como ganador a Charizard. Cada combate fortalece a los Pokémon, ya que van adquiriendo experiencia, lo que les permite desarrollar nuevas habilidades y, en caso de que aún cuenten con una evolución disponible, alcanzar su siguiente fase evolutiva.
![Conteo victorias de cada Pokémon](https://docutopia.sustrato.red/uploads/9655a3ac-135d-405c-ad2c-94755a55e341.png)
# Preguntas e inquietudes sincrónico y asincrónico
A continuación un listado de las preguntas que se dieron durante las clases (síncronas) y entre ellas (asíncronas) con motivo de la presente narrativa de datos.
## ¿Podemos trabajar con sustición de cadenas?
Para reemplazar un Pokemon por otro podemos usar sustición de cadenas. Si quisieramos hacerlo explícitamente con dos variables sería algo como:
Sin embargo, esto sólo funciona para esos dos pokemones en particular. Para abstraerlo en un bloque de manera que podamos usar pokemones arbitrarios, escribiríamos:
### ¿Cómo obtener los nombres de todos los pokemones?
A partir de esta respuesta [¿How can I call the PokeAPI to get all the Pokémon at once?](https://salesforce.stackexchange.com/questions/421367/how-can-i-call-the-pokeapi-to-get-all-the-pok%C3%A9mon-at-once), podemos encontrar un código en Pharo que rápidamente nos entregue los nombres como un diccionario de datos:
![1302 nombres de los pokemones, con sus enlaces end point en el PokeAPI.](https://docutopia.sustrato.red/uploads/fa6cb11f-b9d2-4650-b194-19861e8b4095.png)
![(Pokédex) Evoluciones pokémon](https://docutopia.sustrato.red/uploads/3f668ff6-d392-49e6-8ee6-8f643b705cef.png)
Pokémon son criaturas ficticias con habilidades especiales que los humanos, conocidos como entrenadores Pokémon, pueden capturar, entrenar y usar para combatir entre sí. El objetivo principal en muchos de los juegos es: Capturar todos los Pokémon (completar la Pokédex), Entrenar a un equipo fuerte, Derrotar a líderes de gimnasio y Convertirse en el Campeón Pokémon.
![Evolución tipo planta ](https://docutopia.sustrato.red/uploads/38c194b3-fb2a-475c-9e1a-6f668d3adb50.png)
![Evolución tipo fuego ](https://docutopia.sustrato.red/uploads/8ca147e1-d444-4269-b202-4b6e883cdc9a.png)