Просмотр полной версии : Алгоритм для игры
denpopov
12.03.2014, 09:06
Раскопал у себя сырок игрушки и вот сейчас не могу понять, как мне определить изолированный участок блоков?
Каких блоков и изолированных от чего? :)
Кажется догадался.
Вот, когда так, как я обвёл на картинке?
denpopov
12.03.2014, 10:20
Да.
наверное, я неверно выразился..
Самое простое, после исчезновения группы метить блоки сверху, алгоритмом заливки. Те что не пометятся - оторваны, начинают падать.
Чуть сложнее - после исчезновения блока метить окружающие, как "подозрительные в отрыве", а потом каждый подозрительный проверять заливкой, достаёт ли он до верха (или до бока, если к бокам тоже прилипание). Заливка со стремлением вверх, возможно будет выигрыш в скорости. После достижения верха, заливаем залитое обратно в не помеченное, снимая подозрительность с рядом стоящим только что проверенным. А если заливка закончена, а края не достигли, то она пометила изолированный блок.
Ещё сложнее - метить подозрительными, только когда есть локальный разрыв.
denpopov
12.03.2014, 10:41
Самое простое, после исчезновения группы метить блоки сверху, алгоритмом заливки.
блоки сверху тоже могут быть разорваны,например:
AAA AAAAAA A
AA A
B
B B
Тут уж надо решить, что делать. Какие части должны падать, или исчезать.
Если "А"(согласно эскизу), по твоему должны остаться, а "В" должны найтись, то делай заливку с верху и с боков, она зальёт все "А", а "В" останется. Я так понял, что самая правая "А" прижата к правой границе.
denpopov
12.03.2014, 11:57
да, блоки А прижаты к краю, а блоки В по идее должны исчезать..
Ну вот. С боков и сверху помечающую заливку сделать сможешь?
denpopov
12.03.2014, 12:17
Ну вот. С боков и сверху помечающую заливку сделать сможешь?
ну если выбор совпадающих блоков работает, то заливку можно применить к пустоте.
ну если выбор совпадающих блоков работает
О чём это? О поиске группы одноцветных?
Зачем к пустоте? Я про имеющиеся блоки говорю.
Вот, на картинке.
Сиреневые стрелки залили тех, которые закреплены. В середине один остался.
denpopov
12.03.2014, 12:31
Сиреневые стрелки залили тех, которые закреплены. В середине один остался
а что теперь делать? я думал залить пустое пространство и выделить блоки(например на твоей картинке один) и попробовать один блок отсечь..
denpopov, ну чо сам писать будешь? или как дизайнер выступишь? :)
---------- Post added at 12:36 ---------- Previous post was at 12:32 ----------
а что теперь делать? я думал залить пустое пространство и выделить блоки(например на твоей картинке один) и попробовать один блок отсечь..
а здесь кстати совсем просто
вот смотри есть массив 16*12 где у тебя отражены морды
и есть второй массив 16*12 который ты зануляешь перед закраской
и когда делаешь заливку от краев помечаешь во втором буфере например единичкой
после заливки проверяешь наличие закрепленной за каждой мордой единичкой
Залив пустое пространство ты хочешь отделить открытое пространство от закрытых пузырей что-ли? И там будут рождаться бегающие монстры. Отличная идея!:)
---------- Post added at 14:43 ---------- Previous post was at 14:36 ----------
а что теперь делать?
Из продолжения к моей картинке.
Допустим мы хотим, чтобы оторванные исчезли. Делаем цикл по всем клеткам, если в клетке есть блок, и он не помечен заливкой от краёв, то стираем его.
Если хотим, чтобы он падал, то перебираем клетки сверху вниз, и непомеченные блоки переносим на клетку ниже.
denpopov
12.03.2014, 12:51
ну чо сам писать будешь? или как дизайнер выступишь?
да какой из меня дезайнер? писал игру очень давно, сейчас посмотрел на исходник и понял, что загвоздка была в алгоритме. Я не хочу, чтобы блоки падали, просто нужно ликвидировать блок и по возможности посчитать количество блоков.
Делаем цикл по всем клеткам, если в клетке есть блок, и он не помечен заливкой от краёв, то стираем его.
Я не понимаю, почему у тебя получается один свободный блок. допустим, в такой ситуации как поступить?
Один свобоный блок остался, потому-что до него не дошла заливка. Затравочные точки были сверху и с боков, а он с ними не соединён.
В новом варианте - см картинку. Голубым обвёл оторванных.
denpopov
12.03.2014, 13:35
т.е. два блока не считать - нужно ли их изолировать?
Да я разве против? Если тебе надо, то посчитай. Или "изолируй". Я не понимаю что значит "изолировать". Раньше я думал, что это такое состояние группы блоков, когда они находятся в "летящем" состоянии, то есть в процессе игры они оторвались от "заземлённой" части. Также я думал, что наша задача, найти алгоритм, который позволил-бы найти такие части. Но теперь, после твоих вопросов я понимаю, что ты имел ввиду что-то другое. Пожалуйста опиши поподробнее, что значит изолировать?
denpopov
12.03.2014, 14:03
опиши поподробнее, что значит изолировать?
Ну я не знаю, как объяснить - как мне отделить все блоки, которые отделены от общей части?
Так. Это не те, которые я в последнем эскизе обвёл голубым? Тогда какие? Нарисуй эскиз и обведи те, которые хочешь найти, станет понятнее чем на словах.
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, пустота
тип так)
типа так не пойдет.
Вот если сверху границу прочертить, то это вариант.
Можно выписать все блоки, имеющие внешнюю границу, а потом по этому списку собрать все существующие границы областей. Внутренние и внешние границы можно отличить друг от друга по знаку накопленного поворота вектора обхода. Внутренние границы исключить. Области, не соприкасающиеся с границей экрана, удалить заливкой.
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
ну так а чо ж так просто. это-же игра :)
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, во, изучи конкурента
знаю, видел.
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot