-2

我正在尝试为我编写了一组脚本的泥编写一个 lua 脚本。泥最近已经开始发送房间坐标(y 和高度)以及可用的出口(东北南)。我想编写一个脚本来跟踪已访问的出口,并从我目前所在的房间中找到最近的未访问出口:我尝试咨询 stackoverflow 和谷歌上的许多其他网站,但到目前为止我没有找到答案,所以我尝试了创建一个坐标表,将坐标跟踪为由空格组合在一起的坐标字符串,并在内部记录离开每个房间的出口,然后设置一个名为 backtrack 的表,该表将跟踪通过它去的角色和坐标,所以我们可以找到最近的出口。但这并没有解决我的问题,

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

4

1 回答 1

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})

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

于 2013-05-21T11:00:03.407 回答