package main type Coordinate struct { X, Y int } var offsets = []Coordinate{ {0, -1}, {-1, 0}, {1, 0}, {0, 1}, } type Map map[int]map[int]*Tile func (m Map) SetTile(t *Tile, x, y int) { if m[y] == nil { m[y] = make(map[int]*Tile) } m[y][x] = t t.X = x t.Y = y t.Map = m } func (m Map) Tile(x, y int) *Tile { if m[y] == nil { return nil } return m[y][x] } func (m Map) FindWalkableTiles(t *Tile) (map[*Tile]int, map[*Tile]*Tile) { frontier := []*Tile{t} distance := map[*Tile]int{t: 0} cameFrom := map[*Tile]*Tile{t: nil} for len(frontier) > 0 { current := frontier[0] frontier = frontier[1:] for _, next := range current.WalkableNeighbors() { if _, ok := distance[next]; !ok { frontier = append(frontier, next) distance[next] = distance[current] + 1 cameFrom[next] = current } } } return distance, cameFrom }