我只是在玩NetHack,因为我正在为自己编写一个简化版本。我的问题是,走廊是如何实施的?我几天来一直在想办法,不能拿出任何合理的东西。NetHack走廊实现
7
A
回答
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轴移动;反之亦然。这导致了连接两个对角房间的典型的弯曲的楼梯形走廊。如果改变方向会导致我们碰到障碍物(其他房间,熔岩等),那么我们将继续朝着我们前进的方向前进。
2
你可以检查自己的来源! Link
我记得很久以前曾经经历过一段时间的源代码。内存有点生疏,但我认为这是一个非常简单的顺序过程。房间里的房间会按照一定比例的可用瓷砖来绘制,然后他们会生成走廊并掩盖房间对着他们。我认为他们有通过他们寻找无法进入的区域(使用洪水填充?)。
然后楼梯/门/等被填充。
你在找什么是Maze generation algorithm。有吨。
相关问题
- 1. 用Google Maps绘制“走廊”
- 2. 走廊可用性测试:你实际做了多少UI?
- 3. OpenCV vs Matlab - 线/走廊检测
- 4. 我需要riak跑走廊(单身)吗?
- 5. 在走廊里找到一颗星路径
- 6. 如何实现师带圆走向无穷的Python
- 7. 如何实现元素走出边界的平滑过渡?
- 8. 如何实现android的自定义设备照片画廊?
- 9. 什么是一个画廊最好的JavaScript实现?
- 10. Bootstrap画廊不会改变图像后实施到现场
- 11. 自定义表格视图以实现“画廊”外观
- 12. 如何在iPhone/iPad上实现水平画廊
- 13. 如何在Android中实现无尽的画廊?
- 14. 如何在solaris 11.3上启动nethack?
- 15. 如何从Node.js连接到nethack?
- 16. 查找数据集中每个走廊的最大里程数参考
- 17. SQL - Informix的错误导致了另一个错误 - 镜子的走廊PITA
- 18. C#MongoDB.Driver GetServer已经走了,现在呢?
- 19. 使imageview出现在画廊上方
- 20. 的Android Camera2 pcitures出现旋转,画廊
- 21. 走走android.os.NetworkOnMainThreadException“同时的AsyncTask
- 22. 走走activeSpreadsheet.getSheetByName()'改变动态
- 23. Symfony从两个实体获取画廊
- 24. 在NetLogo中实现相关的随机游走和征费步行
- 25. 帮助加载“画廊”画廊与.load
- 26. 在IE7和IE8的拱廊Javascript画廊
- 27. “NEARDATA”在NetHack源代码中的含义是什么?
- 28. 如何将这个NetHack函数移植到Python?
- 29. 。bcrypt的实现,实现HashAlgorithm?
- 30. 实现polynimial类实现
感谢您找出代码实际存在的位置!我想,但我被懒惰所抑制。 – MrLeap 2013-02-26 17:37:13