read.cash Log in

@kalawasa

Joined 5 February 2022 · 7 posts

programación y videojuegos

120 KT

0 KT · 7¢ received · 0 KT · 10¢ given

Posts

@kalawasa

[2] Código base de C++ para programación competitiva Si estas empezando con C++ para programación competitiva, te puede interesar tener un archivo compacto base (una plantilla) para empezar a resolver nuestros problemas. Este archivo tendrá lo necesario para ser usado en cualquier escenario en el que tengamos que programar soluciones rápidas como es el caso de la programación competitiva. El código base Es la estructura de código principal que permite ejecutar nuestra solución. #include <bits/stdc++.h> using namespace std; int main() { ios_base::sync_with_stdio(0); cin.tie(0); /* aquí vendrá el código de su solución */ return 0; } Cada linea de código tiene un propósito, y son: `#include <bits/stdc++.h>` , incluirá toda la librería estándar de GNU C++ (STL), en otras palabras copiará y pegara todo el código contenido en este archivo, con esto nos ahorramos tiempo de escribir en la cabecera cada librería que usemos, esta opción no es una buena idea para la programación convencional, porque incluirá cosas innecesarias y aumentaría el tiempo de compilación. `using namespace std;` , es el espacio de nombre que agrupa y define todo un bloque estándar de funciones, variables entre otros. Aquí se encuentra definido las funciones de entrada y salida estándar como son `cout` y `cin` . `int main() {}` , es la función principal donde se iniciará la ejecución de nuestro programa, cada archivo *.cpp* que creemos debe tener esta función. `ios_base::sync_with_stdio(0); cin.tie(0);` , es la declaración de entrada y salida rápida, permite recibir entradas (`cin`) sin esperar a alguna salida (`cout`) que pudiera aparecer en el proceso, osea deshabilita la sincronización entre `cin` y `cout`, en el caso de programación competitiva es muy útil en la mayoría de los problemas porque se reciben grandes cantidades de datos y se espera una respuesta por cada uno de ellos, pero no es necesario mostrar la respuesta uno por uno, esta linea de código permite almacenar las respuestas en un *buffer* y luego mostrar todo de golpe. Una alternativa para entradas y salidas rápidas es usar `scanf` y `printf` que cumplen la misma función, si se usa estas funciones esta linea de código es innecesaria. También hay que tener en cuenta que si se usa esta linea de código no podemos usar `cin` y `cout` junto con `scanf` y `printf` . En el caso de problemas interactivos no agregar esta linea en su código. `return 0;` , es la respuesta o retorno de la función `main()`, la documentación también indica que si el código dentro de la función `main()` termina y no encuentra el `return`, este ejecutará implícitamente `return 0;` . ¿Qué mas podemos agregar a nuestra plantilla? Hay dos opciones que son muy usadas por programadores competitivos, son los *MACROS* y *TYPEDEFS,* estas cumplen la función de abreviar el código de manera que facilitan la velocidad de tipeo y codificación, antes de usarlos yo recomiendo familiarizarse con el entorno de C++*.* MACRO Son porciones de código que son definidas por la directiva `#define` . Cuando el compilador encuentre una macro, reemplaza el nombre con la definición de la macro, por ejemplo: #include <bits/stdc++.h> using namespace std; #define FIN ios_base::sync_with_stdio(0); cin.tie(0); #define sz(x) int((x).size()) #define FOR(i,a,b) for (int i = (a); i < (b); i++) int main() {FIN vector<long long> v = {1, 2, 3, 4, 5}; FOR(i, 0, sz(v)) { cout << v[i] << "\n"; } return 0; } En este ejemplo primero definimos la entrada y salida rápida con la macro `FIN`, para llamarlo luego al inicio en la función `main` , seguidamente declaramos un vector el cual queremos iterar usando la macro `FOR(i,a,b)` y la macro `sz(x)` . Ahora cuando se realice la compilación las macros serán reemplazadas y quedara algo similar a: #include <bits/stdc++.h> using namespace std; #define FIN ios_base::sync_with_stdio(0); cin.tie(0); #define sz(x) int((x).size()) #define FOR(i,a,b) for (int i = (a); i < (b); i++) int main() {ios_base::sync_with_stdio(0); cin.tie(0); vector<long long> v = {1, 2, 3, 4, 5}; for (int i = 0; i < int(v.size()); i++) { cout << v[i] << "\n"; } return 0; } Cabe resaltar que se puede usar macros ya definidas en otras macros. TYPEDEF Permite dar un nombre mas corto a un tipo de dato existente, por ejemplo: #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef vector<ll> vll; int main() {ios_base::sync_with_stdio(0); cin.tie(0); vll v = {1, 2, 3, 4, 5}; for (int i = 0; i < int(v.size()); i++) { cout << v[i] << "\n"; } return 0; } Aquí declaramos dos nuevos `typedef` para el tipo de dato `long long` y la estructura de datos `vector<>` de tipo `long long` , también es posible usar `typedef` en otros `typedef`. Ahora juntemos nuestras ***macros*** y ***typedefs***, nos daremos cuenta que el contenido de la función `main` es más fácil y rápido de escribir, nuestra nueva plantilla ahora sera todo lo que está fuera de la función `main` . #include <bits/stdc++.h> using namespace std; #define FIN ios_base::sync_with_stdio(0); cin.tie(0); #define sz(x) int((x).size()) #define FOR(i,a,b) for (int i = (a); i < (b); i++) typedef long long ll; typedef vector<ll> vll; int main() {FIN vll v = {1, 2, 3, 4, 5}; FOR(i, 0, sz(v)) { cout << v[i] << "\n"; } return 0; } Llegando a este punto usted puede decidir que tanto y en que medida esta dispuesto a usar las abreviaciones de código. Referencias y más Fast I/O for Competitive Programming https://www.geeksforgeeks.org/fast-io-for-competitive-programming/ How NOT to use macros https://codeforces.com/blog/entry/100941 C++: Methods of code shortening in competitive programming https://www.geeksforgeeks.org/c-methods-of-code-shortening-in-competitive-programming/

@kalawasa

[1] Resolviendo nuestro primer problema Puede que estés entusiasmado o solamente con curiosidad por saber que viene ahora. A continuación veremos un ejemplo de como es el proceso para resolver un problema y enviarlo a un juez. El problema lo resolveremos en un editor de textos, escribiremos el código en C++, usaremos la ventana de comandos o terminal para compilar y ejecutar la solución y luego lo enviaremos al juez en linea para probar nuestra solución. Eligiendo un juez en linea Las plataformas que recomiendo para practicar, y con las cuales trabajaremos son *Codeforces**,* *Codechef**,* *LeetCode* y *SPOJ**.* Todas estos jueces en lineas tienen muchas similitudes en como presentan los problemas: https://codeforces.com/ https://www.codechef.com/ https://leetcode.com/ https://www.spoj.com/ ***Codeforces***: Descripción del problema, Input, Output, Examples, Time Limit. ***Codechef***: Descripción del problema, Input, Output, Constraints, Examples, Time Limit. ***LeetCode***: Descripción del problema, Input, Output, Examples. ***SPOJ***: Descripción del problema, Input, Output, Examples, Time Limit. La **descripción del problema** es la explicación que puede ser muy clara y directa indicando que se necesita resolver, o puede tener un contexto más amplio que influirá en la comprensión del problema. El **Input** es la descripción de los datos de entrada, se indica el orden en que se proporcionaran, en la mayoría de los casos aquí también se incluyen las restricciones (por ejemplo el problema puede indicar que se utilizarán ***n*** datos de entrada donde ***0 <= n < 10^5***, esto último sería la restricción). El **Output** es la descripción de como se debe presentar los resultados o respuesta del problema, aquí se enfatiza mucho en el formato de presentación, de esto depende si tu solución es aceptada o no. Los **Constraints** son las restricciones de las entradas, en algunos jueces están incluidos en el **Input**. Los **Examples** son una cantidad muy pequeña (entre 1 a 3) de los casos de prueba totales, acordémonos que existen una cantidad finita de casos de prueba que la solución debe resolver y que no se muestran al competidor. Y por último esta el **Time Limit** que seria el tiempo máximo permitido para que nuestra solución obtenga la respuesta a un caso de prueba. Teniendo claro la estructura de un problema pasaremos a resolver eligiendo uno en ***Codeforces.*** Entendiendo el problema El problema que resolveremos se llama *Watermelon**,* por favor tómese un tiempo para leerlo. https://codeforces.com/problemset/problem/4/A El problema cuenta el contratiempo que tienen dos amigos con una sandia, en esencia lo que el problema solicita es poder dividir la sandia que tiene un peso representado por ***w*** en dos partes que tengan un peso ***par*** y no necesariamente iguales. Bien, veamos ahora como es la entrada y salida del problema: **Input:** la entrada es un solo número ***w***, y es el peso de la sandia el cual es mayor e igual a 1, y menor e igual a 100, siendo esta la restricción, por ende el juez nos dará solo números enteros positivos que estén dentro de este intervalo. **Output:** la salida son dos posibles palabra ***YES*** o ***NO***, que indican si es posible o no dividir la sandia teniendo en cuenta la descripción del problema (no olvidemos que tenemos que respetar este formato, en este caso las respuestas a la salida están en mayúsculas). A continuación vemos los ejemplos que para este problema es solo un caso de prueba donde nos muestra su **Input** que es **8** y su **Output** que es **YES**, este ejemplo nos servirá para probar nuestra solución. Y por ultimo en la parte final, una nota que explica como fue dividida la sandia y por que de la salida que se da en el ejemplo. Ya teniendo el problema muy claro, empecemos a resolverlo generando ideas a partir de conceptos matemáticos: Los números con los que trataremos siempre son números enteros positivos. Sabemos que la suma de 2 números pares positivos, o la suma de 2 números impares positivos siempre da un número par positivo. Por lo tanto, ¿podríamos decir que un número par positivo es la suma de dos número pares positivos? Aquí me gustaría que lo pienses mientras seguimos con la resolución. Si la respuesta a la pregunta anterior es cierta lo que tendríamos que hacer es responder ***YES*** cuando ***w*** es un número par, y ***NO*** en caso contrario. Entonces solo nos queda hacer el código para probar nuestra hipótesis. #include <bits/stdc++.h> using namespace std; #define FINOUT ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int main() {FINOUT int w; cin >> w; if (w % 2 == 0) { cout << "YES\n"; } else { cout << "NO\n"; } return 0; } Expliquemos un poco el código: Primero declaramos un variable ***w*** de tipo ***int*** que será para almacenar el peso de la sandia. Luego recibimos la entrada en la variable ***w***, por intermedio de ***cin*** que es el flujo de entrada estándar de C++. Continuamos con una operación de modulo representado por ***%,*** la operación modulo es binario y devuelve el residuo de la división ***A*** entre ***B***, si la operación modulo fuera ***A % B***. Para nuestro ejemplo con este resultado sabremos si el número es par, sí es igual a **0** o impar en caso contrario, y esto lo verificamos usando el operador de comparación ***==***, que devuelve ***verdadero*** si ***A*** es igual a ***B*** y ***falso*** en caso contrario, para ***A == B***. Usamos la condicional ***if - else*** para guiar a la operación anterior según el resultado verdadero o falso, y según que valor se le dé, continuará con un porción de código diferente. Por ultimo imprimiremos la salida por intermedio de ***cout***, que es el flujo de salida estándar de C++. El código necesario para resolver nuestro problema esta descrito en los puntos anteriores, el código que no se menciono se podría decir que es el código base para que nuestro programa en C++ pueda ejecutarse sin ningún error (en algún articulo posterior se explicara con detalle que aporta cada una de esas lineas). Con esto tendríamos listo nuestra solución, pero no cantemos victoria, quizás ya te diste cuenta que nuestra solución no funciona para un caso. Que pasaría si ***w*** es **2**, la respuesta seria ***YES***, pero es una respuesta incorrecta, si nos ponemos a pensar en 2 números pares positivos que sumen 2 no los hallaremos, ahora nos viene la duda, ¿sera el único o habrá otros números más que no cumplan?. Pues para no alargar mucho, este es el único caso, ahora modificaremos el código teniendo en cuenta este detalle. #include <bits/stdc++.h> using namespace std; #define FINOUT ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int main() {FINOUT int w; cin >> w; if (w != 2 && w % 2 == 0) { // Agregamos una comparación en nuestra operación lógica cout << "YES\n"; } else { cout << "NO\n"; } return 0; } Modificamos la condición de ***if - else*** con la siguiente sentencia: ***w != 2 && w % 2 == 0***, obtendremos verdadero solo si el peso es diferente de 2 y el residuo de la división entre 2 es cero. Ahora si tenemos una solución ganadora, guardemos este código en un archivo con el nombre ***main.cpp***, luego compilemos con el siguiente comando en un terminal o ventana de comandos: `g++ -std=c++17 -o main -O2 main.cpp` Ahora ejecutemos nuestro programa compilado: `./main` El programa esperará hasta que ingresemos por teclado un número, si probamos el ejemplo que nos proporciono el problema, la interacción debería ser algo como esto: En algunos editores de texto ya viene la opción ***Compile and Run,*** que ejecutara automáticamente los anteriores dos comandos. Con esto estamos listos para enviar nuestra solución al juez en linea, ¿que respuesta nos dará el juez? Enviando la solución Tenemos listo nuestro archivo ***main.cpp*** que enviaremos al juez en linea. Todos los jueces en linea tienen un apartado para enviar la solución al problema que estas tratando de resolver, busque el apartado de ***SUBMIT***, en los jueces ***Codeforces, Codechef*** y ***SPOJ*** nos proporcionaran dos opciones, la primera es copiar y pegar todo nuestro código en el editor de texto que nos proporciona y la segunda es cargar nuestro archivo. En el caso de ***LeetCode*** solo se permite copiar y pegar el código. Luego de copiar el código, elegir el lenguaje con el que se hizo la solución y dar al botón de ***Submit,*** solo nos queda esperar la respuesta del juez. Cuando el juez termine de ejecutar la solución para todos los casos de prueba del problema nos dará un veredicto. Éxito, hemos resuelto nuestro primer problema :). En la respuesta del juez hay que tener en cuenta 3 puntos: **El veredicto**: indica si la solución fue aceptada o no, es el más importante. **El tiempo**: es el tiempo que se demoró en ejecutar la solución enviada, para el problema que hemos resuelto el tiempo limite o ***Time Limit*** era de 1 segundo, y el tiempo que demoro nuestra solución es de 30 mili segundos, en otras palabras estamos dentro del tiempo limite. **La memoria**: es la memoria usada en la ejecución de nuestra solución, en el problema que hemos resuelto la memoria limite era 64 MB, y solo usamos 0 KB. Cuando obtenemos un veredicto que no es aceptado, el tiempo y memoria que nos otorga el juez en el resultado nos podría darnos un indicio de que tipo de error tiene nuestra solución. Y para concluir mencionare los tipos de veredicto que el juez puede dar, estos son los mas comunes: Accepted (AC): La solución paso todos los casos de prueba, fue aceptada. Wrong answer (WA): La solución no pasó ninguno o algún caso de prueba por dar una respuesta o salida incorrecta. Time limit exceeded (TLE): La solución no termino en el tiempo limite indicado por el problema. Memory limit exceeded (MLE): La solución intenta consumir más memoria de la indicada en el problema. Runtime error (RTE): La solución finalizó con un código de retorno distinto de cero (posibles razones: acceso al array fuera de límite, división por cero, desbordamiento de pila, uso incorrecto de punteros entre otros). Espero que haya sido de mucha ayuda esta guía aclarando dudas de como se puede empezar a practicar resolviendo problemas en los jueces en linea. NOTAS La compilación y ejecución del código en C++ se hizo en una computadora con sistema operativo Ubuntu 20.04.

+1 more

@kalawasa

[0] Empezando en programación competitiva Si te gusta la programación, resolver problemas lógicos y/o matemáticos, encarar desafíos y participar en competencias, todo esto mientras te diviertes y aprendes, pues déjame decirte que este articulo te puede interesar. ¿Qué es la programación competitiva? Actualmente la programación competitiva es considerado un deporte en el cual se resuelven problemas usando conceptos lógicos y matemáticos mediante el desarrollo de código en un lenguaje de programación y en un tiempo límite. La programación competitiva se desarrolla mediante concursos o competencias, y dependiendo del tipo de competencia puede ser por equipos o individuales y pueden durar entre 1 hora o algunos días. En general en cada competencia se les presenta a los competidores una cantidad finita de problemas (pueden ser entre 3 a 15 problemas dependiendo de la competición), todos estos problemas ya fueron resueltos y probados por los autores. Cada problema tiene una definición y/o explicación del problema, con sus respectivos datos de entrada, salida, restricciones (como la cantidad y limites de los datos) y casos en prueba (se les da solo una pequeña porción a los competidores, los otros casos son para el juez). Los competidores deben presentar una solución (código en algún lenguaje de programación) a cada problema, esta solución será revisado por un juez, normalmente es un juez programado que ejecuta la solución y de forma automática revisará las salidas con todo el conjunto de casos de prueba que el autor dispuso. Para que una solución sea aceptada debe pasar todos los casos de prueba y cumplir con la limitación de tiempo y memoria que problema proporciona. Existe también algunas competiciones donde las soluciones solo deben coincidir con las salidas de los casos de prueba, en otras palabras la solución son las respuestas de todos los casos de prueba, no se necesita enviar el código, y debe cumplir el formato indicado en la salida del problema. Habilidades que puedo adquirir La programación competitiva te puede traer muchas ventajas en tu desarrollo profesional, puedes convertirlo en un hobby y más aun si lo compartes con otras personas formando equipos de entrenamiento. Los beneficios que puedes obtener son: **Mejora las habilidades mentales y lógicas**, en tu entrenamiento aprenderás conceptos de algoritmos y estructuras de datos que son muy útiles e indispensables para la resolución de problemas y el desarrollo de software. **Te prepara para las entrevistas**, estarás un paso por delante para entrevistas de trabajo en empresas como *Google, Facebook, Amazon* entre otros. **Mejora el trabajo en equipo**, si participas de competencias en equipo como la *ICPC* y *IOI*. **Puedes ser contratado**, al participar en las competencias mundiales y por ser muy difíciles y prestigiosas, las empresas están muy interesadas en los concursantes. Pero no todo son beneficios, a diferencia del desarrollo de software, en la programación competitiva se necesita resolver problemas lo mas rápido posible, por ende no se enfoca en buenas practicas de programación como el código limpio y legible. La programación competitiva puede ser divertida y frustrante para las personas que lo practican, muchas veces te toparas con problemas que parecen imposibles de resolver o peor aun son fáciles de entender pero no de implementar, porque necesitas conocimientos un poco mas avanzados sobre temas de estructuras de datos y algoritmos que no están a tu alcance en esos momentos. Pero no te desalientes todo esfuerzo tiene su recompensa. Lo indispensable para comenzar Entre las habilidades y conocimientos mínimos para comenzar están: Conocer algún lenguaje de programación (los más usados en programación competitiva son *C++, Java y Python*), tener claro los conceptos de declaración de variables, bucles, condicionales y operaciones lógicas, además de saber compilar (en algunos casos) y ejecutar un simple archivo de código del lenguaje de programación que se use. Conceptos básicos de matemática y lógica (suma, resta, multiplicación, división, modulo, ecuaciones, operaciones lógicas). Listo, con estos puntos uno puede empezar a resolver problemas básicos o participar de una competencia, con el tiempo iras aprendiendo conceptos de algoritmos y estructuras de datos que serán herramientas para entender temas más complejos y que te ayudaran en la resolución de problemas. Algunos recursos para empezar a practicar: Un editor de texto, el de tu preferencia, hasta un bloc de notas sirve para empezar a escribir el código. Jueces en linea para practicar (*Codeforces**,* *CodeChef**,* *Leetcode**,* *SPOJ*). https://codeforces.com/ https://www.codechef.com/ https://leetcode.com/ https://www.spoj.com/problems/classical/ Competencias y Jueces Las competencias se pueden realizar de manera presencial o en linea, también hay jueces en linea para realizar simulaciones de competencias y practicas, entre los mas conocidos tenemos: *The ICPC International Collegiate Programming Contest**,* en una competencia anual de equipos de 3 personas entre universidades de todo el mundo. https://icpc.global/ *International Olympiad in Informatics**,* es una competencia de equipos de 4 personas para estudiantes de secundaria de todo el mundo, tu país debe ser miembro de la *IOI* para participar. https://ioinformatics.org/ *TCS CodeVita**,* es una competencia individual para estudiantes de universidad abierta a todo el mundo. https://www.tcscodevita.com/ *Facebook Hacker Cup**,* es una competencia anual e individual para participantes de todo el mundo. https://www.facebook.com/codingcompetitions/hacker-cup *Google Code Jam**,* es una competencia anual e individual para participantes de todo el mundo. https://codingcompetitions.withgoogle.com/codejam *Codeforces**,* juez en linea, realiza competencias semanales y tiene una comunidad muy activa que proveen tutoriales. https://codeforces.com/ *CodeChef**,* juez en linea, realiza competencias semanales de corta y larga duración. https://www.codechef.com/ *Topcoder**,* juez en linea, realiza competencias mensuales, anuales como el *TCO* y maratones. https://www.topcoder.com/ *LeetCode**,* juez en linea enfocado en problemas para entrevistas de trabajo, realiza competencias semanales. https://leetcode.com/ *AtCoder**,* juez en linea, realiza competencias semanales. https://atcoder.jp/ *HackerEarth**,* juez en linea, realiza competencias mensuales de corta y larga duración, tiene también problemas de entrevistas y tutoriales. https://www.hackerearth.com/challenges/ *Sphere Online Judge (SPOJ)**,* juez en linea muy usado por la calidad de problemas que presenta. https://www.spoj.com/ *Kattis**,* juez en linea, tiene un banco de concursos que se han realizado en todo el mundo. https://open.kattis.com/ Espero haber incentivado tu curiosidad por este tema que puede ser muy apasionante para los que nos gusta la programación y resolver problemas desafiantes.

@kalawasa

Es momento de seguir planificando #4 Ha pasado 2 meses y poco más desde mi última publicación, en resumen, pude publicar mi primer juego en itch.io y también participé de una *Jam*, el día que publiqué mi juego me alegré mucho, tenia una sonrisa de oreja a oreja. Ahora les compartiré esa experiencia. https://kalawasacraft.itch.io Aún estoy al 99% de completar el juego, lo he venido desarrollando por al menos tres meses, si bien lo he publicado aun falta corregir algunos detalles y mejorar el juego, el nombre que elegí es "Supérame", haciendo referencia a que en este juego tienes que superar el tiempo de otros jugadores. Ahora veamos como fue todo este proceso para llegar hasta aquí. https://kalawasacraft.itch.io/superame La idea y plan de acción Trabaja todos los días en este proyecto, algunos más que otros, tenía claro la idea general del juego que quería construir: *Un juego de plataforma donde ayudas a tu personaje favorito a recolectar hojas de coca doradas en el menor tiempo posible, con enemigos que te dificultaran la recolección, donde el personaje puede morir y no terminar el desafió, todo esto en formato 2D y con gráficos en Pixel Art.* Luego de aprender a prueba y error sobre animación en *Pixel Art* y como manejar el motor de videojuegos *Unity,* estaba preparado para empezar a unir las piezas. Empece por la construcción del mapa o nivel, todo el escenario donde el personaje se moverá y enfrentará a enemigos. Aquí me enfoque en crear el conjunto de texturas, que son lo bloques con los que formaría los edificios y plataformas, estos se llaman *Tile Set*. *Unity* me da herramientas sencillas como el *Tile Map* para completar este propósito. Ahora que ya tenia un nivel para la interacción de los personajes y objetos, quería darle vida. Realice las animaciones de los personajes, enemigos, potenciadores y objetos, luego de eso los incluí en el nivel, primero en modo de prueba, empece con la programación del personaje, quería verlo saltar, golpear y moverse por todo el mapa, tenía que estar seguro que el control sea fluido, en este caso lo probé con un teclado, tenia la intención de que se pueda jugar en un navegador o descargarlo y poder jugarlo en *Windows* o *Linux* sin necesidad de instalarse. Luego seguí con los enemigos, potenciadores y objetos, hasta este punto solo pude realizar la interacción entre mapa y personajes y/o objetos. Me faltaba la interacción entre los personajes, enemigos, y objetos. Esta parte del proceso fue la que me tomo casi la mitad del tiempo del proyecto. Necesitaba implementar un cronometro que controlara el tiempo desde el inicio hasta que el personaje completara la recolección de todas las hojas, pero antes debería existir una señal que me indique cuando iniciar. Para esto empece a buscar tutoriales que se adecuen a estas características, en *Youtube* encontré muchas, solo tuve que adecuar las ideas a mi proyecto. Ahora venia la parte mas genial y tediosa, hacer que los personajes y objectos interactúen, colisionen y muestren personalidad en su mundo, ademas de agregar los efectos de sonido para este propósito. Estas son algunas de las características de sus interacciones: El personaje escogido y los enemigos tienen un número de vidas que disminuirán si son alcanzados por el ataque del contrario. Los enemigos deben detectar al personaje a una cierta distancia y atacarlo. Derrotar a un enemigo disminuye unos segundos el tiempo transcurrido. Existen potenciadores que al recogerlos permiten aumentar nuestro ataque o defensa por un cierto tiempo, y otro objeto para recuperar nuestra vida. Cuando alcanzamos un hoja de coca dorada esta se desvanece y aumenta en +1 la cantidad de hojas recogidas. Teniendo ya un nivel mas funcional, me ocupe de la interfaz para el jugador, un panel donde mostraría la vida del personaje, la cantidad de hojas recogidas y el tiempo transcurrido. También necesitaba un cuadro de dialogo, donde el personaje realizara algunas indicaciones al jugador a manera de comentarios alentadores. Agregué también las ventanas de pausa y las ventanas de completado y eliminado, que dan opciones al jugador para continuar, reiniciar o salir del nivel. Listo, ya falta muy poco para terminar, ahora me tenia que ocupar en respaldar la información del jugador, cuando el jugador concluye un nivel satisfactoriamente, se tiene que guardar el tiempo que tardo en completarla y el apodo del jugador para tener un registro y luego mostrarlo en una tabla de posiciones que se desarrollará más adelante. Para esto usé *Firebase Realtime Database,* por el motivo de que quería hacerlo multiplataforma, y *Firebase* no tenia problemas para que funcione en dispositivos móviles*.* Me dediqué a buscar ejemplos de como podría incorporarlo a mi proyecto de *Unity,* a la vez que empece a leer la documentación de *Firebase.* Por último, tenia que realizar una pantalla inicial para dar la bienvenida al jugador, en este se puede escoger un personaje y en un futuro escoger un nivel, además de poder visualizar la tabla de posiciones según el nivel seleccionado. Hasta el momento parece que ya no faltaba nada, pero es lo que aparentaba, en realidad tenía que realizar muchos ajustes, y hacer las pruebas correspondientes. Lo que faltaba para concluir Enumeraré los puntos mas importante que faltaban y pude resolver para su publicación: Quería que existiera una opción de cambiar idioma, para que el juego tuviera un mayor alcance, en este caso use el paquete *Localization Tables* de *Unity.* Fue tedioso mapear todos los lugares donde había un texto, pero no fue complicado. Al movernos por los botones en la pantalla inicial no seguían un orden. Me faltaba agregar efectos de sonido y efectos visuales a los botones. Si bien yo entendía el juego, el jugador que por primera vez empezaba a jugar no entendía el objetivo y las reglas de este. Agregué una ventana inicial a manera de tutorial que por medio de imágenes y algunos textos lo explicaba. Agregué el efecto de *Parallax Scrolling* en el nivel que al momento de que el personaje se mueve en este, da la impresión de que hay un fondo muy lejano que se mueve a otro ritmo, dándole profundidad. Agregar un temporizador para el tiempo que dura un objeto potenciador, esto permite que el jugador calcule mejor el tiempo de duración. Y algunos *bugs* que encontraba en las colisiones de los ataques, los saltos del personaje y los mensajes mostrados. La publicación Quería publicar el proyecto para *Windows*, *Linux* y para el navegador. Exportar el proyecto no fue difícil, ya que *Unity* te da esta ventaja de multiplataforma, un golazo para *Unity.* Escogí *Itch.io* para hacer la publicación porque me gusta mucho su plataforma, además de ser los lugares mas conocidos para la publicación de videojuegos indie. ***Notas:*** *Actualmente el videojuego esta publicado y funcional, si llegaste hasta aquí y te interesa probarlo, te dejo un* *link**.* https://kalawasacraft.itch.io/superame *Tengo pensado agregar un par de niveles mas, un nos 3 personajes adicionales, ademas de que en cada nivel agregare algo característico.*

+1 more

@kalawasa

Mi primer juego, mi primera prueba #3 Las primeras ideas Muchos de los que empezamos a desarrollar videojuegos con ilusión tenemos en la cabeza ideas muy desordenas (obviamente no aplica a todos, algunos ya saben exactamente lo que quieren, pero no es mi caso). Mi cabeza era un nido de ideas, entre todas ellas, las que más me emocionaban (porque esa es la palabra, siento eso mientras imagino como podría ser un juego hecho por mi, con características y mecánicas nada innovadoras, pero con mi sello) tenían algo en común, darle la satisfacción al jugador de haber resuelto y/o completado, un puzzle, un desafio y/o una competencia. Mis primeras ideas no fueron juegos concretos sino características que me gustan de los juegos, a continuación menciono algunos: Dar logros a los jugadores por ciertas acciones dentro de un juego de aventura, podría ser una lista de logros por completar y otros logros que no están dentro de esta. Esto me fascino de *Genshin Impact*. Desafíos contra el reloj que puede clasificar al jugador en un listado con los mejores tiempos. Si bien me gusta mucho, sera difícil darle al jugador algo que lo considere un reto (prueba y error, en mi caso sera una manera de abordarlo). Y los puzzles que son tan geniales cuando entiendes las mecánicas, para luego idear una solución potencialmente ganadora. Estos son los que mas satisfacción me dan al resolverlos. Ahora, teniendo las ideas sobre la mesa me decanto por la segunda, ampliando un poco más la idea, sería lo siguiente: *Un juego de recolección en contra del reloj, con enemigos para darle dificultad, donde el personaje puede morir y no terminar el desafió, con las opciones de selección de personajes y mapas, todo esto en formato 2D y con estéticas Pixel Art.* Lo de prueba y error sera muy constante en todo esta aventura, ¿qué me falta ahora?. Ya se, me falta conocer lo que puedo y no puedo hacer, hasta ese momento estaba muy emocionado de hacer muchas cosas, pero la emoción no te deja ver la realidad. Tengo que podar todo este árbol de ideas, hacer un recuento, un MVP (Producto Mínimo Viable) según mis capacidades. ¡Vamos por ello! Detallando las características del juego Puse todas las características que se me ocurrieron en una pizarra con el propósito de diferenciar cuales son de importancia y cuales puedo realizar sin perder la coherencia y sentido en el juego. Los clasifique en: imprescindibles, se puede prescindir pero aportan personalidad, y los totalmente prescindibles. **Imprescindibles:** **Menú de selección de personaje y mapa**, en mi caso es la pantalla inicial la que da la bienvenida al jugador. (**✓**) **Sistema de movimientos mínimos para el personaje**, en mi caso serian: correr, saltar y atacar. (**✓**) **Enemigos y sistema de vida para el personaje**, es para darle a entender al jugador que puede ser derrotado. (**✓**) **Sistema de movimiento para enemigos**, en mi caso serian: caminar y atacar. (**✓**) **Sistema de tiempo (Timer)**, permite saber al jugador cuanto le costo completar el desafió. (**✓**) **Objectos/Items de Recolección**, sin este el juego propuesto no tiene sentido. (**✓**) **Diferentes rutas de recolección en el mapa**, le dará al jugador la opción de poder elegir y combinar caminos para lograr el menor tiempo posible. (**✓**) **Movimiento fluido de la cámara**, el jugador se sentirá a gusto al observar que las acciones del personaje siempre serán enfocadas. (**✓**) **Prescindibles con personalidad** **Selector de idioma**, es importante ampliar el universo de jugadores que pueden acceder a tu juego. (**✓**) **Ventana de ayuda,** mostrará diferentes imágenes que expliquen lo mínimo para entender el juego (a veces es mejor que el mismo juego se explique en el proceso, pero esto no es sencillo). (**✓**) **Listado de jugadores con mejor puntuación/tiempo para cada mapa**, el juego puede permitirse no tenerlo, pero el jugador no tendrá una motivación para seguir intentado. Este punto esta aquí, porque sin este el juego aun puede ser funcional. (**✓**) **Artefactos de ayuda para el personaje**, permitirán al personaje potenciar habilidades por un tiempo corto, pueden ser defensa infinita, ataque infinito o recuperación de vida. (**✓**) **Efecto Parallax**, da la sensación de profundidad a un mapa, los fondos que son los que no intercaran con el personaje se mueven a una velocidad diferente. (**✓**) **Música y efectos de sonido**, actualmente no existe juegos que no ganen personalidad con la música y los efectos. (**✓**) **Totalmente prescindibles** **Menú de configuración de controles y sonido**, se puede tener una configuración por defecto que no altere el flujo del juego. **Diferentes tipos de características a cada personaje**, si bien enriquecería la experiencia, tenemos que tener el cuenta el tiempo que esto podría afectar en desarrollar la animación y la interacción de cada personaje con su entorno. **Animaciones de objectos y construcciones que no participan con el personaje**, pueden sumar a la experiencia, pero un gasto innecesario para nuestro MVP. De todas estas características las que se marcaron con (**✓**) serán las tareas necesarias para tener un juego funcional mínimo para mis expectativas. Entendiendo mis capacidades Teniendo mas claro las características, podemos decir que estamos un paso mas preparados para comenzar. Veamos ahora que habilidades necesito para desarrollar el juego, y cuales necesito aprender. **Habilidades Aprendidas** Programación, si sabes programar puede aprender cualquier lenguaje sin mucho esfuerzo. Ingles, lo mínimo es lo básico del idioma para poder entender la documentación y/o tutoriales. **Habilidades por Aprender** Manejo de un motor para desarrollo de videojuegos, como *Unity, Godot, Unreal Engine, etc.* Animación en Pixel Art, muy importante y esencial para el tipo de juego que se planteó. Creación de banda sonora y efectos de sonido, es posible encontrar trabajos libres de derecho de autor, pero me propuse aprender para ganar una habilidad mas que me servirá a futuro. ¿Qué necesito para comenzar? Primero, una computadora con los requerimientos básicos para poder usar el motor de videjojuego, en especial tener siempre presente las características del procesador, la RAM y la tarjeta de vídeo. Segundo, elegir un motor de videojuegos, siempre pensado que será el que te acompañe en futuros proyectos hasta que decidas cambiar. Tercero, una herramienta para la creación y animación de Pixel Art, como *Aseprite o Piskel.* Ahora, pensemos en otras herramientas que podrían ser útiles y que no están directamente en la linea del desarrollo de videojuegos. Entre estos tenemos, un herramienta para realizar anotaciones, como una pizarra, un bloc de notas, una aplicación, entro otros. También un lugar y/o ambiente de trabajo ordenado porque sera donde surjan las ideas y los debates de como va el desarrollo. Yo considero esencial lo anteriormente mencionado, se puede agregar muchas cosas mas, pero ya no me quiero extender. Uf, fue un gran proceso el poner todas estas ideas en esta publicación. ***Notas:*** *Las características mencionadas son un gran punto de partida que nos da un norte hacia donde queremos llevar nuestro juego.* *No nos olvidemos que yo estoy siguiendo mi propio proceso en desarrollar videojuegos. Prueba y error, no me cansare de repetirlo.*

@kalawasa

Empezar por ordenar #2 Ahora vamos con el plan, por ahora diría que está desordenado, trabajaré con prueba y error. Antes que nada, antes que todo ¿Qué antecedentes tengo con el orden?, no muy buenos. Anteriormente he probado trabajar con un horario, no puedo con ese ritmo, empiezo bien la primera semana, pero luego el mas mínimo cambio que pueda surgir malogra todo lo planificado, puede parecer muy extremo, pero no puedo evitarlo, no se muy bien como explicarlo. Así que lo descarto. También probé con un Tracker, es mas, hice mi propio seguidor de tiempo a mi medida, me fue bien con él un mes, esta vez ya no me preocupaba por el intervalo de tiempo que hay que cumplir por cada tarea, sino por la tarea, y al final de la semana miraba las estadísticas acumuladas. Se preguntaran que salio mal, es de risas esta situación, al menos yo me reí bastante. Al tratar de seguir todo mi tiempo de las tareas productivas como no productivas (claro, las más relevantes) en el acumulado eran prácticamente iguales, la libertad que me dio hacerlo de esta manera jugó en mi contra. Si usted esta leyendo esto, quizás tenga otro método de como ordenar el tiempo que le funcionó para ser productivo, sin llegar a extremos claro esta. Me puede servir a mi o a otra persona que llegue a pasar por aquí, mientras tanto seguiré exponiendo este caso muy problemático para este servidor. Entonces, ¿ahora que?. El punto medio, punto de inicio Después de darle vueltas a este asunto, lo que estaba pensando era planificar en cada día lo que haré el día siguiente, imponiéndome un objetivo, debe ser muy claro como para poder estimar que se puede resolver en un día, parece sencillo, pero ahora dejemos el caso ideal, ¿qué pasa si no se cumple este objetivo?, no necesariamente es un solo objetivo, pueden ser varios en diferentes ámbitos, ¿podré cumplir con todos ellos?, no me cansaré de hacer esto todos los días, ¿que pasa si un día no defino el objetivo del día siguiente?, bueno, seguro puedo seguir encontrando más casos en los que puede fallar, pero es porque yo se hacer eso, buscar excusas. Respondamos las preguntas anteriores: ¿Qué pasa si no se cumple el objetivo diario?, podemos continuar la tarea al día siguiente o dejarlo congelado para retomarlo, esto sera evaluado en la planificación de cada día (tengo el presentimiento que pasará muy seguido). ¿Qué pasa si no se cumplen con todas las tareas programadas para ese día?, apliquemos lo mencionado anteriormente en la planificación. ¿Que pasa si un día no defino el/los objetivo/tareas del día siguiente?, tenemos dos casos: el primero, tenemos tareas no concluidas de otros días, podemos continuar con estas. El segundo, no tenemos ninguna tarea pendiente (genial, tenemos un día libre, vayamos de paseo al campo, uhhh, maratón de películas), si bien no es mala idea un descanso, hagamos un recuento de lo que se ha conseguido, ¿cómo se ha llevado hasta el momento?, ¿qué no esta funcionando?, ¿qué debemos cambiar?, en otras palabras, reorganicemos. Por cierto esto también se puede hacerse de forma planeada (no lo tomemos tan literal). Vamos a la siguiente parte, traslademos esto a algo un poco más formal. **Ventajas:** **Divide y vencerás.** Dividir grandes tareas en otras mas pequeñas, es mucho más sencillo cumplir con estas ultimas (siempre avanzaremos), puedes aplicarlo a casi cualquier cosa que hagas. **Una planificación sencilla del día a día.** En teoría sera sencillo planificar lo que se hará el día siguiente, es la continuación de lo que hiciste hoy (digo en teoría porque estoy por comprobarlo). **Generar hábitos.** Si realizamos actividades o tareas que se repiten día a día, vendrán siendo rutinarias, nos podemos cansar de esto, pero a partir de eso también podemos generar buenos hábitos (¿estaré un poco mas cerca de ser disciplinado?, siento que falta mucho más). **Flexibilidad.** Estaba dudando si ponerlo como desventaja, porque podemos abusar de esto y dejar para mañana lo que podemos hacer hoy (pero creo que es una cuestión más de compromiso, y no tiene que ver con este punto). La flexibilidad nos permite variar la cantidad y diversidad de tareas (es una gran ventaja, no siempre nos sentiremos capaces o con ánimos de ser productivos al 100%). **Desventajas:** **No estimar con precisión el tiempo total de todo un proyecto o un trabajo.** Esto es más critico si lo que se piensa hacer tiene plazos y se debe tener resuelto en un tiempo preciso (por suerte por ahora no es mi caso). **Aplazar las tareas no concluidas.** Podemos caer en la trampa de dejar tareas no concluidas para el día siguiente, y volver hacerlo al día siguiente (estaré muy atento a no caer en esto). **No poder observar todo el panorama.** Esta relacionado con la primera desventaja, esta claro que no conocemos todo el espectro, tenemos una idea, vivimos el día a día, así es la manera como lo planteamos. Si encuentra alguna ventaja o desventaja más, estaré gustoso de leerlo. ¿Qué debo ordenar? Seré breve para este punto, haré un listado de las tareas generales con las que iniciaré: **Proyecto videojuego,** es general porque aplicaría a cada proyecto que realice, comenzare hacerlo de manera lineal y no simultaneo, en otras palabras un videojuego a la vez. **Aprendizaje del ingles,** será rutinario, espero convertirlo en un buen habito. **Rutinas de entrenamiento,** llevar una vida saludable, primero con el ejercicio, y luego paulatinamente empezaré con la alimentación. **Redacción de artículos/blogs,** en este sitio obviamente. Otros: Curso de piano y programación competitiva. Los incluiré con el tiempo, primero tengo que evaluar como progreso. Lo ideal, ir de menos a más Empezaré con la planificación diaria de las primeras 4 tareas, obteniendo tareas mas pequeñas de cada una (no necesariamente todas estén incluidas en cada día, tengo que evaluarlo, es *flexible*), se evaluaran tareas hechas en el día, para dar pie a la nuevas tareas, posponer las tareas no resueltas o darle continuación. Este será el **Tiempo de Planificación.** Habrá un tiempo, posiblemente quincenal para reorganizar, evaluar el progreso, realizar cambio si son necesarios. Le llamaré **Tiempo de Ganancia.** Incluir nuevas tareas dependerá del **Tiempo de Ganancia,** si es positivo podremos dar luz verde para hacerlo, en caso contrario, seguirá en la lista de espera. Esta ultima parte aun será desarrollada, con el tiempo lo iré puliendo. ***Notas:*** *Después de leerlo me doy cuenta que tiene similitud con el SCRUM, una metodología ágil para mejorar el trabajo colaborativo.* *Todo lo mencionado aquí todavía es un borrador, pero me ha ayudado a ordenarme, creo que es una buena señal.*

@kalawasa

Hoy me siento motivado #1 Quiero hacer un recuento y seguimiento de como progreso en todo lo que les voy a contar, también pido disculpas si no llego a expresarme correctamente, es parte de esto. Por cierto esto podría ser un gran éxito o un completo fracaso que sera olvidado como muchas cosas sin importancia pero el primer aprendizaje de gran importancia para mi. ¿Por donde empezar? Bueno, para comenzar no soy nada especial (¿por ahora?), ya superé los 30 años, vivo con mis padres, no me considero una persona madura (esto me hace acordar que hace 5 años me preguntaron si era maduro, y dije que si, como es que estaba tan errado), no tengo experiencias que me marquen, se podría decir que en todo este tiempo no tuve grandes preocupaciones. Me la lleve fácil, para que mentir. Acabe la universidad sin gloria pero con esfuerzo a los 30 (estudié Computer Science), trabajé un par de años en desarrollo web, los desafíos fueron grandes pero con el tiempo se hicieron rutinarios. En otras palabras me cansé del trabajo (justo al terminar de escribir esta parte se me esta yendo la motivación). A lo que iba Si, la motivación, a eso iba. Ayer vi un vídeo de Dross (me gusta como expresa sus ideas, no necesariamente sus ideas) y hablaba sobre como adelgazó y porque lo hizo, lo de siempre ¿no?, algo te motiva y te dura unos días y regresas a lo mismo. He caído en ese bucle muchas veces, pero entonces, vino a mi cabeza lo que me dijo mi ex jefe/amigo del trabajo que comenté párrafos atrás. **Ser disciplinado es esencial para todo lo que te propongas.** Y bueno, quiero cultivarme y empezar de una vez, tengo metas que quiero cumplir y no arrepentirme de no haberlo intentado. Estoy luchando con imponerme hábitos que a la larga puedan ser herramientas y ser parte de mi disciplina, agarrarme de las veces que encuentre motivación, ver como canalizar ese estado, hacer un trueque de motivación por hábitos. **La motivación es volátil, la disciplina no.** ¿Qué me detiene? He identificado patrones, les explico: Tengo temor, y muchas veces esto me a detenido a siquiera levantar un dedo. No tener hábitos sólidos, esto desencadena que sea muy fácil que empiece a procrastinar. Yo mismo, en este momento estoy pensando en dejar de escribir, porque me viene a la cabeza que este tiempo lo podría usar para programar o seguir practicando mi ingles, y que esto no sirve de nada, ¿a quien le podría interesar?. Pero este pensamiento esta disfrazado, seguramente me ponga a ver un vídeo o distraiga mi mente en alguna banalidad. Si llegué a publicar esto es porque me decidí en continuar, creo que es algo. ¿Qué quiero lograr? No quiero abandonar la lista que viene a continuación. Estoy empezando en el rubro de los videojuegos, seguí un curso hace 3 meses (quizás lo pensaste, pero si, ya no trabajo de manera dependiente, este sera mi trabajo), ¿y que creen?, mi avance fue muy lento, y no es por falta de tiempo, es porque al día dedicaba la mitad de mi tiempo en ver videos, series, anime, y no es que este mal, pero cada cosa tiene su momento, y aun sabiendo eso, que difícil es no caer. Estoy a la mitad de mi primer videojuego y quiero terminarlo antes de que pase un mes. Quiero dedicarme a esto, sera muy difícil seguir el camino de Desarrollador de Videojuegos Indie, pero voy con fe!. Quiero llevar una vida saludable, hacer ejercicio, hacerlo un habito. Creo que sera lo más difícil, tengo sobrepeso y esto afecta en mi autoestima, aunque me diga que no debería ser así. Mantener a mis padres, en otras palabras ser el principal soporte económico de mi familia, ellos se han sacrificado mucho por mi, y tengo que retribuir ese amor. No dejar de publicar en esta plataforma, no será diario, pero esto sera prueba de mi compromiso. ***Notas:*** *Si llegaste hasta aquí, ya debes tener una idea de que quiero hacer, siento que aun no expreso bien todo lo que busco.* *También prometo que en próximas publicaciones lo haré más ameno y menos denso.* Con fe, vamos paso a paso.