Here is a selection of my open-source projects. All the code lives on GitHub — take a look, clone it or open it for inspiration.
Minecraft Plugins
Three Paper 1.21 server plugins: a central lobby, a co-op roguelike maze (MazeRunner) and a SkyBlock with economy (SkyIslands).
- Java 21
- Paper 1.21
- Gradle
- SQLite
Only Games
A collection of arcade mini-games playable in the browser (Snake, Maze, Tanks) with local multiplayer for up to 4 players.
- Next.js 16
- React 19
- TypeScript
- Tailwind
A peek at the code
Funnily enough, both projects share the same maze-generation algorithm —recursive backtracking— but in different languages. Same idea, two worlds:
Only Games — maze in TypeScript
ts
// Recursive backtracking: carve a perfect maze
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 — maze in Java
java
// Recursive backtracking (iterative DFS to avoid a stack overflow)
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;
}
Want to see more? All my open-source code is on my GitHub profile.