帮助解决D&;用Java实现三维迷宫

帮助解决D&;用Java实现三维迷宫,java,algorithm,solver,maze,Java,Algorithm,Solver,Maze,我一直在阅读stackoverflow上发布的其他一些问题,我对搜索算法的数量感到有些不知所措。我不是在寻找代码,更多的是在算法的背景上浏览的页面,也许还有一些sudo代码。我知道有像A*这样的算法,但由于时间不够,我不知道我是否能用这个算法完成程序。迷宫是使用服务器程序生成的,解算器连接到服务器,以便向更多玩家发送命令。我无权访问服务器程序中的方法。我必须解决一个迷宫,它被创造成一个D&D迷宫。以下是游戏的基本概述: 一款经典的D&D电脑游戏由一个地牢(迷宫)组成,其中 游戏的目的是穿过地牢,

我一直在阅读stackoverflow上发布的其他一些问题,我对搜索算法的数量感到有些不知所措。我不是在寻找代码,更多的是在算法的背景上浏览的页面,也许还有一些sudo代码。我知道有像A*这样的算法,但由于时间不够,我不知道我是否能用这个算法完成程序。迷宫是使用服务器程序生成的,解算器连接到服务器,以便向更多玩家发送命令。我无权访问服务器程序中的方法。我必须解决一个迷宫,它被创造成一个D&D迷宫。以下是游戏的基本概述:

一款经典的D&D电脑游戏由一个地牢(迷宫)组成,其中 游戏的目的是穿过地牢,进入地牢 在迷宫的“入口”和“出口”退出。使 事情更具挑战性,地下城的布局目前还不得而知 有一些障碍物(僵尸、柏油坑和门)可以 必须通过使用以下物体(车费、梯子和钥匙)来克服: 沿途发现的


我注意到,其他许多帖子不必担心完成迷宫的障碍物,这是否是调整算法以补偿障碍物的主要问题?我想知道像右手法则这样的东西是否适合解决迷宫问题,如果不是的话,什么算法可以尽可能简单地解决迷宫问题(因为我必须尽快完成程序)。任何其他链接都会很好,因为我知道我必须在Objective-C中再次完成此程序,并且我希望在发生这种情况时实现比右手规则更强大的功能。谢谢你的帮助

对于简单的迷宫,你基本上是沿着一条路“走”到一个十字路口。此时,您将记录所有选项。然后你选择一个(使用你喜欢的任何启发式方法,对于你的右手技巧,你总是“向右走”)。记录完选项后,您可以将其填充到堆栈中。然后继续前进

当你读到一个死胡同时,你要么“走回去”,或者如果可能的话,简单地弹出堆栈,选择另一个选项,然后从那里继续。要往回走,只需记录堆栈上的每个移动,并开始展开堆栈,直到到达最后一个交点

你可以简单地继续这样做,注意怪物,比如你可以通过的东西,或者你丢失的东西,作为“死胡同”。然后,您可以在十字路口记录这些可通行的死胡同,这样,如果您回到十字路口仍在寻找出口,您就可以检查库存中的“钥匙”或“剑”或任何您需要通过的东西。当你回来后,检查未探索路径的选项,以及被你可以击败的东西阻挡的路径。如果你有可以击败怪物的物品,你可以重新选择路线,击败怪物并继续前进

我不记得这种技术是否适用于有周期的迷宫。它应该,因为你应该总是能够知道你是否去过某个地方,在你身后留下“面包屑”的痕迹,或者记录你看到的地点

它当然不会告诉你最佳路径,或者最佳得分路径,它只会让你在任何时候都能找到出口

当您发现交叉点时,还可以将地下城表示为内存中的连接图,图中的每个节点都是交叉点,每个节点之间的路径长度(步数)都是图中的过渡。也可以将此图中的障碍物表示为节点

因此,如果你遇到吸血鬼,它将是一个在大厅尽头没有出口的节点。稍后,当你得到十字架和木桩时,你将“知道”吸血鬼在哪里,并且能够遍历图形回到吸血鬼(当然,假设它不移动)

诀窍是在运行时构建这个图,并使用股票图遍历算法(其中有许多算法,它们并不难)从一个节点导航到另一个节点

但是对于穿越一个简单的迷宫,堆栈技术非常有效

增编:

对于简单的迷宫,单叠就足够了。我不知道你的地图是怎么布置的,或者你是怎么导航的,等等

但你可以做的是每次移动时,只需将移动放在堆栈上。然后,当你想要回溯时,你开始弹出堆栈,朝着移动的相反方向移动,直到你回到一个十字路口,然后从那里开始

这只是对一棵树的“深度优先”搜索,你还不知道它的布局。但同样重要的是,你也要以其他方式记录你去过的地方。例如,如果将迷宫表示为地板和墙件的大型阵列,则可以捕获在简单列表中输入的每个地板件的坐标

这样做的原因是,如果迷宫中有循环,你不想“向前走”到你已经走过的空间。显然,回溯时需要这样做。但是在探索的时候,你需要知道你有什么没有看到。跟踪的方式取决于地图的数据结构

考虑一下这个琐碎的迷宫:

# ########
# ########
# # #    #
# # #### #
# #a    b#
# # #### #
#   #    #
##### ####
#    c   #
# ########
您可以看到,您只需要在位置a、b和c处推进堆栈。如果您能够标记您所在的楼层,您的地图在第一个十字路口可能会如下所示:

#.########
#.########
#.# #    #
#.# #### #
#.#a    b#
#.#.#### #
#. .#    #
##### ####
#    c   #
# ########
您将看到:

{d,d,d,d,d,d,d,l,u}
七下一左一上


如果你不能标记地图,你可以追踪坐标。这要看情况而定。

我个人会尝试使用递归来找到路径。您可以使用if语句来处理陷阱,而不是返回语句来告诉y
  public static int recursion(int x, int y) {
    if (location == end) {
      return 0; //found the end
    }
    if (deadEnd) {
      //backtrack
    }
    if (trapName) {
      //put whatever you need to do to get around it
    }
    if (x+1 <= edge) {
      recursion(x+1,y); //Moves right
    }
  }