Aquí tienes una selección de mis proyectos open source. Todo el código está publicado en GitHub — échale un vistazo, clónalo o ábrelo como inspiración.
Minecraft Plugins
Tres plugins para servidor Paper 1.21: un lobby central, un laberinto roguelike cooperativo (MazeRunner) y un SkyBlock con economía (SkyIslands).
- Java 21
- Paper 1.21
- Gradle
- SQLite
Only Games
Colección de minijuegos arcade jugables en el navegador (Snake, Laberinto, Tanques) con multijugador local hasta 4 jugadores.
- Next.js 16
- React 19
- TypeScript
- Tailwind
Un vistazo al código
Curiosamente, los dos proyectos comparten el mismo algoritmo de generación de laberintos —recursive backtracking— pero en lenguajes distintos. Mismo concepto, dos mundos:
Only Games — laberinto en TypeScript
ts
// Recursive backtracking: tallamos un laberinto perfecto
function carvePassage(maze: Maze, x: number, y: number, visited: boolean[][]) {
visited[y][x] = true;
for (const dir of shuffleArray(DIRECTIONS)) {
const nx = x + DX[dir];
const ny = y + DY[dir];
if (isValidCell(nx, ny, width, height) && !visited[ny][nx]) {
maze[y][x].walls[dir] = false;
maze[ny][nx].walls[OPPOSITE[dir]] = false;
carvePassage(maze, nx, ny, visited);
}
}
}
MazeRunner — laberinto en Java
java
// Recursive backtracking (DFS iterativo para no desbordar la pila)
public MazeGrid generate(int width, int height) {
MazeGrid grid = new MazeGrid(width, height);
boolean[][] visited = new boolean[width][height];
Deque<int[]> stack = new ArrayDeque<>();
stack.push(new int[]{0, 0});
visited[0][0] = true;
while (!stack.isEmpty()) {
int[] cur = stack.peek();
List<int[]> neighbors = unvisitedNeighbors(cur, visited);
if (neighbors.isEmpty()) {
stack.pop();
} else {
int[] next = neighbors.get(random.nextInt(neighbors.size()));
grid.openWall(cur[0], cur[1], next[0], next[1]);
visited[next[0]][next[1]] = true;
stack.push(next);
}
}
return grid;
}
¿Quieres ver más? Todo mi código abierto está en mi perfil de GitHub.