Algoritmo de búsqueda A* (A Estrella)

Implementación del algoritmo de búsqueda A* o A Estrella en Javascript.

Demo

Ejemplo de uso:

let grid = new Table(cols, rows);

  ...  // Llenar tablero

const astar = new AStar(grid);

Para instanciar la clase AStar debemos pasarle al constructor una implementación de la clase Grid, en la que se representan los obstáculos del tablero. (Ver Table como referencia de implementación).

let n1 = grid.getNode(x1, y1); // Obtenemos el nodo 1 en la posición x1, y1
let n2 = grid.getNode(x2, y2); // Obtenemos el nodo 2 en la posición x2, y2

const route = astar.route(n1, n2); // Cálculo del camino más corto

Finalmente, obtenemos el camino más corto entre dos puntos invocando el método route de astar, pasando como parámetros los nodos que representan dichos puntos.

Si la ruta es accesible se retorna un arreglo con las posiciones que conforman el camino, de lo contrario se retorna null.

Código fuente

Este es el código fuente del proyecto:

https://github.com/sergiss/a-start

Simon JS

El otro día implementé esta versión del juego Simon en Javascript (Vanilla JS)

Aunque no necesita de muchas presentaciones, Simon es un juego electrónico creado por Ralph Baer y Howard J. Morrison en 1978 y que tuvo gran éxito durante los 80.

El juego consiste en repetir correctamente la secuencia de colores y sonidos planteada. Una vez repetida, la secuencia se incrementa en un valor aleatorio. Iterando la mecánica hasta que el jugador cometa un error.

Demo

Código fuente

Este es el código fuente del proyecto:

https://github.com/sergiss/simon

Puedes visitar el pequeño engine que desarrollé para juegos web 2D.

Desarrollo de un editor de niveles 3D

Esta es la continuación de la entrada Desarrollo de un editor de niveles 2D, en esta ocasión presento la aplicación que he desarrollado para crear escenarios en 3D con estética viejuna.

Level Editor 3D - Sergio Soriano

Está desarrollado en Java y utiliza OpenGL para la renderización de gráficos, en concreto el framework LibGDX.

Funcionalidades

Menú de opciones  - Sergio Soriano
  • 1.) Crear nuevo documento: Abre el asistente para la creación de un nivel nuevo.
  • 2.) Cargar documento: Muestra el selector de archivos para cargar un nivel existente en el árbol de directorios.
  • 3.) Guardar cambios: Guarda el nivel en disco.
  • 4.) Undo/Redo: Deshace o repite los cambios acumulados.

Herramientas de edición

Herramientas de edición - Sergio Soriano
  • Blocks: En esta sección se muestra la información del bloque seleccionado. Entre otros se podrá elegir la geometría del mismo, así como la textura de las diferentes caras.
  • Entities: Este apartado permite añadir modelos 3d a la escena. Como requisitos los modelos deben de estar en formato .g3db (LibGDX binary data). Permitiendo personalizar la rotación y la escala del mismo.
  • Decals: Los decals (calcomanías) son objetos/personajes en 2.5D, es decir objetos en 2 dimensiones que se pueden mover en los ejes x, y, z y que siempre miran hacia la cámara. Dando la sensación de pseudo-3d.
  • Environtment: Se configuran la iluminación ambiente y los diferentes puntos de luz que se deseen añadir a la escena, pudiendo configurar el color y la intensidad. Por último también se puede añadir el fondo del escenario (skybox).
  • Tools: Entre otros, he implementado opciones de creación de zonas para poder lanzar eventos durante el juego, herramientas de generación de calles, etc…

Código Fuente:

https://github.com/sergiss/level-editor-3d

Copyright O’matic

¿Cansad@ de introducir lincencias en los encabezados de tu código fuente? ¿Has escrito un programa con 100 billones de lineas, 362 mil paquetes y 1001 test unitarios, quieres compartir tu código, pero te das cuenta que se te ha olvidado poner encabezados....? 🤡

Tras instalar una nueva versión de Eclipse y tenerlo ya todo apunto para picar código, me he encontrado con la sorpresa que el plugin para añadir y gestionar copyrights que suelo utilizar, ya no estaba soportado. Así que me he puesto manos a la obra y he codificado este pequeño programa para tenerlo a mano.

copyright o'matic - Sergio Soriano
copyright o’matic

El programa consiste en un diálogo, donde en primer lugar se debe introducir el texto que se quiere insertar en el encabezado de los ficheros. Seguidamente se debe seleccionar el directorio donde están los ficheros (código fuente, notas, etc.) e indicar si se quiere recorrer todo el árbol de directorios a partir del mismo (subfolders). Finalmente se indican las extensiones de los ficheros, separadas por comas, que se quieren procesar, y si queremos restringir las coincidencias con mayúsculas y minúsculas (Match Case).

Cuando todo esté listo procedemos con el botón «Perform».

Código Fuente

https://github.com/sergiss/copyright-o-matic

Desarrollo de un Editor de niveles en 2D

Una de las herramientas más utilizadas a la hora de desarrollar videojuegos, sobre todo en aquellos en los que necesitamos representar un mundo abierto o escenarios, es el editor de niveles.

Llegados a este punto tendremos que elegir entre utilizar recursos ya existentes (como los proporcionados por el framework que se esté utilizando, o editores de pago/código abierto, como por ejemplo Tiled), o desarroyar nuestro propio editor. Personalmente recomiendo utilizar los recursos existentes, ya que avanzaremos mucho mas rápido en nuestros proyectos. Pero si por el contrario, queremos saber como se realiza este tipo de herramientas, o bien, es un requisitos del proyecto, tendremos que desarrollar nuestro propio editor de niveles.

Este es el que yo he desarrollado:

Editor de niveles 2D - Sergio Soriano

Funcionalidades

Herramientas:

Tools - Sergio Soriano
  • 1.) Crear nuevo documento: Abre el asistente para la creación de un nivel nuevo.
  • 2.) Cargar documento: Muestra el selector de archivos para cargar un nivel existente en el árbol de directorios.
  • 3.) Guardar cambios: Guarda el nivel en disco.
  • 4.) Undo/Redo: Deshace o repite los cambios acumulados.
  • 5.) Pincel: Dibuja el ‘tile’ escogido en las coordenadas seleccionadas del mapa.
  • 6.) Bote de Pintura: Rellena la superficie seleccionada con el ‘tile’ escogido.
  • 7.) Borrador: Borra el ‘tile’ escogido.
  • 8.) Cuenta gotas: Identifica y selecciona el ‘tile’ que ocupa las coordenadas seleccionadas del mapa.
  • 9.) Dibujar póligono: Habilita el modo de dibujado libre de polígonos para la detección de colisiones.
  • 10.) Dibujar círculo: Habilita el modo de dibujado de circulos para la detección de colisiones.
  • 11.) Selección de vertices: Permite la selección de vertices entre los poligonos existentes en la capa seleccionada.
  • 12.) Habilita la visualización de la rejilla.
  • 13.) Habilita la visualización de polígonos de colisión.

Layers: En esta sección se podrán gestionar las diferentes capas del nivel.

Layers - Sergio Soriano
Layers

Tileset: Es el conjunto de ‘tiles’ disponible.

Tileset - Sergio Soriano
Tileset

Conclusiones:

En esta entrada se ha mostrado de forma breve las funcionalidades básicas para el desarrollo de un editor de niveles para juegos en 2 dimensiones.

Espero que sea de utilidad como inspiración para cualquier proyecto.

Código Fuente:

https://github.com/sergiss/level-editor-2d

Buscaminas

Tomando como referencia el Buscaminas de Windows XP, he implementado este clon del juego inventado por Robert Donner en 1989.

Detalles de la implementación

Entre las diferentes acciones que tiene la mecánica de juego, cabe destacar, cuando el jugador realiza un ‘click’ en un área en la que no hay ninguna mina y que a su vez, tiene celdas vecinas vacías. Esta acción requiere que se descubran todas las celdas que no contienen minas, propagándose hasta encontrar una celda vecina que si contenga una mina a su alrededor.

Para ello he implementado un algoritmo iterativo de rellenado por difusión (floodfill), utilizando una cola de prioridad y evitando la vertiente recursiva. Ya que una implementación recursiva puede provocar una desbordamiento de memoria, debido a la cantidad de ramificaciones que se generan al recorrer los estados vecinos.

Minesweeper Game - Sergio Soriano

Por lo demás es un juego fácil de implementar, en que he optado prescindir del elemento Canvas (por ninguna razón en especial), utilizando 100% elementos HTML y estilos CSS para la representación gráfica, y claro está, Javascript para la lógica.

Código Fuente

https://github.com/sergiss/minesweeper

Generador de arte ASCII

Conversor de imagen a texto, en el que se realiza una representación de una imagen en código ASCII.

ascii-art Dragon Ball - Sergio Soriano

En resumen la conversión consiste en iterar los píxeles de la imagen y operando del siguiente modo:

  1. Pasamos el píxel actual escala de grises. Para ello sumamos los componentes RGB y dividimos entre 3, obteniendo la media de color.
grayscale = (red + green + blue) / 3;

2. Teniendo en cuenta que la variable grayscale tendrá un valor entre 0 y 255, hay que encontrar una representación de estos valores con caracteres. Una forma de hacer esto, es crear un array o cadena de texto, el cual se almacene los caracteres ordenados por densidad de píxeles. Como ejemplo podemos ver que la letra ‘O’ tiene más pixeles que el signo de puntuación ‘.’, por lo que la letra ‘O’ estaría almacenada antes que el signo de puntuación ‘.’.

A continuación se muestra una secuencia de caracteres que funciona bastante bien, para este menester:

characters = '#####********+++++++++=========--------:::::::::..';

3. Finalmente almacenamos o representamos en pantalla el carácter calculado:

character = characters[(characters.length - 1) * (grayscale / 255)];

Código Fuente

https://github.com/sergiss/image-ascii

CHIP 8

Implementación en Javascript del interprete CHIP-8.

CHIP-8 is an interpreted programming language, developed by Joseph Weisbecker. It was initially used on the COSMAC VIP and Telmac 1800 8-bit microcomputers in the mid-1970s. CHIP-8 programs are run on a CHIP-8 virtual machine. It was made to allow video games to be more easily programmed for these computers

wikipedia

Live Demo

Chip-8 Space Invaders
Space Invaders

Código Fuente

https://github.com/sergiss/chip-8

Juego de puzzle Puyo Puyo

Ejemplo de implementación del juego Puyo Puyo usando HTML5 y Javascript.

El objetivo del juego es:

  • Se debe de hacer coincidir 4 puyos o más del mismo color para hacer que desaparezcan.
  • Generar el máximo de puntos luchando contra el incremento de velocidad.
  • El juego termina si el tablero se llena de puyos y no se pueden insertar más piezas.

Live Demo (CPU)

arrows = move, space = rotate

Características:

  • Inteligencia Artificial (modo CPU) para partida autónoma.
  • Algoritmo Flood fill para la detección de combinaciones de Puyos del mismo color.
  • Personalización de número de columnas y adatación dinamica de filas.
  • Generación aleatoria de estados de tablero.

Código Fuente

https://github.com/sergiss/puyo-puyo