寻找Wumpus - 房间连接

时间:2009-08-14 22:58:41

标签: c++

所以我正在用C ++编写游戏Hunt the Wumpus的版本。唯一真正的区别是我并不担心洞穴有十二面体形状。

到目前为止,我已经实施了洞穴的创建以及英雄,蝙蝠,wumpus和坑的随意插入。

// Hunt the Wumpus

#include "std_lib_facilities.h"
#include "time.h"

class Room{
    bool is_occupied;
    bool has_wumpus;
    bool has_bat;
    bool has_pit;

public:
    Room()  // default constructor
    {
        is_occupied = false;
        has_wumpus = false;
        has_bat = false;
        has_pit = false;
    }

    void random_insert(vector<Room>& v);
};

void Room::random_insert(vector<Room>& v)
{
    srand(time(NULL));
    int random_room = 0;
    bool crowded = true;

    random_room = rand() % 20;  // insert hero
    v[random_room].is_occupied = true;

    while(crowded)  // insert...THE WUMPUS!
    {
        random_room = rand() % 20;
        if(v[random_room].is_occupied) ;
        else if(!v[random_room].is_occupied)
        {
             v[random_room].has_wumpus = true;
             crowded = false;
        }
    }

    crowded = true;
    while(crowded)  // insert bat
    {
        random_room = rand() % 20;
        if(v[random_room].is_occupied || v[random_room].has_wumpus) ;
        else if(!v[random_room].is_occupied && !v[random_room].has_wumpus)
        {
             v[random_room].has_bat = true;
             crowded = false;
        }
    }

    crowded = true;
    while(crowded)  // insert pit
    {
        random_room = rand() % 20;
        if(v[random_room].is_occupied || v[random_room].has_wumpus || v[random_room].has_bat) ;
        else if(!v[random_room].is_occupied && !v[random_room].has_wumpus && !v[random_room].has_bat)
        {
             v[random_room].has_pit = true;
             crowded = false;
        }
    }
}

vector<Room> create(Room& r)
{
    vector<Room> c;
    for(int i = 0; i < 20; ++i)
        c.push_back(r);
    return c;
}

int main()
{
    Room r;
    vector<Room> cave = create(r);   // create cave
    r.random_insert(cave);    // randomly insert things

}

我已经很好地了解了如何用蝙蝠将英雄放入随机位置,射击,输出当前情况等来实现其他一切。

然而,我不知道如何处理随机连接洞穴中的房间。我已经考虑过在矢量中进行某种随机排序,然后用指针连接房间左右两边,但这只是一个长长的走廊,而不是一个洞穴。也许我可以创建某种坐标系统?有没有人有任何建议?感谢。

2 个答案:

答案 0 :(得分:3)

一个简单的解决方案是选择一个出口少于3个的房间,并连接到一个随机房间(当然要注意双重连接)。一旦没有少于3个出口的房间,终止。只有20个左右的房间,实施的速度并不重要。

编辑:地图的某些部分可能会以这种方式从其他地方“切断”,或仅通过一条走廊连接。它可能有助于从“长走廊”开始,然后应用上述算法,以确保不会发生。

答案 1 :(得分:0)

你可以为此做一些非常复杂的算法。我在Java中创建了一个random maze generator,它使用Drunkard的Walk算法来实现这一目标。实际上,您遍历每个网格位置一次,然后当您在该位置创建房间时,您开始将房间放置在随机可用的相邻位置,如果它们尚未连接,则将它们连接起来。继续前进,直到你不能在前一个位置附近建一个新房间,然后迭代到下一个可用的网格空间。这有点复杂,但效果很好。理解它的最好方法是运行我链接到你的迷宫生成器,并观察迷宫生成。你应该很快理解它。

另一种解决方案是将每个房间存储在2D网格中,与其实际位置相对应。然后简单地遍历每个网格空间并随机分配指向相邻房间的指针。有些将有4个连接,有些是3个,2个或1个(至少有1个)。我会给每个房间一个房间*北,房间*东,房间*南,房间*西变量组,如果它们中的任何一个是零,那意味着那里有一堵墙。