diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/algs.lua | 96 | 
1 files changed, 60 insertions, 36 deletions
| diff --git a/include/algs.lua b/include/algs.lua index ad0016a..2541102 100644 --- a/include/algs.lua +++ b/include/algs.lua @@ -1,6 +1,24 @@  require "include.constants"  local Queue = require "include.queue" +---@param map table +local function print_map(map) +    for i = 1, #map do +        row = map[i] +        line = "" +        for j = 1, #row do +            if row[j] == MAP_WALL then +                line = line .. "# " +            elseif row[j] == MAP_VISITED then +                line = line .. "x " +            else +                line = line .. "  " +            end +        end +        print(line) +    end +end +  local function can_move(x, y, map)      return map[y][x] == MAP_SPACE  end @@ -10,43 +28,62 @@ end  ---@param origin table  ---@param map table  ---@param queue table -local function push_moves(x, y, origin, map, queue) +---@return boolean found goal +local function push_moves(x, y, origin, map, queue, target_pos) +    map[y][x] = MAP_VISITED -- should be but just in case      -- UP -    if can_move(x, y -1, map) then -        queue:push({ +    if can_move(x, y - 1, map) then +        pos = {              x = x,              y = y - 1,              origin = origin -        }) -        map[y-1][x] = MAP_VISITED +        } +        map[pos.y][pos.x] = MAP_VISITED +        if (pos.x == target_pos.x and pos.y == target_pos.y) then +            return true +        end +        queue:push(pos)      end      -- DOWN -    if can_move(x, y +1, map) then -        queue:push({ +    if can_move(x, y + 1, map) then +        pos = {              x = x,              y = y + 1,              origin = origin -        }) -        map[y+1][x] = MAP_VISITED +        } +        map[pos.y][pos.x] = MAP_VISITED +        if (pos.x == target_pos.x and pos.y == target_pos.y) then +            return true +        end +        queue:push(pos)      end      -- LEFT      if can_move(x - 1, y, map) then -        queue:push({ +        pos = {              x = x - 1,              y = y,              origin = origin -        }) -        map[y][x - 1] = MAP_VISITED +        } +        map[pos.y][pos.x] = MAP_VISITED +        if (pos.x == target_pos.x and pos.y == target_pos.y) then +            return true +        end +        queue:push(pos)      end      -- RIGHT      if can_move(x + 1, y, map) then -        queue:push({ +        pos = {              x = x + 1,              y = y,              origin = origin -        }) -        map[y][x+1] = MAP_VISITED +        } +        map[pos.y][pos.x] = MAP_VISITED +        if (pos.x == target_pos.x and pos.y == target_pos.y) then +            return true +        end +        queue:push(pos)      end +    return false  end  --- @@ -66,32 +103,19 @@ local function pathfind(start_pos, target_pos, map)          visit_map[k] = row      end -    push_moves(start_pos.x, start_pos.y, nil, visit_map, queue) +    if (push_moves(start_pos.x, start_pos.y, nil, visit_map, queue, target_pos)) then +        return { dx = start_pos.x - target_pos.x, dy = start_pos.y - target_pos.y } +    end +      while queue:empty() ~= true do          local pos = queue:pop() -        if (pos.x == target_pos.x and pos.y == target_pos.y) then -            return { dx = pos.origin.x - start_pos.x, dy = pos.origin.y - start_pos.y } -        end          origin = pos.origin or { x = pos.x, y = pos.y } -        push_moves(pos.x, pos.y, origin, map, queue) -    end -    return { dx = 0, dy = 0 } -end - ----@param map table -local function print_map(map) -    for i = 1, #map do -        row = map[i] -        line = "" -        for j = 1, #row do -            if row[j] == MAP_WALL then -                line = line .. "# " -            else -                line = line .. "  " -            end +        hit_target = push_moves(pos.x, pos.y, origin, visit_map, queue, target_pos) +        if hit_target then +            return { dx = origin.x - start_pos.x, dy = origin.y - start_pos.y }          end -        print(line)      end +    return { dx = 0, dy = 0 }  end  return { |