2013-02-26 99 views
7

我只是在玩NetHack,因为我正在为自己编写一个简化版本。我的问题是,走廊是如何实施的?我几天来一直在想办法,不能拿出任何合理的东西。NetHack走廊实现

回答

7

Nethack中的地图生成发生在mkmap.c中。方法join_map确定哪些房间应该连接。在sp_lev.c中的方法dig_corridor进行实际的挖掘。

行的兴趣。

if (tx > xx)  dx = 1; 
else if (ty > yy) dy = 1; 
else if (tx < xx) dx = -1; 
else   dy = -1; 

这比“当前的X和Y”与“对象X与Y”确定,我们将首先在被挖掘的方向

while(xx != tx || yy != ty) { 
    /* loop: dig corridor at [xx,yy] and find new [xx,yy] */ 
    if(cct++ > 500 || (nxcor && !rn2(35))) 
    return FALSE; 

我们我们会继续努力,直到达到目标为止,但有一些例外:如果“走廊计数”cct为500,那么我们已经挖掘了很长时间并想放弃。如果nxcor是真的,那么走廊就可以走完了。 rn2是一个随机数字生成器,所以如果可能有死胡同,那么在每个循环中我们都会放弃一个小的机会。

crm = &levl[xx][yy]; 
    if(crm->typ == btyp) { 
    if(ftyp != CORR || rn2(100)) { 
     crm->typ = ftyp; 
     if(nxcor && !rn2(50)) 
      (void) mksobj_at(BOULDER, xx, yy, TRUE, FALSE); 
    } else { 
     crm->typ = SCORR; 
    } 

crm是我们目前使用的瓷砖。大多数时候,我们把瓷砖变成一个普通的走廊。有时候,我们会将拼贴块变成一个SCORR或秘密走廊,只有通过搜索才能找到该拼贴走廊。如果路径可能是死路一条,我们也会放置巨石。

/* do we have to change direction ? */ 
    if(dy && dix > diy) { 
    register int ddx = (xx > tx) ? -1 : 1; 

    crm = &levl[xx+ddx][yy]; 
    if(crm->typ == btyp || crm->typ == ftyp || crm->typ == SCORR) { 
     dx = ddx; 
     dy = 0; 
     continue; 
    } 
    } else if(dx && diy > dix) { 
    register int ddy = (yy > ty) ? -1 : 1; 

    crm = &levl[xx][yy+ddy]; 
    if(crm->typ == btyp || crm->typ == ftyp || crm->typ == SCORR) { 
     dy = ddy; 
     dx = 0; 
     continue; 
    } 
    } 

如果当前位置与目标位置之间绘制的线的“斜率​​”是略微远离45度,我们试图改变方向;如果我们沿着X轴移动,那么我们开始沿着Y轴移动;反之亦然。这导致了连接两个对角房间的典型的弯曲的楼梯形走廊。如果改变方向会导致我们碰到障碍物(其他房间,熔岩等),那么我们将继续朝着我们前进的方向前进。

+0

感谢您找出代码实际存在的位置!我想,但我被懒惰所抑制。 – MrLeap 2013-02-26 17:37:13

2

你可以检查自己的来源! Link

我记得很久以前曾经经历过一段时间的源代码。内存有点生疏,但我认为这是一个非常简单的顺序过程。房间里的房间会按照一定比例的可用瓷砖来绘制,然后他们会生成走廊并掩盖房间对着他们。我认为他们有通过他们寻找无法进入的区域(使用洪水填充?)。

然后楼梯/门/等被填充。

你在找什么是Maze generation algorithm。有吨。

相关问题