見出し画像

Goで棒倒し法による迷路作成プログラム

棒倒し法を使用して迷路を作成するプログラムをGoで実装します。この手法では、壁で埋めたグリッドにランダムな通路を追加して迷路を生成します。

1. 棒倒し法の概要

棒倒し法のステップは次のとおりです。

  1. 壁で埋められたグリッドを用意します。

  2. 任意の位置からランダムな方向に「棒」を倒すことで通路を作成します。

特徴

  • ランダムに選択した方向に1マス分壁を壊すため、迷路に規則性が少なくなります。

2. 環境構築

Goの環境構築は、こちらを確認してください。

3. プログラム実装

maze.goという名前で以下のコードを保存してください。

package main

import (
	"fmt"
	"math/rand"
	"time"
)

type Maze struct {
	width  int
	height int
	grid   [][]rune
}

func NewMaze(width, height int) *Maze {
	grid := make([][]rune, height)
	for i := range grid {
		grid[i] = make([]rune, width)
		for j := range grid[i] {
			grid[i][j] = '#'
		}
	}
	return &Maze{width: width, height: height, grid: grid}
}

func (m *Maze) Generate() {
	for y := 1; y < m.height; y += 2 {
		for x := 1; x < m.width; x += 2 {
			m.grid[y][x] = ' '
			m.knockDownWall(x, y)
		}
	}

	// スタート地点とゴール地点を設定
	m.grid[1][1] = '☆' // スタート地点
	m.grid[m.height-2][m.width-2] = '☆' // ゴール地点
}

func (m *Maze) knockDownWall(x, y int) {
	directions := [][]int{}
	if x > 1 {
		directions = append(directions, []int{-1, 0}) // 左
	}
	if x < m.width-2 {
		directions = append(directions, []int{1, 0}) // 右
	}
	if y > 1 {
		directions = append(directions, []int{0, -1}) // 上
	}
	if y < m.height-2 {
		directions = append(directions, []int{0, 1}) // 下
	}

	if len(directions) > 0 {
		rand.Seed(time.Now().UnixNano())
		direction := directions[rand.Intn(len(directions))]
		m.grid[y+direction[1]][x+direction[0]] = ' '
	}
}

func (m *Maze) Print() {
	for _, row := range m.grid {
		fmt.Println(string(row))
	}
}

func main() {
	maze := NewMaze(21, 21) // 幅と高さは奇数
	maze.Generate()
	maze.Print()
}

4. 実行

以下のコマンドを使用してプログラムを実行します。

go run maze.go

コンソールに生成された迷路が出力されます。
実行するたびに新しい迷路が生まれます。

#####################
#☆      #   #   #   #
# # # ####### # # ###
# # # #       # #   #
# # ### # ### ### ###
# # # # #   # #   # #
# # # # ####### # # #
# #   # #   #   # # #
### ##### ######### #
# # #   # #   #   # #
# ##### ######### ###
#   # # #     #     #
##### # ##### ### # #
#     # #       # # #
####### ##### ##### #
#   #     # # #   # #
# # ####### ##### # #
#   #     # #   #   #
# # ### ### # #######
# # #       #      ☆#
#####################

まとめ

Goの実装を通じて、棒倒し法のシンプルなアルゴリズムを紹介しました。コードの応用や改良を試してみてください。

いいなと思ったら応援しよう!