Files
go-maze/mazer/maze.go
2026-02-25 21:42:14 +02:00

125 lines
2.3 KiB
Go

package mazer
import (
"math/rand/v2"
)
func GenerateMaze(width int, height int) {
// Init array
matrix := make([][]int, height)
// 2. Allocate each inner slice (width)
for i := range matrix {
matrix[i] = make([]int, width)
}
startPoint := rand.IntN(width + 1)
matrix[0][startPoint] = 1
// Start moving until out of moves
}
func pickRandomDirection(matrix [][]int, posX int, posY int) []int {
height := len(matrix)
if posY == height-1 {
return nil
}
validDirs := getValidDirections(matrix, posX, posY)
if len(validDirs) == 0 {
return []int{0, 1}
}
return validDirs[rand.IntN(len(validDirs))]
}
func getValidDirections(matrix [][]int, posX int, posY int) [][]int {
height := len(matrix)
width := len(matrix[0])
validDirs := make([][]int, 0, 4)
possibleDirs := [][]int{
{0, 1}, // Down
{-1, 0}, // Left
{1, 0}, // Right
{0, -1}, // Up
}
prevX, prevY, hasPrev := getPreviousPathCell(matrix, posX, posY)
if hasPrev && prevX == posX && prevY == posY+1 {
// If we just moved up, force the next step to be side/down (no repeated up).
possibleDirs = [][]int{
{-1, 0}, // Left
{1, 0}, // Right
{0, 1}, // Down
}
}
neighborDirs := [][]int{
{0, -1},
{0, 1},
{-1, 0},
{1, 0},
}
for _, dir := range possibleDirs {
newX := posX + dir[0]
newY := posY + dir[1]
if newX < 0 || newX >= width || newY < 0 || newY >= height {
continue
}
if matrix[newY][newX] == 1 {
continue
}
tooClose := false
for _, neighborDir := range neighborDirs {
neighborX := newX + neighborDir[0]
neighborY := newY + neighborDir[1]
if neighborX < 0 || neighborX >= width || neighborY < 0 || neighborY >= height {
continue
}
if neighborX == posX && neighborY == posY {
continue
}
if matrix[neighborY][neighborX] == 1 {
tooClose = true
break
}
}
if tooClose {
continue
}
validDirs = append(validDirs, dir)
}
return validDirs
}
func getPreviousPathCell(matrix [][]int, posX int, posY int) (int, int, bool) {
height := len(matrix)
width := len(matrix[0])
dirs := [][]int{
{0, -1},
{0, 1},
{-1, 0},
{1, 0},
}
for _, dir := range dirs {
x := posX + dir[0]
y := posY + dir[1]
if x < 0 || x >= width || y < 0 || y >= height {
continue
}
if matrix[y][x] == 1 {
return x, y, true
}
}
return 0, 0, false
}