**Proyecto final**
[Enlace de la narrativa original](https://mutabit.com/repos.fossil/labci/doc/tip/wiki/revisando-la-participacion-continua--2w3jt.md.html#siguiendolaparticipaci%C3%B3ndesdelosrepositoriosdec%C3%B3digo) La narrativa que guía este proyecto fue elaborada manualmente por mí, con base en los criterios establecidos por el profesor. Fue validada como válida por el mismo, por lo que no se utilizó la narrativa oficial proporcionada al inicio del corte. A partir de ella, se construyó el torneo de combates Pokémon, utilizando GToolkit, DataFrames
# Primero probemos json en mi repositorio de la clase
Quiero definir primero el repo en json y que pueda formarse la URL en el segundo pharo. Esto lo haríamos con mi propio repositorio.
El resultado de este primer pharo muestra lo siguiente: ![](https://docutopia.sustrato.red/uploads/6ff96d0c-9050-4214-b84d-c8ce2a5d00b8.png)
Si quisiera recuperar los contenidos del anterior phato *del checkinTimelinelink*
Ahora este último pharo lo quiero convertir en un pixelario
# Pokemon Pokeapi Muy bien. Ahora tomando en cuenta el cambio de planes mencionado en clase nuestro enfoque se va a basar principalmente en el manejo de código con el pokeapi.
**nota rápida** para esta narrativa no voy a utilizar los términos de la narrativa hecha por el profesor. En este caso voy a utilizar términos como ***ejemplodepokemonlink** *pokemondiccionariodedatos** **diccionariosdedatospokemon**
## Conociendo a los pokemones (parte 1) En este primer apartado voy a realizar un análisis de los pokemones: pikachu, piplup y lucario. En primera instancia vamos a dar anexo a la página de pokeapi que nos va a permitir realizar la visualización de datos.
El primer ejemplo lo haremos con lucario
primero quiero poner el enlace grandecito
Y ahora quiero mostrar los contenidos.
aparecerá algo como esto: ![](https://docutopia.sustrato.red/uploads/858bebea-9d22-44f6-a6c0-1285bfca704a.png)
lo que vimos en el último pharo eran los datos crudos. Pero ahora quiero que se vean los datos estructurados
**Nota rápida** No quería funcionar colocando únicamente *ejemplodepokemonlink* por ende recurrí a utilizar otra estratégia la cual era poner *(ejemplodepokemonlink asUrl retrieveContents)* y ahora sí funcionó.
Se pueden ver las características del pokemon ![](https://docutopia.sustrato.red/uploads/7b6b980d-d187-4c1f-8528-d4cda09877a9.png)
Dentro de los datos que nos muestran la características de lucario podemos ver en sprites distintos ángulos del pokemon. Y entre ellos podermos ver un PNG que nos direcciona a ver dicho pokemon desdde el ángulo que queramos. En este caso podemos verlo de frente.
![ ](https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/448.png)
## Bloques y analizando los pokemones (parte 2)
**Nota rápida** Al realizar los bloques en los pokemones comenzando con el pharo que verán a continuación va a provocar la aparición de una serie de llaves en los anteriores pharos. Pero al volver a ejecutar los pharos de **conociendo a los pokemones** las llaves desaparecerán. Es un caso curioso pero importante para tener en cuenta.
![](https://docutopia.sustrato.red/uploads/ea2cc27b-ee70-47a6-9272-769df47dc465.png)
En los siguientes 4 pharos al ejecutar el último conocido como **ejemplodepokemonlink value: 'lucario'** y todos los posteriores hasta **blastoise** mostrará un enlace. Idéntico al primer pharo que ejecutamos respecto al tema de pokemones. Pero en este caso cuando colocamos dicho enlace en los buscadores nos direcciona a lo que veremos en la siguiente imagen: ![](https://docutopia.sustrato.red/uploads/0f57ed56-3111-433a-8405-8a60d4705950.png)
adicionalmente al primer pharo como hace referencia general al *pokemon* podemos utilizar el término *value* con cualquiera. Como se puede ver se realizó la prueba con: lucario, pikachu, piplup y blastoise.
En este aspecto cabe resaltar que los dos anteriores pharos utilizan el término de tomar un pokemon original y lo reemplazan por otro. Pero hay un método más fácil con el cual podremos reemplazar pokemones
nuevamente cuando añadimos el comando *value* en el diccionario de datos trae las características de cada pokemon
a continuación vamos a realizar comparaciones entre varias características de los pokemones. Esto se realiza como si fueran colecciones e iteradores. En este espacio voy a realizar dos divisiones. La primera con pikachu y piplup ya que son pokemones pequeños, la segunda entre lucario y blastoise al ser pokemones mas grandes.
En el siguiente recuadro vamos a colocar todos los pokemones con los que hemos trabajado hasta ahora
Y este fue el resultado . Como se puede evidenciar en la imagen aparece un listado de los pokemones que queremos comparar en el orden que los colocamos. Cuando ejecutamos los dos anteriores códigos de pharo debe aparecer algo similar pero o bien aparecen solo pikachu y puplup o deberian aparecer únicamente lucario y blastoise. ![](https://docutopia.sustrato.red/uploads/1484dd68-3c44-4c76-af69-d97aa5058625.png)
Ahora, me gustaría evaluar una de las colecciones que nos ofrecen para poder comparar las características de los pokemones. En este caso evaluaré primero a pikachu y piplup. Posteriormente haré lo mismo con los otros dos códigos.
Hasta este punto hemos podido colocar en un código de pharo dos enlaces que nos permiten ver las características tanto de pikachu como de piplup. Con esto podrmos conocer y comparar con mayor facilidad las características de cada uno. También este fue el motivo por el cual opté por hacer 3 comparativas distintas. Pues al tratarse de varios pokemones de distintos tamaños es más facil poder catalogarlos.
![](https://docutopia.sustrato.red/uploads/d9bfed21-28d7-45e0-ba97-e3ff269603a7.png)
Ahora. Voy a realizar el mismo procedimiento pero con todos los pokemones con los cuales hemos experimentado con anterioridad.
De igual manera que el procedimiento realizado unicamente con pikachu y piplup también se obtuvo un resultado similar incluyendo a los 4 pokemones. En este caso podemos explorar los diccionarios de datos de los 4 sin necesidad de ejecutar mas códigos en pharo.
![](https://docutopia.sustrato.red/uploads/b3502dbc-13f1-474f-8eef-8e4ece9a1564.png)
Pero al tratarse de varios diccionarios de datos vamos a grabarlo como corresponde
De los items que nos muestran los diccionarios de datos de los pokemones podemos encontrar uno en específico el cual podremos utilizar para poder comparar los pokemones entre sí.
Ahora supongamos que queremos facilitar la mecánica de comparación entre los pokemones. Principalmente tomando cualquier dato que podamos ver de manera más sencilla. Para ello utilizaremos el siguiente comando en pharo.
En el código de pharo nosotros colocamos características como: el nombre, el ID, los movimientos y la especie. Tal y como lo podemos evidenciar en la imagen que se ve y tomando de ejemplo a pikachu están puestas las características antes mencionadas.
![](https://docutopia.sustrato.red/uploads/1ade5057-4f08-4590-8692-996941f45558.png)
## ¿Cómo pelean los pokemones? (Parte 3)
Anteriormente hemos visto como podemos ver a los pokemones en formatos pixel y su imagen, como podíamos tener un diccionario de datos sobre nuestro pokemon de preferencia y finalmente como podíamos elegir los datos de preferencia de cada pokemon y elegirlo con mayor facilidad. Ahora vamos a aprender a como van a pelear los pokemones.
En el momento de que ejecuto el primer pharo donde probamos con establecer a pikachu y piplup como los primeros peleadores aparece lo siguiente:
![](https://docutopia.sustrato.red/uploads/3b86d611-b237-4bf9-a90c-779887049158.png)
Y ahora estableceremos los peleadores 3 y 4:
Teniendo a los dos primeros peleadores establecidos podemos ver sus datos utilizando el siguiente comando:
nuevamente podremos ver los items de cada pokemon. En caso de la imagen presente los de blastoise.
![](https://docutopia.sustrato.red/uploads/49713146-a1b2-4e24-9786-1693826d1859.png)
Pero también se pueden acceder a información mas específica de cada pokemon. Y se hace con el siguiente comando en pharo:
Y efectivamente nos muestra del item **moves** todos los movimientos que este pokemon tiene.
![](https://docutopia.sustrato.red/uploads/561b815b-5823-4480-9261-d7deaf6eb619.png)
Ahora procederemos a visualizar los movimientos de los peleadores. Primero vamos a establecer el código de movimientos, el cual para este caso llamaremos **movimientorandom**
y posteriormente vamos a evaluar cuales son los ataques que lanzarán nuestros peleadores. En este caso pikachu y piplup
![](https://docutopia.sustrato.red/uploads/8728ca80-a674-419a-b9c8-8dd19c72f88f.png)
Al tratarse de un movimiento escogido al azar nos genera los siguientes movimientos:
![](https://docutopia.sustrato.red/uploads/c9ff17f4-60cb-4a20-9214-b795c7c48fd6.png)
Y posteriormente con este código vamos a saber que sucede en la ronda final y también utilizando el comando de movimientorandom podemos ver que los movimientos cambian.
![](https://docutopia.sustrato.red/uploads/6e44d1b1-b6db-4240-a497-94cafb56d492.png)
Ahora, al utilizar los comandos de **at random** nos permite conocer también un ganador. Y cabe resaltar que al tener dicho comando puede ser cualquier pokemon el ganador de la batalla. a continuación vamos a conocer al ganador de esta batalla.
Finalmente nuestro ganador de esta batalla fue pikachu
![](https://docutopia.sustrato.red/uploads/7038c34d-a578-4694-9e2e-7c7584286b42.png)
## Torneo de pokemon a 3 rondas (parte 4)
Vamos a realizar el torneo pokemon de una vez. Y en este caso nuestros combatientes serán pikachu y piplup. Para esto vamos a utilizar dataframes y anexarlos a columnas y filas.
si el caso es que queremos colocar toda la información en un solo pharo y usando dataframes podemos utilizar el siguiente comando:
Ojo, el codigo anterior nos muestra la estructura general de los combates y las rondas. Que en este caso son 3
Este comando muestra dataframes en filas y columnas. Que quiere decir esto? que se distribuye de una manera mas efectiva
![](https://docutopia.sustrato.red/uploads/c790e661-74b7-4543-ad99-3414fbccf01c.png)
El siguiente código es una muestra de como funciona una randa entre los pokemones pikachu y piplup, los cuales están catalogados como **fighter1** y **fighter2**
![](https://docutopia.sustrato.red/uploads/d09ae030-126f-411a-88bc-32ffa98ef9fd.png)
![](https://docutopia.sustrato.red/uploads/b183be67-0d31-483c-9660-7609fb64be8f.png)
![](https://docutopia.sustrato.red/uploads/34bf071c-c56b-43d9-b6c7-1485d26748e8.png)
Y al ejecutar el código obtendremos : los dos primeros datos como los datos oficiales de los pokemones que van a pelear (osea, los nombres de pikachu y piplup no se van a mover aunque ejecutemos un millon de veces el código) los ataques de ambos pokemones (ambos siendo random, el 3 siendo perteneciente a pikachu y el 4 a piplup) y el ganador, el cual al igual que los ataques puede tener cambios.
![](https://docutopia.sustrato.red/uploads/21820613-25f2-4355-ac1b-7d619cca4008.png)
Como se puede evidenciar en la imagen obtendremos el resultado del combate de la primera ronda. Combate el cual ganó piplup
Ahora, si quisiera anexar la ronda al torneo en general debería utilizar el siguiente comando.
Finalmente tuve que realizar 3 veces tanto los códigos de ronda como los códigos de torneo pokemon. Esto dió un resultado favorable para piplup 2-1
![](https://docutopia.sustrato.red/uploads/3c3353d0-12bd-4758-8daf-42433be8c95e.png)
![](https://docutopia.sustrato.red/uploads/e110979d-03ed-44cd-b189-e3f5378aa69f.png)
Este último pharo funciona como un listado en dataframes el cual tiene una mayor facilidad para poder leer quienes fueron los ganadores y en qué ronda consiguieron la victoria. Posteriormente con la información anexada podremos utilizar simplemente el código **winners** para poder ver nuevamente la tabla.
![](https://docutopia.sustrato.red/uploads/e9d209f3-3367-4346-8ea4-bda0577d84e1.png)
**Nota:**Que pasaría si sorteo a los pokemones que quiero ver pelear? (Me lo preguntaba mientras andaba aprendiendo sobre el comando **AtRandom**
Vale, con este nuevo comando vamos a poder organizar una serie de encuentros mucho más intrigantes y que no parezcan ser amañados en ningún momento.
# Solución de los puntos puestos para el corte final. **Nota a tener en cuenta** Originalmente tenía pensado realizar la implementación de 3 narrativas a mi repositorio. Pero dado que Fue completamente imposible poder importar la narrativa original dada por el profesor. No sé si esto pueda perjudicar mi nota o si haya gran conflicto con este percance. Pero quiero dejar en evidencia que lo intenté mas de una vez con la narrativa del profesor. A continuación anexaré las imágenes que confirman que no solo lo intenté sino que también solicité ayuda en la lectura anotada.
![](https://docutopia.sustrato.red/uploads/19d2fb9f-c0e1-4ca2-8407-bfdf675a471b.png)
![](https://docutopia.sustrato.red/uploads/82f765b6-fa7b-4a43-8f52-2c393beb2c9a.png)
Una vez aclarado este malentendido podemos comenzar.
## Primer punto 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. 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.
En el documento que se enlazará a continuación se podrán evidenciar mis anotaciones dentro del documento. Adicionalmente en esta misma narrativa se presentarán imágenes de cada uno de los comentarios realizados en la narrativa original. [Enlace de la narrativa original donde se encuentran los comentarios realizados](https://mutabit.com/repos.fossil/labci/doc/tip/wiki/revisando-la-participacion-continua--2w3jt.md.html#proyectofinal)
Primer comentario: ![](https://docutopia.sustrato.red/uploads/441a7fb4-45b4-4bd3-9be2-0572cb0ce84e.png)
Segundo comentario: ![](https://docutopia.sustrato.red/uploads/8ec65ed1-e5f2-4bd0-a63b-e484558bf606.png)
Tercer comentario: ![](https://docutopia.sustrato.red/uploads/022595ad-427e-4650-8420-42a23e3ec3e4.png)
Cuarto comentario: ![](https://docutopia.sustrato.red/uploads/d897088d-04a5-4a0d-a039-20aa600324ee.png)
Quinto comentario: ![](https://docutopia.sustrato.red/uploads/4a1276c8-3188-48bd-b3a3-23a82d9f1470.png)
## Punto 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.
Como aclaré antes dde comenzar a explicar los puntos del corte final. La página de Glamorous Toolkit se congeló al ingresar el enlace de la narrativa original del profesor. Pues mi plan era montar esta narrativa y la narrativa del profesor con ediciones para poder realizar un trabajo mucho mas detallado. Por las circunstancias anteriormente mencionadas opté por colocar dichas ediciones en esta narrativa, las cuales son los puntos que estamos conociendo justo ahora. Sin embargo comparto nuevamente el enlace para poder ver la narrativa original. [Enlace de la narrativa hecha por el profesor](https://mutabit.com/repos.fossil/labci/doc/tip/wiki/revisando-la-participacion-continua--2w3jt.md.html#proyectofinal)
## Punto 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, 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.
Bueno, en este punto a pesar de haber realizado un torneo pokemon con las 3 rondas respectivas Sugiero realizar una segunda edición para que la información se mantenga clara. Dicho esto podemos comenzar.
### Torneo pokemon, segunda edición. En esta nueva edición del torneo pokemon vamos a enfrentar a dos contrincantes que no han tenido la oportunidad de luchar. Se tratan de lucario y blastoise. Primeramente cabe aclarar que ambos pokemones ya están establecidos dentro de los datos de glamorous y enlazados al término de fighter 3 y 4. Comenzaremos con una ronda batalla libre y posteriormente una batalla registrada con los dataframes.
Lo que acabamos de hacer fue tomar a nuestros contrincantes para conocerlos.
Y posteriormente conocer las características de cada uno de nuestros contrincantes con el código *data*
Seguidamente establecemos los datos de los movimientos random para cada peleador.
Primeramente procedemos a probar los movimientos random de cada uno de los peleadores en esta ronda amistosa. la cual da como resultado los movimientos que veremos en la próxima imagen
![](https://docutopia.sustrato.red/uploads/96040cfb-d775-4ef3-9ea5-60563cde7227.png)
Este código sigue siendo el mismo que el anterior pero confirma que funciona la mecánica de lanzar movimientos random por parte de cada pokemon.
Finalmente definimos quien es el ganador de este encuentro amistoso.
Ahora, lo que se realizará a continuación es el combate de estos dos pokemones. En este caso la pelea será registrada en los dataframes los cuales funcionan como un orden de columnas y filas para entender con mayor facilidad este encuentro.
Este código si bien puede funcionar perfectamente colocando datos en las columnas, también puede ser colocando datos en las filas. Por ejemplo, colocando los rounds. Pero al hacer eso se debe tener en cuenta que al ejecutar los 3 rounds realmente van a aparecer 6, los cuales los 3 primeros no contarán con datos. Así que lo más recomendable es tomar este código tal cual.
![](https://docutopia.sustrato.red/uploads/c35d9565-1bb1-43ce-a9fa-78b7198ef64a.png)
El código que acabamos de ver es la primera ronda de la segunda edición del torneo. Precisamente para que los datos no queden registrados con la pelea de ejemplo de los capítulos anteriores se editó el nombre del round (cosa la cual sucederá con los demás rounds)
![](https://docutopia.sustrato.red/uploads/61d1481c-8bcb-4da5-8056-34659206f1a1.png)
![](https://docutopia.sustrato.red/uploads/b897fab2-06ed-448f-b3aa-2c2ba7ab6846.png)
Los dos últimos códigos son los rounds 3 y 4. Y con esto podemos definir perfectamente quien es el campeón de esta segunda edición del torneo pokemon. Siempre y cuando no se vuelvan a ejecutar los datos porque al tener los movimientos y un ganador anexados con random.
Adicionalmente anexo un pharo que nos permita conocer datos más precisos en dataframes los cuales enlista de manera más sencilla nuestros ganadores y en qué ronda se consagraron con la vistoria. Y en este aspecto nuestro ganador con 2 de 3 encuentros fue **Blastoise**
![](https://docutopia.sustrato.red/uploads/47b66dec-65f9-4dd4-acb7-0e31d319076d.png)
![](https://docutopia.sustrato.red/uploads/cb990b67-3c8f-4c7e-a5ac-4dbc93efb36f.png)
Finalmente los últimos códigos puestos son el anexo de las rondas jugadas a los dataframes. Como se puede ver este tipo de códigos forma un listado en el que podemos ver cuales fueron los peleadores, movimientos y ganador de cada ronda. Como se mencionó con anterioridad, nuestro ganador del 2 de 3 fue **Blastoise**
![](https://docutopia.sustrato.red/uploads/98f6b143-ed55-44f7-b601-0c30464a3072.png)
## punto 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.
Antes de comenzar con las modificaciones y la explicación del 4.1 y 4.2 me gustaría explorar brevemente como funciona el código de pokemon atRandom
Si bien no hubo un código que diga explícitamente **Pokemon atRandom** Si logré identificar el código del pokemon ganador del encuentro. En este aspecto la idea principal es que los pokemones que vayan a luchar y sus respectivos movimientos también sean random. Y para ello vamos a resolverlo a continuación.
**Ahora sí desarrolemos el punto 4.1** Describir las modificaciones solicitadas, como un conjunto de pasos finitos en frases, en español.
Encontré una posible solución, la cual consiste principalmente en crear un código basado en el posible sorteo que mencionamos antes de desarrollar los puntos. En este aspecto como se escoge uno de 4 pokemones al azar lo implementé como **todoslosfighters** A partir de ese punto implementé esta premisa en el código del enfrentamiento en la ronda. Pero posteriormente encontré un nuevo problema. Que al ejecutar el nuevo código del enfrentamiento se repetía el mismo pokemon. Obviamente no habría sido lógico un enfrentamiento entre piplup y piplup. Así que cual fue mi paso a seguir? Sencillo. Dupliqué el código y edité el nombre del mismo para que fuera posible una batalla entre 2 pokemones no elegidos por mí. Ahora, esto fue la prueba de como podía dar una solución a lo que pide el cuarto punto y por ello al principio del párrafo lo denominé como una **posible solución**. Lo único que si bien no es un problema si es un tanto ladilloso es que para poder ejecutar el código de la ronda primero se deben ejecutar los dos anteriores códigos que establecen al peleador escogido entre los 4.
![](https://docutopia.sustrato.red/uploads/7b362c56-1bb0-4747-9b2c-6a962a74b7e2.png)
Y aquí está el resultado de lo generado en el código.
**4.2** En este punto desarrollé el enfrentamiento entre Pokemones de forma aleatoria, siguiendo los pasos descritos anteriormente. Además, siguiendo la sugerencia del enunciado ("si se alcanza"), traducí varias de esas frases explicativas al lenguaje de programación Toolkit, para que se vea reflejado de forma clara el proceso.
A continuación prodederé a enlistar cuales fueron los términos utilizados en todo el proceso de la narrativa.
- pokemondiccionariodedatos - diccionariosdedatospokemon - Ejemplodepokemonlink - fighter1 - fighter2 - fighter3 - fighter4 - pokemon - movimientorandom - torneopokemon - torneopokemonv2 - round1 - round2 - round3 - round1v2 - round2v2 - round3v2 - winners - winnersv2 - todoslosfighters - todoslosfighters2