Модераторы: Rickert

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Пишем сапера 
:(
    Опции темы
nuclear
Дата 4.3.2005, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 23.2.2005

Репутация: нет
Всего: нет



Решил забацать сапера. Размерность, кол-во бомб и т.д. задаются в начале. Заполняется массив, перемешиваются бомбы, расставляются цифры, ставятся флажки.... Но вот беда, когда кликаем по пустой области, т.е. там где нет ни бомбы ни цифры, нужно "распахнуть" эту область во все уголки. Но так чтобы там где нет прохода граничащая область не распахивалась. Все как в обычном сапере. smile

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

Может кто писал сапера, дайте идею алгоритма раскрытия пустых клеток с граничащами цифрами.

И еще. Советовать может каждый. Дескать записывай новые клетки .. . проверяй их снова - на деле все гораздо сложнее - нужно проверенные идеи.

Представтьте себе лужу неправильной формы на дороге. Если я кликну на край лужи - она должна вся раскрытся, и если я кликну куда-то в центр, она тоже должна распахнуться во все уголки. Причем соседние лужи не соединяющиеся с данной должны быть закрыты.
PM MAIL   Вверх
maxim1000
Дата 4.3.2005, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 2
Всего: 110



можно посмотреть алгоритмы заливки
а вообще, если хочется чтобы именно "распахивалась", можно попробовать следующее:
1. делаем очередь
2. помещаем в нее исследуемую точку
3. берем из очереди очередную smile точку
4. если она пустая, добавляем в очередь всех необработанных соседей
5. показываем текущую клетку
6. если очередь пустая, заканчиваем
7. переходим на (3)
скорее всего (не пробовал), распахивание будет происходить в виде ромба, но на маленьких областях будет похоже на обычную волну...


--------------------
qqq
PM WWW   Вверх
~FoX~
Дата 4.3.2005, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: нет
Всего: 68



nuclear
Я что то не понял......клетки которые не "контактируют" с минами - пустые....вот и показывай их в цикле, пока не наткнешься на границу(клутку контактирующую с миной)


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
maxim1000
Дата 4.3.2005, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 2
Всего: 110



Цитата
Я что то не понял......клетки которые не "контактируют" с минами - пустые....вот и показывай их в цикле, пока не наткнешься на границу(клутку контактирующую с миной)

ну нельзя же сразу показывать все пустые клетки - так играть неинтересно будет smile
если наткнулся на пустую область - ее и показать, но не другие


--------------------
qqq
PM WWW   Вверх
S.A.P.
Дата 4.3.2005, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2664
Регистрация: 11.6.2004

Репутация: нет
Всего: 71



Здесь одной рекурсивной функции хватит. Санируй по 4-м направлениям, при этом проверенные клетки запоминай. Тормозить не будет.
PM MAIL   Вверх
~FoX~
Дата 4.3.2005, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: нет
Всего: 68



Цитата
ну нельзя же сразу показывать все пустые клетки

А почему все то?


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
maxim1000
Дата 4.3.2005, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 2
Всего: 110



Цитата
клетки которые не "контактируют" с минами - пустые....вот и показывай их в цикле, пока не наткнешься на границу(клутку контактирующую с миной)

Цитата
ну нельзя же сразу показывать все пустые клетки

Цитата
А почему все то?

это меня немного проглючило smile


--------------------
qqq
PM WWW   Вверх
De Gray
Дата 4.3.2005, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 18.2.2005
Где: Регистрация?

Репутация: нет
Всего: 4



Цитата(maxim1000 @ 4.3.2005, 16:09)
можно посмотреть алгоритмы заливки
а вообще, если хочется чтобы именно "распахивалась", можно попробовать следующее:
1. делаем очередь
2. помещаем в нее исследуемую точку
3. берем из очереди очередную  точку
4. если она пустая, добавляем в очередь всех необработанных соседей
5. показываем текущую клетку
6. если очередь пустая, заканчиваем
7. переходим на (3)
скорее всего (не пробовал), распахивание будет происходить в виде ромба, но на маленьких областях будет похоже на обычную волну

Наросал-- открывает ВСЕ пустые клетки, остаются только мины -- бери их голыми руками.
По-моему мнению сапер работает в режиме что-то похоже на
Идем от означенной точки влево и вправо, пока не встретится точка, в области которой есть 2(?), соприкасающиеся мины -> получили набор точек, от каждой точек из набора идем вверх и вниз, покуда не будет выполнено
Цитата
пока не встретится точка, в области которой есть 2(?), соприкасающиеся мины
. 1 раз. Просто и незатейливо, часть
поля открывается на другой интересно играть.
--------------------
Извяните, шо мы к вас за поможите обращаимси.
PM MAIL   Вверх
maxim1000
Дата 4.3.2005, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 2
Всего: 110



Цитата
Наросал-- открывает ВСЕ пустые клетки, остаются только мины -- бери их голыми руками

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

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


--------------------
qqq
PM WWW   Вверх
De Gray
Дата 4.3.2005, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 18.2.2005
Где: Регистрация?

Репутация: нет
Всего: 4



Цитата(maxim1000 @ 4.3.2005, 20:10)

не ошибаюсь

Оно самое.Посмотреть -- убрано, чтоб не тормозило вообще.

Цитата(maxim1000 @ 4.3.2005, 20:10)

для невыпуклых областей

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

--------------------
Извяните, шо мы к вас за поможите обращаимси.
PM MAIL   Вверх
maxim1000
Дата 4.3.2005, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 2
Всего: 110



Цитата
1) Почему кольцо -- невупуклая область

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

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

Цитата
Чем меньше открыто, те интереснне играть

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


--------------------
qqq
PM WWW   Вверх
De Gray
Дата 5.3.2005, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 18.2.2005
Где: Регистрация?

Репутация: нет
Всего: 4



Цитата(maxim1000 @ 4.3.2005, 20:41)
выпуклая область - для каждой пары точек из этой области в нее входит весь отрезок между ними

Издеваемся... smile
--------------------
Извяните, шо мы к вас за поможите обращаимси.
PM MAIL   Вверх
SPrograMMer
Дата 6.3.2005, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Спамер :)
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 5.11.2004
Где: Краснодар

Репутация: нет
Всего: 6



млин... знакомы вы с волновой теорией графов?
Все решается ОООООчень просто, рассказать?


--------------------
животное = зверь
законченный гентушник
PM MAIL ICQ Jabber   Вверх
nuclear
Дата 6.3.2005, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 23.2.2005

Репутация: нет
Всего: нет



Хотелось бы обратить ваше внимание еще раз на некоторые факты (не все их учитывали):
1. Всегда нужно ориенитроваться на не выпуклые области (выпуклые будут частным случаем)
2. Возможны случаи когда области соединяются не одним перешейком (циклы, кольца и т.д. о которых уже говорилось)
3. Как и в ВинМаин проходом считается случай, если клетки касаются по диагонали.
4. Открывать нужно не только пустые клетки но и цифры рядом с ними.
5. В центре области может быть кольцо из "земли", а внутри опять облатсь-анклав.
PM MAIL   Вверх
De Gray
Дата 6.3.2005, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 18.2.2005
Где: Регистрация?

Репутация: нет
Всего: 4



Цитата(SPrograMMer @ 6.3.2005, 11:46)
Все решается ОООООчень просто, рассказать

Спой, светик, не стыдись
--------------------
Извяните, шо мы к вас за поможите обращаимси.
PM MAIL   Вверх
SPrograMMer
Дата 6.3.2005, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Спамер :)
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 5.11.2004
Где: Краснодар

Репутация: нет
Всего: 6



Цитата(De @ 6.3.2005, 17:41)
Спой, светик, не стыдись

С удовольствием: пью-пью-пью-пью... smile

Значит, представляем наше поле в виде невзвешенного графа. (что такое граф я думаю понятно)
Если взять некую вершину этого графа за корень, то можно пустить волну от этого корня к другим узлам, таким образом, самые ближайшие узлы будут иметь индекс 1, следующие, от 1-ых (да чуть не забыл корень - это 0) но еще не помеченные - 2, и так далее, так можно пройти до любой вершины и решить большое количество задач.
Применительно к саперу (поле необязательно представлять в виде графа):
при щелчке на ячейку, где нет цифры, мы должны открыть всю область, где этих чифр нет, но смежных с текущей. Делаем так: наша ячейка - корень, помечаем её 0 (да кстати, лучше что быбыло два массива - первый непосредственно поле, в котором в ячейке может быть число от 1-8 - число, 0 - пусто, -1 - мина; и второй - массив, изначально заполненный -1, в котором и будем пускат волну) запоминаем эту ячейку (пара чисел X и Y). Пускаем волну в 4 стороны - влево, вправо, вверх и вниз, если в достугнутой волной полем стоит 0, то есть пусто (это из первого массива), значит во вотором массиве помечаем эту клетку как 0, и теперь данная клетка у нас - вершина, проделываем с ней то ж самое. Когда клетки возле текущей вершины заканчиваются - возвращаемся на уровень ниже - к предыдущей вершине. Как только усе закончится - можно отображать пустые клетки, смотря на второй массив, где ячейки равны 0-ям.
Усе! smile smile smile


--------------------
животное = зверь
законченный гентушник
PM MAIL ICQ Jabber   Вверх
maxim1000
Дата 7.3.2005, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 2
Всего: 110



Цитата
Издеваемся...

неа... пытаюсь удостовериться, что под одними и теми же словами понимаются одни и те же понятия smile
Цитата
то можно пустить волну от этого корня к другим узлам

если не ошибаюсь, в моем сообщении и описан волновой алгоритм smile


--------------------
qqq
PM WWW   Вверх
nuclear
Дата 7.3.2005, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 23.2.2005

Репутация: нет
Всего: нет



А не проще ли так.
Берем пустую клетку. Осматриваемся вокруг нее. Если в округе есть пустые - добавляем их в массив.
Осматриваем первый элемент массива - если есть ИНЫЕ пустые, добавляем их в конец нашего же массива.
Осматриваем второй элемент массива - если есть ИНЫЕ пустые, опять добавляем их в конец нашего же массива. И так до тех пор пока не дойдем до конца.
PM MAIL   Вверх
De Gray
Дата 8.3.2005, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 18.2.2005
Где: Регистрация?

Репутация: нет
Всего: 4



Цитата(nuclear @ 7.3.2005, 20:43)
А не проще ли так.
Берем пустую клетку. Осматриваемся вокруг нее. Если в округе есть пустые - добавляем их в массив.
Осматриваем первый элемент массива - если есть ИНЫЕ пустые, добавляем их в конец нашего же массива.
Осматриваем второй элемент массива - если есть ИНЫЕ пустые, опять добавляем их в конец нашего же массива. И так до тех пор пока не дойдем до конца.

Цитата maxim1000, только очередь заменена массивом

--------------------
Извяните, шо мы к вас за поможите обращаимси.
PM MAIL   Вверх
@!!ex
Дата 8.3.2005, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 2.3.2005

Репутация: нет
Всего: нет



Как то вы все не так делаете, только в конце начали нормальные алгоритмы предлагать. ИМХО алгоритм заливки уже лет 15(Со времен появления графики) не меняется.
PM MAIL   Вверх
De Gray
Дата 8.3.2005, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 18.2.2005
Где: Регистрация?

Репутация: нет
Всего: 4



Цитата
Как то вы все не так делаете, только в конце начали нормальные алгоритмы предлагать. ИМХО алгоритм заливки уже лет 15(Со времен появления графики) не меняется.

Очень остроумно... учитывая, что в начале и в конце были предложены ОДИНАКОВЫЕ алгоритмы.
--------------------
Извяните, шо мы к вас за поможите обращаимси.
PM MAIL   Вверх
nuclear
Дата 10.3.2005, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 23.2.2005

Репутация: нет
Всего: нет



Самое печальное, что все свелось примерно к тому что собственно я и реализовал изначально в своей проге. У меня проблема была (и есть) в том, что подобный алгоритм написан на AS, и естесно интерпретирующих скоростей языка явно не хватает.
Конечно, все это можно без проблем закодить и на си и на обджект паскале в Делфе - не вопрос. Просто я где-то видел сапера написанного во флеше, где также имеется притормаживание, но оно заметно меньше чем у меня. Возможно я испольжовал ту же идею, но не совсем оптимизировал свой код. Этим собственно и была вынесена тема на обсуждение.
PM MAIL   Вверх
maxim1000
Дата 10.3.2005, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 2
Всего: 110



в том-то и дело, что алгоритм, который я предложил, приводит к тому, что область как бы "распахивается"
если надо быстро, то тут есть другие алгоритмы:
нечто похожее было предоржено:
Цитата(De @ 4.3.2005, 18:05)
Идем от означенной точки влево и вправо, пока не встретится точка, в области которой есть 2(?), соприкасающиеся мины -> получили набор точек, от каждой точек из набора идем вверх и вниз, покуда не будет выполнено

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


--------------------
qqq
PM WWW   Вверх
binisio
Дата 11.3.2005, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 12.1.2005
Где: санкт-петербург

Репутация: 2
Всего: 2



nuclear
у меня тоже была подобная проблема: писал игру на as, думал, что так будет шустрее. тормозило сильно. тот же код на си работал намного быстрее. хороший эффект получается при их совместном использовании: все что касается логики - на с++, а вывод на экран, прорисовку - на as.
PM MAIL WWW   Вверх
nuclear
Дата 11.3.2005, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 23.2.2005

Репутация: нет
Всего: нет



binisio можешь объяснить как ты слепил в одно код на си и ас?
PM MAIL   Вверх
@!!ex
Дата 12.3.2005, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 2.3.2005

Репутация: нет
Всего: нет



Видимо, я не совсем въезжаю в тему.....
Что есть as?
PM MAIL   Вверх
nuclear
Дата 12.3.2005, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 23.2.2005

Репутация: нет
Всего: нет



@!!ex ActionScript
PM MAIL   Вверх
binisio
Дата 14.3.2005, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 12.1.2005
Где: санкт-петербург

Репутация: 2
Всего: 2



nuclear
smile сори, я думал речь идет о аssembler smile
PM MAIL WWW   Вверх
@!!ex
Дата 14.3.2005, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 2.3.2005

Репутация: нет
Всего: нет



Цитата(binisio @ 14.3.2005, 12:28)
nuclear
smile сори, я думал речь идет о аssembler smile

Я тоже подумал о не допиманном слове asm. Только в контексте с остальным текстом оно ну никак не увязывалось..... smile поэтому и спросил.........

1) Можно поподробнее об as?

2) Не имеет смысла совмещать ассемблер и С. Дело в том, что в этом случае компилятор не может нормально оптимизировать код.
Поэтому нужно либо писать куски на чистом С, либо на чистом асм.
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование игр, графики и искуственного интеллекта"
Rickert

НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.

  • Литературу, связанную с программированием графики, обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы связанные с программированием графики и мультимедии на языках С++ и Delphi
  • Вопросы по реализации алгоритмов рассматриваются здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема »


 




[ Время генерации скрипта: 0.1121 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.