Реализация коридора NetHack

Я просто играл с NetHack, так как я нахожусь в процессе написания упрощенной версии для себя. У меня вопрос, как реализуются коридоры? Я уже несколько дней пытаюсь придумать подход и не могу придумать ничего разумного.

8

Решение

Создание карты в Nethack происходит в mkmap.c. Метод join_map определяет, какие комнаты должны быть связаны. Метод dig_corridor в sp_lev.c делает реальное копание.

интересные направления:

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 имеет значение true, коридор заходит в тупик. 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; и наоборот. Это вызывает типичные волнистые лестничные коридоры, которые соединяют две диагональные комнаты. Если изменение направления приведет к тому, что мы столкнемся с препятствием (другими комнатами, лавой и т. Д.), То мы просто продолжим движение в том направлении, в котором шли.

8

Другие решения

Вы можете проверить источник для себя! Ссылка на сайт

Я помню, как когда-то давным-давно просматривал исходный код. Память немного ржавая, но я думаю, что это был довольно простой последовательный процесс. Для комнат будут отображаться коробки с определенным соотношением доступных плиток, затем они будут создавать коридоры и маскировать комнаты против них. Я думаю, что у них был проход, где они искали области, которые были недоступны (используя заливку?).

Тогда лестницы / двери / и т.д. были заселены.

То, что вы ищете, это Алгоритм генерации лабиринта. Есть тонны.

2

По вопросам рекламы [email protected]