使用Lua中的坐标表和基数出口查找最近的未访问出口

时间:2013-05-21 10:05:16

标签: lua maze

我正在尝试编写一个用于泥浆的lua脚本,我已经编写了一组脚本。泥浆最近开始发送房间坐标(,y和高度)以及可用的出口(东北南)。 我想编写一个脚本来跟踪访问过的出口,并找到离我目前所在房间最近的未访问出口: 我尝试在谷歌上咨询stackoverflow和许多其他网站,但到目前为止我没有找到答案,所以我尝试创建一个坐标表,它将跟踪坐标作为坐标的字符串放在一起由空格和内部保持记录的退出离开每个房间,然后设置一个叫做回溯的表,它会跟踪角色所做的所有动作以及它所进行的坐标,这样我们就能找到最近的出口。 但是这并没有解决我的问题,因为有时玩家会移动到不同的位置,而我为了找到最近的出口而建立的循环会被卡住或者没有得到任何有用的结果。

有没有人有这方面的经验或做过类似的事情?我对如何处理这个问题一无所知。 感谢。

1 个答案:

答案 0 :(得分:1)

“最近的未访问出口”是指“最近的房间有一个未经检查的出口”。

使用房间坐标,您可以构建2D地图。任何(x,y)图块都可以是以下三种类型之一:

类型2:访问过并访问过所有出口(表示为#)

类型1:使用未访问的出口访问(表示为X)

类型0:未访问(表示为空格)

例如:

  12345678
1
2 #X##
3    ###X
4      #
5     ##
6  X###
7    ###
8     X

从您在此地图中的位置开始,查找最近的未访问出口是一个简单的广度优先搜索问题。假设您代表地图的单元格,如下所示:

{
  x = 2,
  y = 2,
  type = 1,
  exits = {
    east = cell_east,
    west = cell_west,
  }
}

您可以写下这样的内容,以获得至少有一个未访问出口的最近房间列表:

local visited = {}
local visit = function(to_visit)
  if #to_visit == 0 then return nil end
  local next,found = {},{}
  for i=1,#to_visit do visited[#visited+1] = to_visit[i] end
  for _,cell in ipairs(to_visit) do
    if cell.type == 1 then
      found[#found+1] = cell
    elseif cell.type == 2 then
      for _,exit in pairs(cell.exits) do
        if exit.type > 0 then next[#next+1] = exit end
      end
    else
      error("something went wrong")
    end
  end
  if #found > 0 then
    return found
  else
    return visit(next)
  end
end

my_list = visit({current_cell})

这是未经测试的,不一定是解决问题的最优雅或最有效的方法,但它应该给你一个想法:)