50 lines
865 B
Go
50 lines
865 B
Go
|
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
|
||
|
}
|