NetHack 走廊实施

Posted

技术标签:

【中文标题】NetHack 走廊实施【英文标题】:NetHack corridor implementation 【发布时间】:2013-02-12 06:30:06 【问题描述】:

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

【问题讨论】:

【参考方案1】:

您可以自己查看源代码! Link

我记得很久以前看过源代码。内存有点生疏,但我认为这是一个非常简单的顺序过程。将根据可用瓷砖的一定比例为房间绘制盒子,然后它们会生成走廊并将房间遮盖住。我认为他们有一个通行证,可以在其中寻找无法进入的区域(使用洪水填充?)。

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

您要查找的是Maze generation algorithm。有吨。

【讨论】:

【参考方案2】:

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 轴移动;反之亦然。这导致了连接两个对角线房间的典型曲折楼梯形走廊。如果改变方向会导致我们撞到障碍物(其他房间、熔岩等),那么我们将继续前进。

【讨论】:

感谢您找出代码的实际位置!我想这样做,但我被懒惰所束缚。

以上是关于NetHack 走廊实施的主要内容,如果未能解决你的问题,请参考以下文章

车路协同服务平台框架

98份 项目管理实施规划实施计划书实施方案实施细则

NetHack 源代码中的“NEARDATA”是啥意思?

项目管理合集丨实施规划丨实施计划书丨实施方案丨实施细则WordPPT,可下载

如何从 Node.js 连接到 nethack?

什么是软件实施?软件实施前景几何?软件实施的面试题有那些?