PDA

Просмотр полной версии : Алгоритм для игры



denpopov
12.03.2014, 09:06
Раскопал у себя сырок игрушки и вот сейчас не могу понять, как мне определить изолированный участок блоков?

Reobne
12.03.2014, 10:01
Каких блоков и изолированных от чего? :)

Reobne
12.03.2014, 10:08
Кажется догадался.

Вот, когда так, как я обвёл на картинке?

denpopov
12.03.2014, 10:20
Да.
наверное, я неверно выразился..

Reobne
12.03.2014, 10:28
Самое простое, после исчезновения группы метить блоки сверху, алгоритмом заливки. Те что не пометятся - оторваны, начинают падать.

Чуть сложнее - после исчезновения блока метить окружающие, как "подозрительные в отрыве", а потом каждый подозрительный проверять заливкой, достаёт ли он до верха (или до бока, если к бокам тоже прилипание). Заливка со стремлением вверх, возможно будет выигрыш в скорости. После достижения верха, заливаем залитое обратно в не помеченное, снимая подозрительность с рядом стоящим только что проверенным. А если заливка закончена, а края не достигли, то она пометила изолированный блок.

Ещё сложнее - метить подозрительными, только когда есть локальный разрыв.

denpopov
12.03.2014, 10:41
Самое простое, после исчезновения группы метить блоки сверху, алгоритмом заливки.
блоки сверху тоже могут быть разорваны,например:


AAA AAAAAA A
AA A
B
B B

Reobne
12.03.2014, 11:45
Тут уж надо решить, что делать. Какие части должны падать, или исчезать.

Если "А"(согласно эскизу), по твоему должны остаться, а "В" должны найтись, то делай заливку с верху и с боков, она зальёт все "А", а "В" останется. Я так понял, что самая правая "А" прижата к правой границе.

denpopov
12.03.2014, 11:57
да, блоки А прижаты к краю, а блоки В по идее должны исчезать..

Reobne
12.03.2014, 12:00
Ну вот. С боков и сверху помечающую заливку сделать сможешь?

denpopov
12.03.2014, 12:17
Ну вот. С боков и сверху помечающую заливку сделать сможешь?

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

Reobne
12.03.2014, 12:22
ну если выбор совпадающих блоков работает
О чём это? О поиске группы одноцветных?

Зачем к пустоте? Я про имеющиеся блоки говорю.

Reobne
12.03.2014, 12:27
Вот, на картинке.
Сиреневые стрелки залили тех, которые закреплены. В середине один остался.

denpopov
12.03.2014, 12:31
Сиреневые стрелки залили тех, которые закреплены. В середине один остался
а что теперь делать? я думал залить пустое пространство и выделить блоки(например на твоей картинке один) и попробовать один блок отсечь..

jerri
12.03.2014, 12:36
denpopov, ну чо сам писать будешь? или как дизайнер выступишь? :)

---------- Post added at 12:36 ---------- Previous post was at 12:32 ----------


а что теперь делать? я думал залить пустое пространство и выделить блоки(например на твоей картинке один) и попробовать один блок отсечь..

а здесь кстати совсем просто

вот смотри есть массив 16*12 где у тебя отражены морды
и есть второй массив 16*12 который ты зануляешь перед закраской

и когда делаешь заливку от краев помечаешь во втором буфере например единичкой

после заливки проверяешь наличие закрепленной за каждой мордой единичкой

Reobne
12.03.2014, 12:43
Залив пустое пространство ты хочешь отделить открытое пространство от закрытых пузырей что-ли? И там будут рождаться бегающие монстры. Отличная идея!:)

---------- Post added at 14:43 ---------- Previous post was at 14:36 ----------


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

denpopov
12.03.2014, 12:51
ну чо сам писать будешь? или как дизайнер выступишь?
да какой из меня дезайнер? писал игру очень давно, сейчас посмотрел на исходник и понял, что загвоздка была в алгоритме. Я не хочу, чтобы блоки падали, просто нужно ликвидировать блок и по возможности посчитать количество блоков.


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

Reobne
12.03.2014, 12:58
Один свобоный блок остался, потому-что до него не дошла заливка. Затравочные точки были сверху и с боков, а он с ними не соединён.

В новом варианте - см картинку. Голубым обвёл оторванных.

denpopov
12.03.2014, 13:35
т.е. два блока не считать - нужно ли их изолировать?

Reobne
12.03.2014, 13:45
Да я разве против? Если тебе надо, то посчитай. Или "изолируй". Я не понимаю что значит "изолировать". Раньше я думал, что это такое состояние группы блоков, когда они находятся в "летящем" состоянии, то есть в процессе игры они оторвались от "заземлённой" части. Также я думал, что наша задача, найти алгоритм, который позволил-бы найти такие части. Но теперь, после твоих вопросов я понимаю, что ты имел ввиду что-то другое. Пожалуйста опиши поподробнее, что значит изолировать?

denpopov
12.03.2014, 14:03
опиши поподробнее, что значит изолировать?
Ну я не знаю, как объяснить - как мне отделить все блоки, которые отделены от общей части?

Reobne
12.03.2014, 14:07
Так. Это не те, которые я в последнем эскизе обвёл голубым? Тогда какие? Нарисуй эскиз и обведи те, которые хочешь найти, станет понятнее чем на словах.

Hacker VBI
12.03.2014, 14:30
если сверху блока пустота, тогда { ... }
;)

denpopov
12.03.2014, 14:40
я совсем запутался..
http://vigilantemma.files.wordpress.com/2013/10/timeout.jpeg?w=614

Hacker VBI
12.03.2014, 14:54
ld ix,массив 16х12
ld a,(ix-16)
or a
jr z, пустота

тип так)

отдохни, решение придёт

denpopov
12.03.2014, 15:34
ld ix,массив 16х12
ld a,(ix-16)
or a
jr z, пустота

тип так)
типа так не пойдет.
Вот если сверху границу прочертить, то это вариант.

alone
12.03.2014, 16:11
Можно выписать все блоки, имеющие внешнюю границу, а потом по этому списку собрать все существующие границы областей. Внутренние и внешние границы можно отличить друг от друга по знаку накопленного поворота вектора обхода. Внутренние границы исключить. Области, не соприкасающиеся с границей экрана, удалить заливкой.

null_device
12.03.2014, 16:23
denpopov, если правильно понял задачу - вот концепция решения "в лоб". После хода, подсчитываете все "группируемые" элементы находящиеся на экране. Берете любой из "группируемых" элементов и проверяете его на предмет "соседства" с краями экрана и другими элементами (в соответствии с игровой "логикой"), добавляя элементы в группу до тех пор пока в группу не будут включены все возможные элементы. Если хоть один из элементов "группы" соседствует с краем экрана, данная группа считается "неудаляемой", в противном случае - данная группы "удалямая". Сравниваем общее количество количество всех элементов и элементов составленных в "группы" - если равно, больше элементов нет, можно делать следующий ход. В противном случае, ищем еще не сгруппированные блоки по вышеприведенному алгориитму.

denpopov
12.03.2014, 18:24
ээээх, было бы хорошо увидеть работу алгоритма, описанного на словах...пока гонял игру, нашел еще одну ошибку, пытаюсь понять, в чем дело.
плохой из меня игрописатель:(

null_device
13.03.2014, 11:45
denpopov, Сперва подсчитываем общее количество элементов на экране (фиолетовый).

Потом, начинаем "группировать" элементы в соответствии с логикой игры. В итоге получается три группы: "красная", "зеленая" и "голубая". "Зеленая" и "голубая" -"изолированные", т.к. не соприкасаются с границами экрана.

Если игровой экран представлен в виде массива - добавляем с каждой из сторон по одному элементу массива и заполняем их определенным значением (обозначил "серым" - это поможет при "сканировании" соседних ячеек в пределах игрового экрана, определить, соприкасается или нет "группа" с границей экрана)

Одновременно с этим считаем количество элементов во всех группах. Если количество элементов во всех группах, не равно ранее подсчитанному количеству - на игровом поле есть неучтенные элементы.

http://img-fotki.yandex.ru/get/9822/69457089.12/0_ba6c3_492f2600_orig

denpopov
13.03.2014, 12:01
null_device, я верну немного назад - а как быть, если вверху две пары разделены?

Hacker VBI
13.03.2014, 12:12
висящие морды ds 10. (10 - с потолка) :eek_std:

перебираем от 0 до 15 (по столбикам)
{
флаг=0.
перебираем от 0 до 11 всё сверху-вниз
{
есть морда? :v2_dizzy_mutant:
заносим в "висящие морды".
если флаг!=0, то inc "висящие морды", флаг=0.

нет морды?
флаг=1.

вниз.
}
}

результат - номера морд в массиве "висящие морды" ;)
что скажете?

denpopov
13.03.2014, 12:40
кажется дошло - помечаем те блоки, что рядом со стеной, потом помечаем блоки, что примыкают к первым, а остальное - трем беспощадно:)
Разобрался с исходником наконец - все манипуляции идут не с массивом, а с экраном сразу. Для определения группы придется с памятью.

Hacker VBI
13.03.2014, 12:43
ну эт не правильно, насчёт "все манипуляции идут не с массивом, а с экраном"

denpopov
13.03.2014, 13:09
ну эт не правильно, насчёт "все манипуляции идут не с массивом, а с экраном"

почему? разницы нет никакой.

Hacker VBI
13.03.2014, 13:22
отделяй логику от представления

denpopov
13.03.2014, 13:30
отделяй логику от представления
кр - с.т.

?

Hacker VBI
13.03.2014, 13:42
ну - отдельно всё просчитал
потом отдельно вывел.
удобнее будет, понятней код, больше возможностей по оптимизации вывода и т.д.
луч рвать не будет, во! %)

denpopov
13.03.2014, 13:56
хорошо, попробую реализовать описанный алгоритм:)

null_device
13.03.2014, 18:52
denpopov, для начала - нужно однозначно описать игровую механику. По снапшоту из первого поста понять ее весьма проблематично.

denpopov
13.03.2014, 18:56
для начала - нужно однозначно описать игровую механику.

игра отчасти написана. Осталось найти блоки и придумать, что будет в качестве наказания при промахе брошенного блока. Ну а потом - чинить баг.

Hacker VBI
13.03.2014, 19:14
блок должен отвалиться и упасть, тиритически)

denpopov
13.03.2014, 19:31
блок должен отвалиться и упасть, тиритически)
не, свободные блоки буду просто удалять..

Hacker VBI
13.03.2014, 19:33
эх, некрасиво. эффекты давай :)

denpopov
13.03.2014, 19:34
эффекты давай

какие?

Hacker VBI
13.03.2014, 19:42
много, и разных
исследуй (https://www.google.com.ua/search?q=%D1%88%D0%B0%D1%80%D0%B8%D0%BA%D0%B8+%D0% B8%D0%B3%D1%80%D0%B0&client=firefox-a&hs=jQ9&rls=org.mozilla:uk:official&channel=sb&tbm=isch&tbo=u&source=univ&sa=X&ei=lNEhU7faBoXWtAb7qYCQCw&sqi=2&ved=0CD8QsAQ&biw=1920&bih=969#facrc=_&imgdii=_&imgrc=PM_7vOA0IVMHFM%253A%3B_cZtlk3v4Mo8dM%3Bhttp% 253A%252F%252Furpa.at.ua%252F6%252Ftibet_kvest.jpg %3Bhttp%253A%252F%252Furpa.at.ua%252Fpubl%252Figra t_sejchas%252Fshariki_tri_v_rjad%252F3%3B640%3B480 ) :)

http://www.morph.ru/img/games/ice-age/ice-age-screenshot-3.jpg
http://casualgames.com.ua/wp-content/uploads/2009/08/igra-nebesnie-ostrova.jpg
что угодно

denpopov
13.03.2014, 19:46
исследуй
ну ты и диверсант:) если получится, сделаю простым гашением, а потом уже судить другим.

Hacker VBI
13.03.2014, 19:52
ну так а чо ж так просто. это-же игра :)

alone
13.03.2014, 19:56
Hacker VBI, игра типа верхней уже есть на Спеке и довольно играбельная: http://computeremuzone.com/ficha.php?id=14&l=en

denpopov
13.03.2014, 20:05
ну так а чо ж так просто. это-же игра
а что игра? шарики по рядам раскиданы по гексагональной сетке. лучше попробовать эту игру доделать.
один отрицательный отзыв я насчитал, значит, имеет смысл писать до победного)

Hacker VBI
13.03.2014, 20:07
denpopov, во, изучи конкурента (http://computeremuzone.com/ficha.php?id=14&l=en) :)

denpopov
13.03.2014, 20:21
denpopov, во, изучи конкурента
знаю, видел.