Раскопал у себя сырок игрушки и вот сейчас не могу понять, как мне определить изолированный участок блоков?
Вид для печати
Раскопал у себя сырок игрушки и вот сейчас не могу понять, как мне определить изолированный участок блоков?
Каких блоков и изолированных от чего? :)
Кажется догадался.
Вот, когда так, как я обвёл на картинке?
Да.
наверное, я неверно выразился..
Самое простое, после исчезновения группы метить блоки сверху, алгоритмом заливки. Те что не пометятся - оторваны, начинают падать.
Чуть сложнее - после исчезновения блока метить окружающие, как "подозрительные в отрыве", а потом каждый подозрительный проверять заливкой, достаёт ли он до верха (или до бока, если к бокам тоже прилипание). Заливка со стремлением вверх, возможно будет выигрыш в скорости. После достижения верха, заливаем залитое обратно в не помеченное, снимая подозрительность с рядом стоящим только что проверенным. А если заливка закончена, а края не достигли, то она пометила изолированный блок.
Ещё сложнее - метить подозрительными, только когда есть локальный разрыв.
Тут уж надо решить, что делать. Какие части должны падать, или исчезать.
Если "А"(согласно эскизу), по твоему должны остаться, а "В" должны найтись, то делай заливку с верху и с боков, она зальёт все "А", а "В" останется. Я так понял, что самая правая "А" прижата к правой границе.
да, блоки А прижаты к краю, а блоки В по идее должны исчезать..
Ну вот. С боков и сверху помечающую заливку сделать сможешь?
Вот, на картинке.
Сиреневые стрелки залили тех, которые закреплены. В середине один остался.
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 ----------
Из продолжения к моей картинке.
Допустим мы хотим, чтобы оторванные исчезли. Делаем цикл по всем клеткам, если в клетке есть блок, и он не помечен заливкой от краёв, то стираем его.
Если хотим, чтобы он падал, то перебираем клетки сверху вниз, и непомеченные блоки переносим на клетку ниже.
да какой из меня дезайнер? писал игру очень давно, сейчас посмотрел на исходник и понял, что загвоздка была в алгоритме. Я не хочу, чтобы блоки падали, просто нужно ликвидировать блок и по возможности посчитать количество блоков.
Я не понимаю, почему у тебя получается один свободный блок. допустим, в такой ситуации как поступить?
Один свобоный блок остался, потому-что до него не дошла заливка. Затравочные точки были сверху и с боков, а он с ними не соединён.
В новом варианте - см картинку. Голубым обвёл оторванных.
т.е. два блока не считать - нужно ли их изолировать?
Да я разве против? Если тебе надо, то посчитай. Или "изолируй". Я не понимаю что значит "изолировать". Раньше я думал, что это такое состояние группы блоков, когда они находятся в "летящем" состоянии, то есть в процессе игры они оторвались от "заземлённой" части. Также я думал, что наша задача, найти алгоритм, который позволил-бы найти такие части. Но теперь, после твоих вопросов я понимаю, что ты имел ввиду что-то другое. Пожалуйста опиши поподробнее, что значит изолировать?
Так. Это не те, которые я в последнем эскизе обвёл голубым? Тогда какие? Нарисуй эскиз и обведи те, которые хочешь найти, станет понятнее чем на словах.
если сверху блока пустота, тогда { ... }
;)
я совсем запутался..
http://vigilantemma.files.wordpress....out.jpeg?w=614
ld ix,массив 16х12
ld a,(ix-16)
or a
jr z, пустота
тип так)
отдохни, решение придёт
Можно выписать все блоки, имеющие внешнюю границу, а потом по этому списку собрать все существующие границы областей. Внутренние и внешние границы можно отличить друг от друга по знаку накопленного поворота вектора обхода. Внутренние границы исключить. Области, не соприкасающиеся с границей экрана, удалить заливкой.
denpopov, если правильно понял задачу - вот концепция решения "в лоб". После хода, подсчитываете все "группируемые" элементы находящиеся на экране. Берете любой из "группируемых" элементов и проверяете его на предмет "соседства" с краями экрана и другими элементами (в соответствии с игровой "логикой"), добавляя элементы в группу до тех пор пока в группу не будут включены все возможные элементы. Если хоть один из элементов "группы" соседствует с краем экрана, данная группа считается "неудаляемой", в противном случае - данная группы "удалямая". Сравниваем общее количество количество всех элементов и элементов составленных в "группы" - если равно, больше элементов нет, можно делать следующий ход. В противном случае, ищем еще не сгруппированные блоки по вышеприведенному алгориитму.
ээээх, было бы хорошо увидеть работу алгоритма, описанного на словах...пока гонял игру, нашел еще одну ошибку, пытаюсь понять, в чем дело.
плохой из меня игрописатель:(
denpopov, Сперва подсчитываем общее количество элементов на экране (фиолетовый).
Потом, начинаем "группировать" элементы в соответствии с логикой игры. В итоге получается три группы: "красная", "зеленая" и "голубая". "Зеленая" и "голубая" -"изолированные", т.к. не соприкасаются с границами экрана.
Если игровой экран представлен в виде массива - добавляем с каждой из сторон по одному элементу массива и заполняем их определенным значением (обозначил "серым" - это поможет при "сканировании" соседних ячеек в пределах игрового экрана, определить, соприкасается или нет "группа" с границей экрана)
Одновременно с этим считаем количество элементов во всех группах. Если количество элементов во всех группах, не равно ранее подсчитанному количеству - на игровом поле есть неучтенные элементы.
http://img-fotki.yandex.ru/get/9822/..._492f2600_orig
null_device, я верну немного назад - а как быть, если вверху две пары разделены?
висящие морды ds 10. (10 - с потолка) :eek_std:
перебираем от 0 до 15 (по столбикам)
{
флаг=0.
перебираем от 0 до 11 всё сверху-вниз
{
есть морда? :v2_dizzy_mutant:
заносим в "висящие морды".
если флаг!=0, то inc "висящие морды", флаг=0.
нет морды?
флаг=1.
вниз.
}
}
результат - номера морд в массиве "висящие морды" ;)
что скажете?
кажется дошло - помечаем те блоки, что рядом со стеной, потом помечаем блоки, что примыкают к первым, а остальное - трем беспощадно:)
Разобрался с исходником наконец - все манипуляции идут не с массивом, а с экраном сразу. Для определения группы придется с памятью.
ну эт не правильно, насчёт "все манипуляции идут не с массивом, а с экраном"
отделяй логику от представления
ну - отдельно всё просчитал
потом отдельно вывел.
удобнее будет, понятней код, больше возможностей по оптимизации вывода и т.д.
луч рвать не будет, во! %)
хорошо, попробую реализовать описанный алгоритм:)
denpopov, для начала - нужно однозначно описать игровую механику. По снапшоту из первого поста понять ее весьма проблематично.