venantius / maze

Mazes for Programmers

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Overview

This repository includes code for generating and solving mazes. The algorithms included are taken from Mazes for Programmers, and have been translated here from their original Ruby to Go.

This README covers the basics of how to work with this library and what sort of output you can expect from it.

Grids

Grids are the basic "objects" of mazes. The general usage pattern is to create a grid and then to apply a maze generation algorithm to it. From there, you can run additional algorithms, for instance to determine the shortest or longest path from one point in the maze to another.

BaseGrid

The most basic type of grid in this library is a BaseGrid. You can see how it works as follows:

import (
    "maze.generator"
    "maze.model"
)

func main() {
    // first, we create a 5x5 BaseGrid.
    g := model.NewBaseGrid(5, 5);

    // Next, we apply the Sidewinder maze generation algorithm to it
    generator.Sidewinder(g);

    // Now, we print it as ASCII
    fmt.Println(g);
}

This will print something like the following to stdout:

+---+---+---+---+---+
|                   |
+   +---+   +   +---+
|       |   |       |
+   +   +---+   +---+
|   |       |       |
+   +   +---+   +---+
|   |   |           |
+---+   +   +---+---+
|       |           |
+---+---+---+---+---+

You can also generate a PNG image of the same grid using ToPNG:

filename := "sidewinder.png";
g.ToPNG(filename, 10);

This will generate an image that looks like the following:

DistanceGrid

If you want to see how far a given point is from another, you can use a DistanceGrid. In practice, DistanceGrid by itself isn't that interesting, but is a good foundation for gradient coloring later on.

The following example shows how you can use a DistanceGrid to determine the shortest path between any two points in a maze, using Djikstra's algorithm:

func main() {
    g := model.NewDistanceGrid(5, 5)

    // Apply the Binary Tree maze generation algorithm
    generator.BinaryTree(g)

    // Pick a random starting cell, or any cell you want.
    start := g.RandomCell();

    // Calculate the shortest path between the starting cell and all other cells.
    distances := start.Distances();
    g.SetDistances(distances);

    // Print to stdout.
    fmt.Println(g)
}

Note that distances will be measured in base36, meaning the 10th cell away from the starting point will be assigned an 'a', the 11th cell will be a 'b', etc.

+---+---+---+---+---+
| 3   2   3   4   5 |
+   +   +   +---+   +
| 4 | 1 | 4 | 7   6 |
+   +   +   +   +   +
| 5 | 0 | 5 | 8 | 7 |
+   +---+   +   +   +
| 6 | 7   6 | 9 | 8 |
+   +   +---+---+   +
| 7 | 8 | b   a   9 |
+---+---+---+---+---+

You can also extend our example to directly print the shortest path between two points, like so :

// Print the shortest distance between our random starting cell and the cell
// in the bottom-left
g.SetDistances(distances.PathTo(g.GetCell(g.GetRows() - 1, 0)));
fmt.Println(g);

This will print something like the following:

+---+---+---+---+---+
| 3   2             |
+   +   +   +---+   +
| 4 | 1 |   |       |
+   +   +   +   +   +
| 5 | 0 |   |   |   |
+   +---+   +   +   +
| 6 |       |   |   |
+   +   +---+---+   +
| 7 |   |           |
+---+---+---+---+---+

ColoredGrid

If you want to generate colored PNG images of your mazes, use the ColoredGrid struct instead of BaseGrid, like so

About

Mazes for Programmers


Languages

Language:Go 100.0%