所以我正在用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
}
我已经很好地了解了如何用蝙蝠将英雄放入随机位置,射击,输出当前情况等来实现其他一切。
然而,我不知道如何处理随机连接洞穴中的房间。我已经考虑过在矢量中进行某种随机排序,然后用指针连接房间左右两边,但这只是一个长长的走廊,而不是一个洞穴。也许我可以创建某种坐标系统?有没有人有任何建议?感谢。
答案 0 :(得分:3)
一个简单的解决方案是选择一个出口少于3个的房间,并连接到一个随机房间(当然要注意双重连接)。一旦没有少于3个出口的房间,终止。只有20个左右的房间,实施的速度并不重要。
编辑:地图的某些部分可能会以这种方式从其他地方“切断”,或仅通过一条走廊连接。它可能有助于从“长走廊”开始,然后应用上述算法,以确保不会发生。
答案 1 :(得分:0)
你可以为此做一些非常复杂的算法。我在Java中创建了一个random maze generator,它使用Drunkard的Walk算法来实现这一目标。实际上,您遍历每个网格位置一次,然后当您在该位置创建房间时,您开始将房间放置在随机可用的相邻位置,如果它们尚未连接,则将它们连接起来。继续前进,直到你不能在前一个位置附近建一个新房间,然后迭代到下一个可用的网格空间。这有点复杂,但效果很好。理解它的最好方法是运行我链接到你的迷宫生成器,并观察迷宫生成。你应该很快理解它。
另一种解决方案是将每个房间存储在2D网格中,与其实际位置相对应。然后简单地遍历每个网格空间并随机分配指向相邻房间的指针。有些将有4个连接,有些是3个,2个或1个(至少有1个)。我会给每个房间一个房间*北,房间*东,房间*南,房间*西变量组,如果它们中的任何一个是零,那意味着那里有一堵墙。