package main import ( "bufio" "fmt" "os" "time" helpers "git.bullercodeworks.com/brian/adventofcode/helpers" ) var maze *Maze func main() { file := "input" var manual bool if helpers.GetArgNumber(1) != "" { file = helpers.GetArgNumber(1) } if helpers.GetArgNumber(2) == "manual" { manual = true } maze = NewMaze(file) if manual { runmanual(maze) } part1() //part2(inp) } func part1() { maze.GetStart().steps = 0 ProcessNode(maze.GetStart(), 0) fmt.Println("Distance:", maze.GetEnd().steps) } func ProcessNode(m *MazeCoord, steps int) { fmt.Println("Processing Node", m) if maze.IsEnd(m.X, m.Y) { fmt.Println(" End") return } for _, neighbor := range []*MazeCoord{m.N, m.E, m.S, m.W} { if neighbor == nil { continue } if m.steps+1 < neighbor.steps { neighbor.steps = m.steps + 1 if !neighbor.visited { ProcessNode(neighbor, m.steps+1) } } } m.visited = true } func runmanual(m *Maze) { var err error var inp string m.Print() for { reader := bufio.NewReader(os.Stdin) inp, err = reader.ReadString('\n') if err != nil { fmt.Println("Input Error:", err.Error()) continue } var valid bool switch inp[0] { case 'N', 'n': valid = m.MoveNorth() case 'E', 'e': valid = m.MoveEast() case 'S', 's': valid = m.MoveSouth() case 'W', 'w': valid = m.MoveWest() case 'Q', 'q': fmt.Println("Quitting") break } fmt.Println(helpers.CLEAR_SCREEN) m.Print() if m.IsDone() { fmt.Println("DONE!") break } if !valid { fmt.Println("Invalid Move") } time.Sleep(time.Second / 2) } }