Четверг, 28 Марта 2024, 13:45

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 2 из 2
  • «
  • 1
  • 2
Форум игроделов » Конструкторы игр и лёгкие в освоении системы разработки игр » Game Maker » Генерация мира(2d)
Генерация мира(2d)
stalker5889Дата: Вторник, 12 Марта 2013, 13:43 | Сообщение # 21
Свободный игродел
Сейчас нет на сайте
Цитата (forhl)
Разве? Главное ведь в играх такого типа - случайность и, соответственно, реиграбельность. Да и как их можно расставить программно, если мир игры генерируется случайно?

В с++:
Хм... прогоняем в двойном цикле все элементы массива мап и если там нет стены с шансом 1/20 (подбирается) ставим рандомного монстра.
Цитата (forhl)
Как на генерируемой карте можно расставить заранее программно? Разве только что при столкновении с объектом объект удаляется. (например со стеной, чтобы они не оказывались в стенах). Или есть другой вариант?

См. выше. В гамаке можно завести 2д массив и по нему рисовать мапу, а можно... хм...
Цитата (forhl)
stalker5889, пробовал. Они оказываются за пределами карты. Может есть какой-нибудь пример хороший у тебя?

Попробую сделать, незнаю почему у тебя глючит, обычно рандом нормально работает.

Добавлено (12.03.2013, 13:43)
---------------------------------------------

Цитата (jorji)
ТАК,Это уже немайнкрафт?

При чём тут кубач? Я описываю принцип генерации мобов.


nonameДата: Вторник, 12 Марта 2013, 15:04 | Сообщение # 22
заслуженный участник
Сейчас нет на сайте
Цитата (forhl)
Да, можно. Есть какой-нибудь пример на эту тему, noname?

от меня примеров пока не будет. я что-то с лабиринтами увяз.

хорошие идеи респавна начинаются с этой:
Цитата (noname)
если после хода игрока открываются поля лабиринта, которые раньше были не видны, то с вероятностью 1/3 мы ставим одного монстра на любое из этих полей. эффект будет такой, как будто игрок сам находит монстров. вероятность появления монстра подберёшь чтобы лучше подходило для твоей игры.
до неё там плохая идея была.

Цитата (forhl)
а вообще- не зря в рогаликах монстров заранее на карте расставляют..

Разве? Главное ведь в играх такого типа - случайность и, соответственно, реиграбельность. Да и как их можно расставить программно, если мир игры генерируется случайно?

мир генерируется случайно и в нём монстры случайно расставляются. можно и не случайно, а так, чтобы игрок имел шанс добраться сначала до слабых монстров, собрать оружие, а потом добраться до более сильных.

Цитата (forhl)
можно программно расставлять монстров заранее (рандомно)

stalker5889, пробовал. Они оказываются за пределами карты.

открывай тему, выкладывай свой пример и спрашивай помощи.

Цитата (forhl)
можно заранее расставить (программно -кэп)

Как на генерируемой карте можно расставить заранее программно?

процесс генерёжки карты заключается в том, что программно расставляются стены и пустоты лабиринта. точно так же можно потом добавить и монстров. и, да- при этом можно много чего интересного учесть. не только тот факт, что монстры не должны заменить собой стены.

Цитата (jorji)
ТАК,Это уже немайнкрафт?

название темы- "генерацию мира 2d". про майнкрафт тебе уже дали ссылку на то, как его создавать. там и создание мира есть.

насчёт генерации лабиринтов:
тысячу лет назад для FireURQ сделал генерацию лабиринта и бродячего монстра:
Код
; монстр в лабиринте
; УТОЧНЕНИЕ: n монстров в лабиринте 100х100(?) клеточек
:генератор
invkill
perkill
maxxr = 8 ; кол-во комнат по горизонтали
maxyr = 8 ; кол-во комнат по вертикали
maxx = maxxr*2+1 ; кол-во ячеек(комнаты+стены/проходы) по горизонтали
maxy = maxyr*2+1 ; кол-во ячеек по горизонтали
crx=0 ; переменные- счётчики
:цикл1_x
crx=crx+1
cry=0
:цикл1_y
cry=cry+1
world_#crx$_#cry$ = 1 ; заполняем мир
if cry<maxy then goto цикл1_y
if crx<maxx then goto цикл1_x
maxap=1 ; кол-во активных точек
x1=2*rnd#maxxr$ ; координаты первой активной точки
y1=2*rnd#maxyr$ ; точки всегда указывают на комнаты
world_#x1$_#y1$=2 ; создаём первую пустую комнату
:генератор_выбор_точки
t=rnd#maxap$ ; выбираем текущую активную точку
crn=0 ; счётчик направлений пробива
dir1=0 & dir2=0 & dir3=0 & dir4=0
if world_#x#t$ $_#y#t$ -2$= 1 then crn=crn+1 & dir1=1; пробив возможен: север
if world_#x#t$ -2$_#y#t$ $= 1 then crn=crn+1 & dir2=1; запад
if world_#x#t$ $_#y#t$ +2$= 1 then crn=crn+1 & dir3=1; юг
if world_#x#t$ +2$_#y#t$ $= 1 then crn=crn+1 & dir4=1; восток
if crn>0 then dir=rnd#crn$ & goto пробиватор
if crn=0 then x#t$= x#maxap$ & y#t$= y#maxap$ & maxap=maxap-1 ; гасим точку
if maxap>0 then goto генератор_выбор_точки
if maxap=0 then goto начало
end
:пробиватор
ndir=0
if dir1=1 then ndir=ndir+1
if dir=ndir then goto пробив1
if dir2=1 then ndir=ndir+1
if dir=ndir then goto пробив2
if dir3=1 then ndir=ndir+1
if dir=ndir then goto пробив3
if dir4=1 then ndir=ndir+1
if dir=ndir then goto пробив4
end
:пробив1
world_#x#t$ $_#y#t$ -1$=2 & world_#x#t$ $_#y#t$ -2$=2 ; пробиваем проход и делаем комнату
maxap=maxap+1 ; добавляем новую активную точку
x#maxap$=x#t$ ; указывающую на эту комнату
y#maxap$=y#t$-2
goto генератор_выбор_точки
end
:пробив2
world_#x#t$ -1$_#y#t$ $=2 & world_#x#t$ -2$_#y#t$ $=2
maxap=maxap+1 ; добавляем новую активную точку
x#maxap$=x#t$-2 ; указывающую на эту комнату
y#maxap$=y#t$
goto генератор_выбор_точки
end
:пробив3
world_#x#t$ $_#y#t$ +1$=2 & world_#x#t$ $_#y#t$ +2$=2
maxap=maxap+1 ; добавляем новую активную точку
x#maxap$=x#t$ ; указывающую на эту комнату
y#maxap$=y#t$+2
goto генератор_выбор_точки
end
:пробив4
world_#x#t$ +1$_#y#t$ $=2 & world_#x#t$ +2$_#y#t$ $=2 ; пробиваем проход и делаем комнату
maxap=maxap+1 ; добавляем новую активную точку
x#maxap$=x#t$+2 ; указывающую на эту комнату
y#maxap$=y#t$
goto генератор_выбор_точки
end
:начало
ggrx= 2 & ggry= 7 & instr ggface= север
ggx=ggrx*2 & ggy=ggry*2
instr letters= a b c d e f g h
tokens letters
instr w1= стена
instr w2= выход
instr ситуац= /в тупике/на прямом пути/на повороте/на развилке/на перекрёстке/
:начало_метка_1
pln
pln я- монстр. стою в комнате #%token#ggrx$$#9-ggry$, мордой на #%ggface$.
pln на севере- #%w#world_#ggx$_#ggy-1$$$, на западе- #%w#world_#ggx-1$_#ggy$$$, на юге- #%w#world_#ggx$_#ggy+1$$$, на востоке- #%w#world_#ggx+1$_#ggy$$$.
crn=0
dir1=0 & dir2=0 & dir3=0 & dir4=0
if world_#ggx$_#ggy-1$= 2 then crn=crn+1 & dir1=1; выход: север
if world_#ggx-1$_#ggy$= 2 then crn=crn+1 & dir2=1; выход: запад
if world_#ggx$_#ggy+1$= 2 then crn=crn+1 & dir3=1; выход: юг
if world_#ggx+1$_#ggy$= 2 then crn=crn+1 & dir4=1; выход: восток
if crn=1 then ситуац = "в тупике" & goto м_назад ; идём в единств возм сторону
; на момент начала игры монстр может оказаться в тупике лицом в любую сторону
if (crn=2)and(dir1=dir3) then ситуац = "на прямом пути" & goto м_дальше ; идём куда угодно, Только НЕ назад
; монстр теоретически может оказаться на прямом пути лицом к стене на момент начала игры
if (crn=2)and(dir1<>dir3) then ситуац = "на повороте" & goto м_дальше ; идём куда угодно, Только НЕ назад
if crn=3 then ситуац = "на развилке" & goto м_дальше ; идём куда угодно, Только НЕ назад
if crn=4 then ситуац = "на перекрёстке" & goto м_дальше ; идём куда угодно, Только НЕ назад
: начало_метка_2
pln так что я нахожусь #%ситуац$, и пойду теперь на #%ggface$
; перемещаем монстра:
if ggface="север" then ggry=ggry-1 & ggy=ggy-2
if ggface="запад" then ggrx=ggrx-1 & ggx=ggx-2
if ggface="юг" then ggry=ggry+1 & ggy=ggy+2
if ggface="восток" then ggrx=ggrx+1 & ggx=ggx+2
btn начало_метка_1, press ENTER
end
:м_назад
if dir1=1 then ggface="север"
if dir2=1 then ggface="запад"
if dir3=1 then ggface="юг"
if dir4=1 then ggface="восток"
goto начало_метка_2
end
:м_дальше
crn=crn-1 ; отбрасываем одно направление (назад)
dir = rnd#crn$
if ((dir<=1)and(not(ggface="юг" )))and(dir1=1) then ggface="север" & goto начало_метка_2
if ((dir<=2)and(not(ggface="восток")))and(dir2=1) then ggface="запад" & goto начало_метка_2
if ((dir<=3)and(not(ggface="север" )))and(dir3=1) then ggface="юг" & goto начало_метка_2
if ((dir<=4)and(not(ggface="запад" )))and(dir4=1) then ggface="восток" & goto начало_метка_2
end

а сейчас делаю на C++ просто генерацию лабиринта и выходит длиннее гораздо и я что-то не так сделал и завяз с указателями. вот, разгребаюсь. алгоритм на самом деле не сложный. так что буду делать, набираться опыта.

FireURQ- это для текстовых игр. в моей проге мы наблюдаем лабиринт с точки зрения бродячего монстра.

копируете текст проги в файл с расширением qst и запускаете фуркой. фурку(FireURQ) найдёте по ссылке, которую я дал выше.

Добавлено (12.03.2013, 14:56)
---------------------------------------------
--

поскольку из текста проги выше нифига не понятно, и даже из проги на C++ может быть не всё понятно, то выкладываю АЛГОРИТМ ГЕНЕРАЦИИ лабиринта. алгоритм простой, но хороший:

- заполняем всю область лабиринта стенами '#'
- выбираем случайное поле лабиринта
- отмечаем выбранное поле пустотой '.'
- заносим выбранное поле в список
- делай:
--- выбираем наугад поле из списка
--- подсчитываем стороны куда можно расшириться от выбранного поля
--- если никуда нельзя расшириться,
----- то удаляем поле из списка
--- иначе
----- выбираем одно из доступных направлений
----- пробиваем в эту сторону два '.' подряд
- пока список не пуст

вот и всё!

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

а теперь пойду ковырять C++ дальше.

Добавлено (12.03.2013, 14:58)
---------------------------------------------
да, вот это:

- делай:
..
- пока список не пуст

это цикл с постусловием. то есть, в конце проверяется пуст ли список и если нет, то цикл крутится ещё раз от слов "делай".

Добавлено (12.03.2013, 15:04)
---------------------------------------------
так, ошибку в своей проге на С++ нашёл. а всего-то, я там в одной проверке написал = вместо == и долго не мог понять, что у меня происходит. скоро будут вам лабиринты. но, главное- алгоритм(выложил выше).

прогу выложу в другом, более подходящем, разделе, здесь размещу ссылку туда.


все правила форумной игры Дуэль Программистов

Сообщение отредактировал noname - Вторник, 12 Марта 2013, 14:56
stalker5889Дата: Вторник, 12 Марта 2013, 17:34 | Сообщение # 23
Свободный игродел
Сейчас нет на сайте
Цитата (noname)
я там в одной проверке написал = вместо ==

БРО!!!!11111адынадын
Я тоже иногда так косячу.
Цитата (noname)
прогу выложу в другом, более подходящем, разделе, здесь размещу ссылку туда.

Ок
noname, если поможет, вот нарыл.




Сообщение отредактировал stalker5889 - Вторник, 12 Марта 2013, 19:08
nonameДата: Вторник, 12 Марта 2013, 18:20 | Сообщение # 24
заслуженный участник
Сейчас нет на сайте
Цитата (stalker5889)
noname, если поможет, вот нарыл.

Цитата
Алгоритм построения подзе мелий

В настоящее время на этой странице нет текста. Вы можете найти упоминание данного названия в других статьях, или найти соответствующие записи журналов.


stalker5889, только что дописал прогу. щазз выложу.

это- первая версия. без крупных комнат. только узкие коридоры.

в следующей версии добавлю комнаты.

в-общем, я поигрался со ссылкой, которую здесь уже давал, и мне уже более-менее ясен их алгоритм. они хитренькие: у них задаются не точные параметры: количество и размер комнат и прочего, а приблизительные. это даёт возможность упростить алгоритм. надо бы и мне так попробовать.

Добавлено (12.03.2013, 18:19)
---------------------------------------------
выложил программу здесь:
http://gcup.ru/forum/7-30888-505039-16-1363097916

Добавлено (12.03.2013, 18:20)
---------------------------------------------
дайте какой-нибудь отзыв в той теме.


все правила форумной игры Дуэль Программистов

Сообщение отредактировал noname - Вторник, 12 Марта 2013, 18:12
stalker5889Дата: Вторник, 12 Марта 2013, 19:08 | Сообщение # 25
Свободный игродел
Сейчас нет на сайте
noname, круто) Пруфф исправил.

Форум игроделов » Конструкторы игр и лёгкие в освоении системы разработки игр » Game Maker » Генерация мира(2d)
  • Страница 2 из 2
  • «
  • 1
  • 2
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг