使用Lua中的坐标表和基本出口的方法来查找最近未访问的出口。

我正在尝试为一个我已经编写了一系列脚本的 mud 编写一个 lua 脚本。最近,mud 开始发送房间坐标(x、y 和高度),以及可用出口(北、东、南)。我想编写一个脚本,它将跟踪访问过的出口,并从我当前所在的房间中找到最近的未访问出口:

我试图在 stackoverflow 和谷歌上的许多其他网站上查阅,但迄今为止我没有找到答案,所以我尝试创建一个坐标表,它将将坐标作为字符串(由空格连接)保留在表中,然后在其中存储每个房间的离开出口记录,然后设置一个名为 backtrack 的表,以跟踪角色完成的所有移动和它所到达的坐标,以便我们可以找到最近的出口。

但这并没有解决我的问题,因为有时玩家会移动到不同的位置,而我构建的循环来查找最近的出口就会卡住或没有提供有用的结果。

有没有人有经验或做过类似的事情?我不知道如何处理这个问题。

谢谢。

点赞
用户204011
用户204011

"The closest unvisited exit"意味着"具有未访问的出口的最近的房间"。

使用房间坐标可以构建二维地图。任何(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-21 11:00:03