![]() |
Модераторы: Rickert |
![]() ![]() ![]() |
|
nuclear |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 23.2.2005 Репутация: нет Всего: нет |
Решил забацать сапера. Размерность, кол-во бомб и т.д. задаются в начале. Заполняется массив, перемешиваются бомбы, расставляются цифры, ставятся флажки.... Но вот беда, когда кликаем по пустой области, т.е. там где нет ни бомбы ни цифры, нужно "распахнуть" эту область во все уголки. Но так чтобы там где нет прохода граничащая область не распахивалась. Все как в обычном сапере.
![]() Вроде как написал алгоритм, все работает. Но вот только он очень сложный - реккурсии с тройными вхождениями, много переборов вокруг нажимаемой клетки, причем распространяются такие проверки во все стороны, а потом для каждой новой идут новые проверки - короче тормозит конкретно. Может кто писал сапера, дайте идею алгоритма раскрытия пустых клеток с граничащами цифрами. И еще. Советовать может каждый. Дескать записывай новые клетки .. . проверяй их снова - на деле все гораздо сложнее - нужно проверенные идеи. Представтьте себе лужу неправильной формы на дороге. Если я кликну на край лужи - она должна вся раскрытся, и если я кликну куда-то в центр, она тоже должна распахнуться во все уголки. Причем соседние лужи не соединяющиеся с данной должны быть закрыты. |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 2 Всего: 110 |
можно посмотреть алгоритмы заливки
а вообще, если хочется чтобы именно "распахивалась", можно попробовать следующее: 1. делаем очередь 2. помещаем в нее исследуемую точку 3. берем из очереди очередную ![]() 4. если она пустая, добавляем в очередь всех необработанных соседей 5. показываем текущую клетку 6. если очередь пустая, заканчиваем 7. переходим на (3) скорее всего (не пробовал), распахивание будет происходить в виде ромба, но на маленьких областях будет похоже на обычную волну... -------------------- qqq |
|||
|
||||
~FoX~ |
|
|||
![]() НЕ рыжий!!! ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2819 Регистрация: 8.10.2003 Где: Зеленоград Репутация: нет Всего: 68 |
nuclear
Я что то не понял......клетки которые не "контактируют" с минами - пустые....вот и показывай их в цикле, пока не наткнешься на границу(клутку контактирующую с миной) |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 2 Всего: 110 |
ну нельзя же сразу показывать все пустые клетки - так играть неинтересно будет ![]() если наткнулся на пустую область - ее и показать, но не другие -------------------- qqq |
|||
|
||||
S.A.P. |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2664 Регистрация: 11.6.2004 Репутация: нет Всего: 71 |
Здесь одной рекурсивной функции хватит. Санируй по 4-м направлениям, при этом проверенные клетки запоминай. Тормозить не будет.
|
|||
|
||||
~FoX~ |
|
|||
![]() НЕ рыжий!!! ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2819 Регистрация: 8.10.2003 Где: Зеленоград Репутация: нет Всего: 68 |
А почему все то? |
|||
|
||||
maxim1000 |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 2 Всего: 110 |
это меня немного проглючило ![]() -------------------- qqq |
||||||
|
|||||||
De Gray |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 128 Регистрация: 18.2.2005 Где: Регистрация? Репутация: нет Всего: 4 |
Наросал-- открывает ВСЕ пустые клетки, остаются только мины -- бери их голыми руками. По-моему мнению сапер работает в режиме что-то похоже на Идем от означенной точки влево и вправо, пока не встретится точка, в области которой есть 2(?), соприкасающиеся мины -> получили набор точек, от каждой точек из набора идем вверх и вниз, покуда не будет выполнено
поля открывается на другой интересно играть. --------------------
Извяните, шо мы к вас за поможите обращаимси. |
||||
|
|||||
maxim1000 |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 2 Всего: 110 |
это я виноват: под пустой клеткой я имел в виду клетку, где даже цифра не пишется - т.е. вокруг мин нет
будет глючить для невыпуклых областей (например, кольцо) а вот если после прохода вверх и вниз еще посмотреть, что осталось, то получится один из стандартных алгоритмов заливки (если я не ошибаюсь) -------------------- qqq |
||||
|
|||||
De Gray |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 128 Регистрация: 18.2.2005 Где: Регистрация? Репутация: нет Всего: 4 |
Оно самое.Посмотреть -- убрано, чтоб не тормозило вообще.
1) Почему кольцо -- невупуклая область. 2) Для области образованнной, пространством между 4 -- кольцами(что-то похожее ты имел в виду?)--откроется квдрат, "вписанный в эту область"(Чем меньше открыто, те интереснне играть). Примерно тоже делает и сапер,может ходит туда-сюда-верх-низ ре один раз а 2,3--тоже можно. --------------------
Извяните, шо мы к вас за поможите обращаимси. |
||||
|
|||||
maxim1000 |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 2 Всего: 110 |
1. под кольцом я подразумевал большой круг, из которого вырезали маленький (центры общие) 2. выпуклая область - для каждой пары точек из этой области в нее входит весь отрезок между ними ![]() для кольца это не выполняется (например, если точки симметричны относительно центра) теперь возьмем точку внутри кольца, которая находится на одной горизонтали с центром из нее пройдемся влево и вправо - получится отрезок, лежащий на радиусе большого круга от каждой точки этого отрезка пройдемся вверх и вниз - получим всего лишь сегмент большого круга
а вот с этим хотелось бы поспорить данная функция используется как раз для автоматизации одной простой рутинной операции: если вокруг точки нет мин, то нужно открывать все соседние увеличение доли этих действий в игре как раз снижает ее интерес (задалбывает, проще говоря ![]() -------------------- qqq |
||||
|
|||||
De Gray |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 128 Регистрация: 18.2.2005 Где: Регистрация? Репутация: нет Всего: 4 |
Издеваемся... ![]() --------------------
Извяните, шо мы к вас за поможите обращаимси. |
|||
|
||||
SPrograMMer |
|
|||
![]() Спамер :) ![]() ![]() Профиль Группа: Участник Сообщений: 442 Регистрация: 5.11.2004 Где: Краснодар Репутация: нет Всего: 6 |
млин... знакомы вы с волновой теорией графов?
Все решается ОООООчень просто, рассказать? -------------------- животное = зверь законченный гентушник |
|||
|
||||
nuclear |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 23.2.2005 Репутация: нет Всего: нет |
Хотелось бы обратить ваше внимание еще раз на некоторые факты (не все их учитывали):
1. Всегда нужно ориенитроваться на не выпуклые области (выпуклые будут частным случаем) 2. Возможны случаи когда области соединяются не одним перешейком (циклы, кольца и т.д. о которых уже говорилось) 3. Как и в ВинМаин проходом считается случай, если клетки касаются по диагонали. 4. Открывать нужно не только пустые клетки но и цифры рядом с ними. 5. В центре области может быть кольцо из "земли", а внутри опять облатсь-анклав. |
|||
|
||||
De Gray |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 128 Регистрация: 18.2.2005 Где: Регистрация? Репутация: нет Всего: 4 |
Спой, светик, не стыдись --------------------
Извяните, шо мы к вас за поможите обращаимси. |
|||
|
||||
SPrograMMer |
|
|||
![]() Спамер :) ![]() ![]() Профиль Группа: Участник Сообщений: 442 Регистрация: 5.11.2004 Где: Краснодар Репутация: нет Всего: 6 |
С удовольствием: пью-пью-пью-пью... ![]() Значит, представляем наше поле в виде невзвешенного графа. (что такое граф я думаю понятно) Если взять некую вершину этого графа за корень, то можно пустить волну от этого корня к другим узлам, таким образом, самые ближайшие узлы будут иметь индекс 1, следующие, от 1-ых (да чуть не забыл корень - это 0) но еще не помеченные - 2, и так далее, так можно пройти до любой вершины и решить большое количество задач. Применительно к саперу (поле необязательно представлять в виде графа): при щелчке на ячейку, где нет цифры, мы должны открыть всю область, где этих чифр нет, но смежных с текущей. Делаем так: наша ячейка - корень, помечаем её 0 (да кстати, лучше что быбыло два массива - первый непосредственно поле, в котором в ячейке может быть число от 1-8 - число, 0 - пусто, -1 - мина; и второй - массив, изначально заполненный -1, в котором и будем пускат волну) запоминаем эту ячейку (пара чисел X и Y). Пускаем волну в 4 стороны - влево, вправо, вверх и вниз, если в достугнутой волной полем стоит 0, то есть пусто (это из первого массива), значит во вотором массиве помечаем эту клетку как 0, и теперь данная клетка у нас - вершина, проделываем с ней то ж самое. Когда клетки возле текущей вершины заканчиваются - возвращаемся на уровень ниже - к предыдущей вершине. Как только усе закончится - можно отображать пустые клетки, смотря на второй массив, где ячейки равны 0-ям. Усе! ![]() ![]() ![]() -------------------- животное = зверь законченный гентушник |
|||
|
||||
maxim1000 |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 2 Всего: 110 |
неа... пытаюсь удостовериться, что под одними и теми же словами понимаются одни и те же понятия ![]()
если не ошибаюсь, в моем сообщении и описан волновой алгоритм ![]() -------------------- qqq |
||||
|
|||||
nuclear |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 23.2.2005 Репутация: нет Всего: нет |
А не проще ли так.
Берем пустую клетку. Осматриваемся вокруг нее. Если в округе есть пустые - добавляем их в массив. Осматриваем первый элемент массива - если есть ИНЫЕ пустые, добавляем их в конец нашего же массива. Осматриваем второй элемент массива - если есть ИНЫЕ пустые, опять добавляем их в конец нашего же массива. И так до тех пор пока не дойдем до конца. |
|||
|
||||
De Gray |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 128 Регистрация: 18.2.2005 Где: Регистрация? Репутация: нет Всего: 4 |
Цитата maxim1000, только очередь заменена массивом --------------------
Извяните, шо мы к вас за поможите обращаимси. |
|||
|
||||
@!!ex |
|
|||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 2.3.2005 Репутация: нет Всего: нет |
Как то вы все не так делаете, только в конце начали нормальные алгоритмы предлагать. ИМХО алгоритм заливки уже лет 15(Со времен появления графики) не меняется.
|
|||
|
||||
De Gray |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 128 Регистрация: 18.2.2005 Где: Регистрация? Репутация: нет Всего: 4 |
Очень остроумно... учитывая, что в начале и в конце были предложены ОДИНАКОВЫЕ алгоритмы. --------------------
Извяните, шо мы к вас за поможите обращаимси. |
|||
|
||||
nuclear |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 23.2.2005 Репутация: нет Всего: нет |
Самое печальное, что все свелось примерно к тому что собственно я и реализовал изначально в своей проге. У меня проблема была (и есть) в том, что подобный алгоритм написан на AS, и естесно интерпретирующих скоростей языка явно не хватает.
Конечно, все это можно без проблем закодить и на си и на обджект паскале в Делфе - не вопрос. Просто я где-то видел сапера написанного во флеше, где также имеется притормаживание, но оно заметно меньше чем у меня. Возможно я испольжовал ту же идею, но не совсем оптимизировал свой код. Этим собственно и была вынесена тема на обсуждение. |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 2 Всего: 110 |
в том-то и дело, что алгоритм, который я предложил, приводит к тому, что область как бы "распахивается"
если надо быстро, то тут есть другие алгоритмы: нечто похожее было предоржено:
только надо учесть, что область может быть довольно сложной, а потому придется алгоритм подправить... -------------------- qqq |
|||
|
||||
binisio |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 12.1.2005 Где: санкт-петербург Репутация: 2 Всего: 2 |
nuclear
у меня тоже была подобная проблема: писал игру на as, думал, что так будет шустрее. тормозило сильно. тот же код на си работал намного быстрее. хороший эффект получается при их совместном использовании: все что касается логики - на с++, а вывод на экран, прорисовку - на as. |
|||
|
||||
nuclear |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 23.2.2005 Репутация: нет Всего: нет |
binisio можешь объяснить как ты слепил в одно код на си и ас?
|
|||
|
||||
@!!ex |
|
|||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 2.3.2005 Репутация: нет Всего: нет |
Видимо, я не совсем въезжаю в тему.....
Что есть as? |
|||
|
||||
nuclear |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 23.2.2005 Репутация: нет Всего: нет |
@!!ex ActionScript
|
|||
|
||||
binisio |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 12.1.2005 Где: санкт-петербург Репутация: 2 Всего: 2 |
nuclear
![]() ![]() |
|||
|
||||
@!!ex |
|
|||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 2.3.2005 Репутация: нет Всего: нет |
Я тоже подумал о не допиманном слове asm. Только в контексте с остальным текстом оно ну никак не увязывалось..... ![]() 1) Можно поподробнее об as? 2) Не имеет смысла совмещать ассемблер и С. Дело в том, что в этом случае компилятор не может нормально оптимизировать код. Поэтому нужно либо писать куски на чистом С, либо на чистом асм. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Программирование игр, графики и искуственного интеллекта" | |
|
НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rickert. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |