帮助解决D&;用Java实现三维迷宫
我一直在阅读stackoverflow上发布的其他一些问题,我对搜索算法的数量感到有些不知所措。我不是在寻找代码,更多的是在算法的背景上浏览的页面,也许还有一些sudo代码。我知道有像A*这样的算法,但由于时间不够,我不知道我是否能用这个算法完成程序。迷宫是使用服务器程序生成的,解算器连接到服务器,以便向更多玩家发送命令。我无权访问服务器程序中的方法。我必须解决一个迷宫,它被创造成一个D&D迷宫。以下是游戏的基本概述: 一款经典的D&D电脑游戏由一个地牢(迷宫)组成,其中 游戏的目的是穿过地牢,进入地牢 在迷宫的“入口”和“出口”退出。使 事情更具挑战性,地下城的布局目前还不得而知 有一些障碍物(僵尸、柏油坑和门)可以 必须通过使用以下物体(车费、梯子和钥匙)来克服: 沿途发现的帮助解决D&;用Java实现三维迷宫,java,algorithm,solver,maze,Java,Algorithm,Solver,Maze,我一直在阅读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
}
}