Java:如何检查生成的级别是否可行?

Java:如何检查生成的级别是否可行?,java,dictionary,generated,Java,Dictionary,Generated,我创建了一个基于文本的游戏,可以自动生成一张10x10个房间的地图,其中一些房间被各种碎片堵塞,我无法找到最有效的方法来检查玩家是否可以拿到钥匙并到达出口,而不会被地图切断 目前,需要的房间与地图的其余部分被切断的可能性很低,这使得标高不可能实现,我考虑检查每个相邻的广场到起始位置,然后重复,直到所有可访问的方块在变量中设置为“可访问”,然后如果三个对象不可访问,只需重新生成地图,直到它们被访问为止。 不过,如果它重新生成几次,速度可能会很慢 有没有人对重复部分有什么想法来保持快速,或者有更好的

我创建了一个基于文本的游戏,可以自动生成一张10x10个房间的地图,其中一些房间被各种碎片堵塞,我无法找到最有效的方法来检查玩家是否可以拿到钥匙并到达出口,而不会被地图切断

目前,需要的房间与地图的其余部分被切断的可能性很低,这使得标高不可能实现,我考虑检查每个相邻的广场到起始位置,然后重复,直到所有可访问的方块在变量中设置为“可访问”,然后如果三个对象不可访问,只需重新生成地图,直到它们被访问为止。 不过,如果它重新生成几次,速度可能会很慢

有没有人对重复部分有什么想法来保持快速,或者有更好的方法来实现这一点

这是生成的地图的图像:#的是被封锁的房间。

您可以使用或其他方法检查从房间入口到每个对象是否有通道,然后丢弃无效房间。但这可能会有点慢,特别是如果房间变大或添加了更多对象

一个更好的选择是通过建筑保证房间的每个部分都可以到达。这可以通过使用。它可以用来创建随机地下城,同时确保所有房间都是连接的。您可以在中找到更多信息

有很多关于程序生成地下城的资料。您可以检查另一个有趣的对象。

您可以使用或其他方法检查从房间入口到每个对象是否有一条路,然后丢弃无效的房间。但这可能会有点慢,特别是如果房间变大或添加了更多对象

一个更好的选择是通过建筑保证房间的每个部分都可以到达。这可以通过使用。它可以用来创建随机地下城,同时确保所有房间都是连接的。您可以在中找到更多信息

有很多关于程序生成地下城的资料。你可以查另一个有趣的

真正的问题是程序员花了太多的时间 在错误的地点和错误的时间担心效率; 过早优化是万恶之源(或者至少是大多数问题的根源) 它)在编程中

根据Knuth的建议,我建议实现我想到的最简单的解决方案(例如,如问题中所述),并且仅在该方法成为程序瓶颈时才寻找更有效的算法。如果他适合1974年的计算机性能,那么他现在就更适合了

真正的问题是程序员花了太多的时间 在错误的地点和错误的时间担心效率; 过早优化是万恶之源(或者至少是大多数问题的根源) 它)在编程中


根据Knuth的建议,我建议实现我想到的最简单的解决方案(例如,如问题中所述),并且仅在该方法成为程序瓶颈时才寻找更有效的算法。如果他适合1974年的计算机性能,那么他现在就更适合了…

制作一个数组,每个房间有一行,每个房间有一列

如果两个房间相连,则在每个i、j(行、列)位置放置1

该矩阵(A)是游戏图形的数字表示,图形的节点是房间,边是门

现在取一个向量,其长度与您拥有的房间数对应,并用零填充,除了与您开始所在房间对应的位置上的一个。此向量(P)是在0次转换后可以到达给定房间的方式数。要检查是否可以在(n)转换中到达给定房间,只需将P a^n相乘,并在表示给定房间的向量中的位置查找非零值


这是这里描述得很好的数学概括

制作一个数组,每个房间有一行,每个房间有一列

如果两个房间相连,则在每个i、j(行、列)位置放置1

该矩阵(A)是游戏图形的数字表示,图形的节点是房间,边是门

现在取一个向量,其长度与您拥有的房间数对应,并用零填充,除了与您开始所在房间对应的位置上的一个。此向量(P)是在0次转换后可以到达给定房间的方式数。要检查是否可以在(n)转换中到达给定房间,只需将P a^n相乘,并在表示给定房间的向量中的位置查找非零值


这是这里所描述的数学的概括

您可以将电路板表示为一个以坐标值为键,以一组坐标值表示每个相邻坐标的图形。Map您可以将电路板表示为一个以坐标值为键和一组坐标的图形由于代表每个坐标的值是相邻的..示例
MapI实际上只考虑效率,因为我来自Game Maker,在那里我一点也不关心它,到最后速度非常慢。公平的说,虽然我总是可以晚一点做,而且只基于文本,但速度不是问题。我真的只考虑效率,因为我来自游戏制造商,在那里我一点也不在乎,到最后速度慢得令人难以置信。虽然我可以稍后再做,而且只基于文本,但速度不是问题。啊,我来看看这些
    for(int r = 0; r <= 10; r++){
        for(int c = 0; c <= 10; c++){
            HashSet<Coordinate> neighbors = new HashSet<Coordinate>();
                 if(r > 0){
                    neighbors.add(new Coordinate(r - 1, c));
                 }
                if(r < 8){
                     neighbors.add(new Coordinate(r + 1, c));
                 }
                if(c > 0){
                    neighbors.add(new Coordinate(r, c - 1));
                 }
                if(c < 8){
                    neighbors.add(new Coordinate(r, c + 1));
                 }
            graph.put((new Coordinate(r,c)), neighbors);
        }
    }