Случайны выбор дневника Раскрыть/свернуть полный список возможностей


Найдено 5319 сообщений
Cообщения с меткой

головоломки - Самое интересное в блогах

Следующие 30  »
rss_rss_hh_new

[Из песочницы] Создание игры «Слова из Слова»

Понедельник, 22 Августа 2016 г. 15:50 (ссылка)

Добрый день! Хочу представить Вашему вниманию проект-игру «Слова из Слова». Относительно недавно я стал изучать web-программирование и, так как лучший учитель — это практика, решил написать свой вариант довольно-таки известной игры «Слова из Слова». Основная цель — использование чистого Javascript без подключения дополнительных библиотек.



image

Вид игрового поля



Описание игры



Задача игрока – из букв представленного на экране слова составлять другие. Составленное слово должно быть нарицательным именем существительным в единственном числе, уменьшительно-ласкательные формы, а также сокращения не принимаются. Минимальная длина – 3 буквы. За каждое отгаданное слово начисляются очки в зависимости от его длины (базовая ставка за каждую букву, умножаемая на коэффициент). Базовая ставка равняется десяти очкам. Коэффициент рассчитывается следующим образом:




  • три буквы – 1;

  • от четырех до пяти букв – 1.25;

  • от шести до семи букв – 1.5;

  • от восьми до девяти букв – 1.75;

  • более девяти букв – 2.



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




  • отгадать 40 проц. возможных слов на уровне (1 000 очков);

  • отгадать три слова, начинающихся на ту же букву, что и слово уровня (500 очков);

  • отгадать все возможные слова на уровне (50 000 очков).



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



Использованные техники и приемы



В ходе работы над приложением использовались элементы подхода MVC (model, view, controller). В отдельные компоненты также вынесено управление звуком, обработка результатов игры и общие методы для всего приложения.



Общая структура приложения
GAME = {
"utils":{}, // общие инструменты
"sounds":{}, // обработка звуков
"view":{}, // представление
"controller":{}, // обработка поведения
"model":{}, // основные данные
"results":{} // обработка результатов
}
GAME.init(place) // инициализация приложения
GAME.namespace(ns_string) // создание пространств имен




В процессе разработки ощутил все преимущества использования замыканий и немедленно вызываемых функций. Так, их использование избавило от постоянного поиска элементов на странице посредством getElementById и т.п.



Пример использования замыканий
controller.play = (function () {
// блокировка множественного нажатия
var cancelClick = false;

return function (letter) {
if (cancelClick) return;

cancelClick = true;

setTimeout(function () {
cancelClick = false;
}, 200)

//код функции
})()




Этапы выполнения приложения



В процессе инициализации приложения создаются все необходимые html-элементы, формируются объекты-списки для упрощения доступа к ним.

Содержимое html до инициализации



Правила



Необходимо составлять слова из показанного на экране слова. Слово должно быть нарицательным именем существительным в единственном числе. Уменьшительно-ласкательные формы, а также сокращения не принимаются. Минимальная длина слова - 3 буквы.



Управление



Чтобы выбрать букву, кликните мышкой. Повторный клик по последней выбранной букве снимает выделение.


Клавиша Esc отменяет ввод всего слова.


Клавиша Backspace (ђ) отменяет ввод последней буквы.



Игровые бонусы



Первая звезда - отгадать 40% возможных слов на уровне. Бонус: 1 000 очков.


Вторая звезда - отгадать три слова, начинающихся на ту же букву, что и слово уровня. Бонус: 500 очков.


Третья звезда - отгадать все возможные слова на уровне. Бонус: 50 000 очков.



Подсказки




Показать определение неотгаданного слова. Стоимость подсказки: 100 очков





Показать неотгаданное слово. Стоимость подсказки: 500 очков.



Элементы интерфейса




Управление звуком.





Вызов игрового меню.





Прогресс на уровне.









Содержимое html после инициализации





Слова из слова


Игрок: 123

Уровень: 1



Карта уровней

https://habrahabr.ru/post/308256/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
NoTrial

Отражения жизни 4: Зов Предков. Коллекционное издание | Reflections of Life 4: Call of the Ancestors CE (Rus) скачать бесплатно

Суббота, 20 Августа 2016 г. 19:27 (ссылка)
allkey.org/poisk-predmet/ot...-predkovce


5338654_ (700x393, 233Kb)



Четвертая часть мистических красочных игр «Зов Предков» из серии «Reflections of Lif» Отражения жизни – невероятная история двух сестер Анны и Алисы в трех волшебных мирах, наполненных магией, опасностями, смертью и возрождением. Некая секта под руководством фанатика Демиена похищает из эзотерического магазина Анны ее сестру в день ее 21-летия. А поводом этому послужила старая фамильная ценность – хрустальный шар, найденный на чердаке в вещах бабушки. Спокойная жизнь Анны переворачивается с ног на голову. Она узнает, что ее сестра Прорицательница, которая рождается раз в тысячу лет. События развиваются с быстротой снежного кома, подведя последнюю черту в жизни Анны, которая встречает Лютера – генерала Темной армии вселившегося в тело Алисы. И теперь главной целью Анны становиться не только возвращение в реальность без помощи Красной женщины из «Игры престолов», но и познание экзорцизма с помощью магических артефактов.

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
Hope_always

Головоломки со спичками

Среда, 17 Августа 2016 г. 18:03 (ссылка)

Это цитата сообщения Н_Филина Оригинальное сообщение

Головоломки со спичками
















 



5358008_33606015golovolomkisospichkamiotvetyepizod2 (700x700, 58Kb)



1. Надо переложить 5 спичек так, чтобы получилось 2 квадрата.

2. Ключик. Переложить 4 спички так, чтобы получилось 3 квадрата.

3. Домик. Переложить 2 спички так, чтобы дом «смотрел» в другую сторону.

4. Совок. Переложить 2 спички так, чтобы листик, лежащий в совке, оказался вне его.

5. Рыбка. Переложить 3 спички так, чтобы рыба «поплыла» назад.

6. Змейка. Переложить 5 спичек так, чтобы получилось 2 квадрата.

7. Корова. Переложить 2 спички так, чтобы корова смотрела в другую сторону.

8. Решетка. Переложить 3 спички так, чтобы получилось 3 квадрата.

9. Убрать 4 спички, чтобы получилось 5 квадратов




0_3f811_d7b8a3af_S (11x11, 1Kb)







 

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
Н_Филина

Головоломки со спичками

Среда, 17 Августа 2016 г. 13:33 (ссылка)














 



5358008_33606015golovolomkisospichkamiotvetyepizod2 (700x700, 58Kb)



1. Надо переложить 5 спичек так, чтобы получилось 2 квадрата.

2. Ключик. Переложить 4 спички так, чтобы получилось 3 квадрата.

3. Домик. Переложить 2 спички так, чтобы дом «смотрел» в другую сторону.

4. Совок. Переложить 2 спички так, чтобы листик, лежащий в совке, оказался вне его.

5. Рыбка. Переложить 3 спички так, чтобы рыба «поплыла» назад.

6. Змейка. Переложить 5 спичек так, чтобы получилось 2 квадрата.

7. Корова. Переложить 2 спички так, чтобы корова смотрела в другую сторону.

8. Решетка. Переложить 3 спички так, чтобы получилось 3 квадрата.

9. Убрать 4 спички, чтобы получилось 5 квадратов




0_3f811_d7b8a3af_S (11x11, 1Kb)







 

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
Марина_Ушакова

Головоломка со спичками

Вторник, 16 Августа 2016 г. 08:47 (ссылка)


000 (620x301, 47Kb)



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

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

[Перевод] Процедурная генерация уровней для игр-головоломок

Пятница, 12 Августа 2016 г. 23:46 (ссылка)





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



Здорово было бы найти способ заставить компьютер сэкономить вам время и решить проблемы, о которых я сказал выше… И именно тут на помощь приходит процедурная генерация!



Необходимо сказать, что существует например только один способ для суммирования векторов, и любой программист, которому оно нужно, должен следовать одинаковым правилам; однако в случае процедурной генерации вы абсолютно свободны. Не существует правильных и неправильных способов. Главное — это результат.



Fruit Dating — правила и особенности





Не так давно мы выпустили игру Fruit Dating для устройств iOS (также она доступна для Android и даже для невыпущенного (на момент релиза игры) Tizen). Это игра-головоломка с простыми правилами. Её цель — соединять пары фруктов одного цвета, проводя пальцем по экрану. Перемещение пальца соответствует наклону игрового поля в нужном направлении. Когда игрок пытается выполнить свою задачу, на его пути встают различные препятствия, такие как камни, машины и другие фрукты. Все подвижные объекты перемещаются в одном направлении. На картинках ниже показан первый уровень, в котором для соединения фруктов требуется 3 хода.











Со временем добавляются новые особенности:




















Односторонние проходы размещаются на границе плитки и ограничивают направления, в которых можно перемещать объекты.
Муравьеды могут смотреть в разных направлениях, но это направление постоянно и не меняется в течение уровня. Когда фрукт находится в направлении взгляда муравьеда, он «стреляет» своим языком и притягивает фрукт к себе.
По лужам могут перемещаться камни, машины и бочки, но не фрукты. Когда фрукт попадает в лужу, он становится грязным, и свидание для него отменяется!
Спящий ёжик стоит на плитке и просыпается, когда его что-то ударит. Если его ударяет бочка, камень или машина, он снова засыпает, потому что они несъедобны. Но когда об него стукается фрукт, ёжик его съедает.




Вы наверно уже заметили, что уровень состоит из плиток; это упрощает работу, потому что каждый уровень может быть представлен как маленькая сетка. Её максимальный размер 8x8 плиток, но всегда есть неподвижная граница, так что «полезная» область не больше 6x6 плиток. Этого может показаться мало, но доказано, что для такого поля можно создать достаточно сложные задачи.



На основании базовых правил (так как дополнительные возможности были добавлены позднее) я начал создавать свой генератор. Сначала я конечно подумал, что кто-то в мире уже решил похожую проблему, так что я начал искать в интернете процедурную генерацию уровней головоломок. Оказалось, что этот вопрос рассматривался не очень широко. Я нашёл всего лишь несколько полезных для меня статей. В основном они были посвящены генерированию/решению уровней для Сокобана. Например:



http://larc.unt.edu/ian/pubs/GAMEON-NA_METH_03.pdf

http://citeseerx.ist.psu.edu/viewdoc/download;jsessionid=52E99748D5C48013A84BA983612AB7C4?doi=10.1.1.47.2303&rep=rep1&type=pdf



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



Инструмент для решения головоломок





Очевидно, что каждый сгенерированный уровень должен проходить тестирование (чтобы понять, можно ли его решить, и насколько сложно это сделать), поэтому сначала я решил создать инструмент для решения уровней. Поскольку на тот момент я учитывал только базовые правила без дополнительных возможностей, у меня возникли следующие идеи для «решателя»:



а) из исходного положения вы можете начать двигаться в любом направлении (влево, вправо, вверх, вниз);

б) из следующего положения можно снова продолжить в любом направлении;

в) в любом положении проверяется соединения фруктов, с поля удаляются совпавшие фрукты и продолжается пункт б), пока на поле не останется несколько фруктов.



Как видите, это простой брутфорс-подход. Итак, количество возможных положений на поле было: 4, 4*4 = 42, 4*4*4 = 43,… 4n. На 10 ходу получалось более миллиона комбинаций поля, а на 25 ходу — 1125899906842624 комбинаций. Ну хорошо, тогда мы можем ограничить максимальное количество ходов, скажем до 10, и нас не будут интересовать более сложные уровни, но здесь скрывается другая опасность. Некоторые из головоломок могут быть созданы или сгенерироваться таким образом, что игрок, сделавший в начале несколько плохих ходов, не сможет завершить уровень. Или же в некоторых уровнях может возникнуть зацикленность состояний на поле. Если алгоритм разветвляется в таком направлении слишком рано, уровень может быть помечен как нерешаемый, даже если есть более короткие ветви с более простым решением. Также если алгоритм нашёл решение, нет никаких гарантий, что оно самое короткое — нужно завершить все ветви, чтобы найти кратчайшее решение. Кроме того, на поле часто возникают такие состояния, что один ход в определённом направлении ничего не изменяет. Посмотрите на третью картинку в части «Fruit Dating — правила и особенности» — ничего не изменится, если мы сдвинемся влево.



Поэтому правила изменились:



а) из текущего положения попробовать двигаться в любом направлении;

б) если состояние на поле изменилось, проверить, новое ли такое состояние, или оно уже было;

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

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



Также есть и другие правила, например, проверка совпадения фруктов и прекращение всего процесса при нахождении решения; кроме того, позже возникли другие правила, связанные с дополнительными возможностями, но базовый инструмент для решения я описал. Он быстро обрывает целые ветви без решения. Кроме глубины решения, он также проверяет родительские положения, сохранённые для каждого состояния на поле, так что в конце можно легко напечатать решение. Давайте рассмотрим это на примере первого уровня игры:







Из исходного положения ходы разветвляются на четыре возможных направления. Пометим их как 1-1, 1-2, 1-3, 1-4. Алгоритм всегда стремится переместиться в следующем порядке: вправо, вверх, влево, вниз. Поскольку для дальнейшего изучения сохраняемых состояний нужно применить стек, первое продолжающее состояние передаётся в стек последним (в нашем случае 1-4). Снова первым ходом является сдвиг вправо (2-1) и поскольку это новое состояние, оно записывается в стек. Следующим становится сдвиг вверх, который приводит к состоянию 2-2. Мы уже были в этом состоянии в первой итерации. Поэтому мы применяем правило г) и обрываем эту ветвь — в стек ничего не записывается. Далее идёт попытка хода влево. Он приводит к новому состоянию (2-3) и оно помещается в стек. Последний ход — сдвиг вниз, но в нём нет различия между 1-4 и 2-4, поэтому мы ничего не помещаем в стек (правило б)… нет нового состояния = ничего не делаем). Теперь верхнее состояние стека — это 2-3. Из него мы перемещаемся вправо и попадаем в состояние 3-1, которое равно состоянию 2-1. Но в 2-1 мы были на второй итерации, так что обрываем эту ветвь. Затем мы двигаемся вверх, фрукты оказываются на соседних плитках, и поскольку это была единственная пара, игра завершается.



Алгоритм работает, хотя он может и не найти кратчайший путь. Он просто берёт первое найденное решение. Чтобы исправить это, я сначала ограничил максимальное количество ходов равным 30. Если решение не находится, я считаю уровень непроходимым. Если решение находится, допустим на 15 ходу, я снова запускаю «решатель» с максимальной глубиной решения 14 (15 — 1). Если решение не находится, то 15 — это кратчайший путь. Если решение найдено например на 13 ходу, я запускаю инструмент с максимальной глубиной 12 (13 — 1). Я продолжаю процесс, пока возвращается какое-нибудь решение. Последнее возвращённое решение является кратчайшим решением.



Генератор





Мы создали «решатель», теперь можно переходить к генератору и проверять с его помощью каждую сгенерированную головоломку.



Фаза генерирования состоит из двух частей:




  • генерирование стен

  • генерирование объектов на поле





Генерирование стен всегда начинается с рисования неподвижной границы поля:







Генерируются случайные параметры, сообщающие, будет ли стена закрашиваться по одной плитке за раз, или по две плитки. В случае двух плиток обеспечивается генерирование случайной симметрии. Она сообщает, где должна располагаться вторая плитка — будет ли она отражена вертикально, горизонтально, повёрнута на 90 градусов или будет комбинация преобразований. В первой сетке на рисунке ниже одновременно закрашивается только одна плитка. Во всех остальных сетках представлены различные примеры случайной симметрии двух плиток:







Количество стен, их длина и направление случайны. Каждая стена начинается со случайной точки на границе. Каждая стена рисуется за одну или несколько итераций. После первой итерации случайно выбирается число между 0 и (длина стены) — 1. Если оно равно нулю, цикл итерации прекращается. Если оно больше нуля, то это число становится длиной следующей части стены. Выбирается случайная точка текущей части стены, направление выбирается случайно, ортогонально к текущей части стены, затем рисуется следующая часть стены. Результат может выглядеть следующим образом (цифрами обозначены итерации):







По картинке видно, что каждая следующая часть стены короче, так что можно быть уверенным, что в какой-то точке стена закончится.



Поскольку все стены начинаются от границы поля, то каждая отдельная плитка была соединена с границей. Для меня это выглядело скучно, поэтому я добавил ещё один этап, на котором генерируются внутренние стены. Внутренние стены не соединены ни с одной имеющейся плиткой. Этап начинается с выбора случайной плитки и проверки того, свободна ли она и плитки в пределах 3x3 от неё. Если это так, то стена БУДЕТ помещена в сетку, и следующая плитка выбирается согласно случайному направлению (это направление случайно выбирается перед тестированием первой плитки). Цикл прерывается, когда условие свободных на 3x3 плиток не выполняется. Обратите внимание на выделенное выше слово «будет». Если вы поместите стену в сетку сразу же и перейдёте к обработке следующей плитки, область в пределах 3x3 никогда не будет свободной, потому что вы только что поместили туда стену. Поэтому я сохраняю все плитки стен во временный массив и одновременно помещаю их в сетку после прекращения цикла.



При генерировании стен некоторые из них могут накладываться друг на друга, и очень вероятно, что создадутся маленькие пространства, или даже исходная область будет разделена на несколько несоединённых областей. Конечно же, мы этого не хотим. Поэтому на следующем этапе я проверяю, какая непрерывная область самая большая, и заполняю остальные стенами.



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



Весь процесс генерирования стен можно посмотреть в этой анимации. Здесь показаны генерирование стен и генерирование внутренних стен, а на последнем кадре пустота в правом нижнем углу заполняется на этапе слияния областей:







После завершения генерирования стен можно начать генерировать объекты. Нам нужна хотя бы одна пара фруктов и ноль или более препятствий (представленных в игре камнями, машинами и бочками).



Будет хорошо, если фрукты располагаются в большинстве случае в углах, в концах коридоров и других подобных местах. Иногда может быть интересным поместить их посередине открытой области, но первое более предпочтительно. Чтобы достичь этого, мы добавить вес каждой свободной плитке с точки зрения притягательности расположения на ней фрукта.



Для концов коридоров, окружённых плитками с трёх сторон, я выбрал вес 6 + Random (3). Для плиток в горизонтальных или вертикальных коридорах я выбрал вес 2. Для углов я выбрал вес 3 + Random (3), а для свободных областей — 1.



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



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



Кстати, с помощью весов можно делать и другие хитрости. Позже я добавил спящего ёжика и муравьеда (их описания приведены в начале статьи). Не имеет смысла помещать их в середине коридора, поэтому для коридоров их вес = 0.



В этой анимации показано расположение на уровне фруктов и препятствий:







Окончательный сгенерированный уровень показан на статичной картинке ниже. Для решения требуется 6 ходов (вправо, вверх, влево, вниз, вправо, вверх). Отлично, через 1-2 минуту после нажатия на кнопку Generate у нас получился интересно выглядящий уровень, прохождение которого возможно через 6 ходов (никто не будет играть в уровни, для прохождения которых нужно 30 ходов!); к тому же, для его поиска нам не пришлось ни капли мучиться. Но… всегда можно сделать чуть-чуть лучше. И с этой точки в нашей статье мы будем пытаться сделать уровни красивее.







Редактор





Генерирование уровней завершилось в предыдущей части. Наш редактор поддерживает drag&drop, так что можно легко перетаскивать объекты, чтобы получить более высокий уровень симметрии. Например, вот так:







После внесения изменений важно повторно протестировать уровень с помощью «решателя». Иногда небольшие изменения могут привести к нерешаемости уровня. В нашем примере изменения повысили количество ходов до решения с шести до семи.



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



Окончательный результат





Процедурная генерация уровней сэкономила нам гигантское количество времени. Несмотря на то, что генератор может создавать и мусор — уровни, которые слишком просто или слишком сложно пройти, уровни, полные препятствий или уродливые уровни — он всё равно сэкономил нам кучу времени. Он также позволил нам выбирать и отбрасывать часть непонравившихся уровней. Если бы мы делали их вручную, это заняло бы месяцы работы. Вот как уровни, сгенерированные в этой статье, выглядят в окончательной игре:







Об авторе: Томас Рыхновски (Tomas Rychnovsky) — инди-разработчик небольших мобильных игр для Android, iOS и Tizen.



Original source: habrahabr.ru.

https://habrahabr.ru/post/307672/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

[Перевод] Процедурная генерация уровней для игр-головоломок

Пятница, 12 Августа 2016 г. 23:46 (ссылка)





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



Здорово было бы найти способ заставить компьютер сэкономить вам время и решить проблемы, о которых я сказал выше… И именно тут на помощь приходит процедурная генерация!



Необходимо сказать, что существует например только один способ для суммирования векторов, и любой программист, которому оно нужно, должен следовать одинаковым правилам; однако в случае процедурной генерации вы абсолютно свободны. Не существует правильных и неправильных способов. Главное — это результат.



Fruit Dating — правила и особенности





Не так давно мы выпустили игру Fruit Dating для устройств iOS (также она доступна для Android и даже для невыпущенного (на момент релиза игры) Tizen). Это игра-головоломка с простыми правилами. Её цель — соединять пары фруктов одного цвета, проводя пальцем по экрану. Перемещение пальца соответствует наклону игрового поля в нужном направлении. Когда игрок пытается выполнить свою задачу, на его пути встают различные препятствия, такие как камни, машины и другие фрукты. Все подвижные объекты перемещаются в одном направлении. На картинках ниже показан первый уровень, в котором для соединения фруктов требуется 3 хода.











Со временем добавляются новые особенности:




















Односторонние проходы размещаются на границе плитки и ограничивают направления, в которых можно перемещать объекты.
Муравьеды могут смотреть в разных направлениях, но это направление постоянно и не меняется в течение уровня. Когда фрукт находится в направлении взгляда муравьеда, он «стреляет» своим языком и притягивает фрукт к себе.
По лужам могут перемещаться камни, машины и бочки, но не фрукты. Когда фрукт попадает в лужу, он становится грязным, и свидание для него отменяется!
Спящий ёжик стоит на плитке и просыпается, когда его что-то ударит. Если его ударяет бочка, камень или машина, он снова засыпает, потому что они несъедобны. Но когда об него стукается фрукт, ёжик его съедает.




Вы наверно уже заметили, что уровень состоит из плиток; это упрощает работу, потому что каждый уровень может быть представлен как маленькая сетка. Её максимальный размер 8x8 плиток, но всегда есть неподвижная граница, так что «полезная» область не больше 6x6 плиток. Этого может показаться мало, но доказано, что для такого поля можно создать достаточно сложные задачи.



На основании базовых правил (так как дополнительные возможности были добавлены позднее) я начал создавать свой генератор. Сначала я конечно подумал, что кто-то в мире уже решил похожую проблему, так что я начал искать в интернете процедурную генерацию уровней головоломок. Оказалось, что этот вопрос рассматривался не очень широко. Я нашёл всего лишь несколько полезных для меня статей. В основном они были посвящены генерированию/решению уровней для Сокобана. Например:



http://larc.unt.edu/ian/pubs/GAMEON-NA_METH_03.pdf

http://citeseerx.ist.psu.edu/viewdoc/download;jsessionid=52E99748D5C48013A84BA983612AB7C4?doi=10.1.1.47.2303&rep=rep1&type=pdf



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



Инструмент для решения головоломок





Очевидно, что каждый сгенерированный уровень должен проходить тестирование (чтобы понять, можно ли его решить, и насколько сложно это сделать), поэтому сначала я решил создать инструмент для решения уровней. Поскольку на тот момент я учитывал только базовые правила без дополнительных возможностей, у меня возникли следующие идеи для «решателя»:



а) из исходного положения вы можете начать двигаться в любом направлении (влево, вправо, вверх, вниз);

б) из следующего положения можно снова продолжить в любом направлении;

в) в любом положении проверяется соединения фруктов, с поля удаляются совпавшие фрукты и продолжается пункт б), пока на поле не останется несколько фруктов.



Как видите, это простой брутфорс-подход. Итак, количество возможных положений на поле было: 4, 4*4 = 42, 4*4*4 = 43,… 4n. На 10 ходу получалось более миллиона комбинаций поля, а на 25 ходу — 1125899906842624 комбинаций. Ну хорошо, тогда мы можем ограничить максимальное количество ходов, скажем до 10, и нас не будут интересовать более сложные уровни, но здесь скрывается другая опасность. Некоторые из головоломок могут быть созданы или сгенерироваться таким образом, что игрок, сделавший в начале несколько плохих ходов, не сможет завершить уровень. Или же в некоторых уровнях может возникнуть зацикленность состояний на поле. Если алгоритм разветвляется в таком направлении слишком рано, уровень может быть помечен как нерешаемый, даже если есть более короткие ветви с более простым решением. Также если алгоритм нашёл решение, нет никаких гарантий, что оно самое короткое — нужно завершить все ветви, чтобы найти кратчайшее решение. Кроме того, на поле часто возникают такие состояния, что один ход в определённом направлении ничего не изменяет. Посмотрите на третью картинку в части «Fruit Dating — правила и особенности» — ничего не изменится, если мы сдвинемся влево.



Поэтому правила изменились:



а) из текущего положения попробовать двигаться в любом направлении;

б) если состояние на поле изменилось, проверить, новое ли такое состояние, или оно уже было;

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

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



Также есть и другие правила, например, проверка совпадения фруктов и прекращение всего процесса при нахождении решения; кроме того, позже возникли другие правила, связанные с дополнительными возможностями, но базовый инструмент для решения я описал. Он быстро обрывает целые ветви без решения. Кроме глубины решения, он также проверяет родительские положения, сохранённые для каждого состояния на поле, так что в конце можно легко напечатать решение. Давайте рассмотрим это на примере первого уровня игры:







Из исходного положения ходы разветвляются на четыре возможных направления. Пометим их как 1-1, 1-2, 1-3, 1-4. Алгоритм всегда стремится переместиться в следующем порядке: вправо, вверх, влево, вниз. Поскольку для дальнейшего изучения сохраняемых состояний нужно применить стек, первое продолжающее состояние передаётся в стек последним (в нашем случае 1-4). Снова первым ходом является сдвиг вправо (2-1) и поскольку это новое состояние, оно записывается в стек. Следующим становится сдвиг вверх, который приводит к состоянию 2-2. Мы уже были в этом состоянии в первой итерации. Поэтому мы применяем правило г) и обрываем эту ветвь — в стек ничего не записывается. Далее идёт попытка хода влево. Он приводит к новому состоянию (2-3) и оно помещается в стек. Последний ход — сдвиг вниз, но в нём нет различия между 1-4 и 2-4, поэтому мы ничего не помещаем в стек (правило б)… нет нового состояния = ничего не делаем). Теперь верхнее состояние стека — это 2-3. Из него мы перемещаемся вправо и попадаем в состояние 3-1, которое равно состоянию 2-1. Но в 2-1 мы были на второй итерации, так что обрываем эту ветвь. Затем мы двигаемся вверх, фрукты оказываются на соседних плитках, и поскольку это была единственная пара, игра завершается.



Алгоритм работает, хотя он может и не найти кратчайший путь. Он просто берёт первое найденное решение. Чтобы исправить это, я сначала ограничил максимальное количество ходов равным 30. Если решение не находится, я считаю уровень непроходимым. Если решение находится, допустим на 15 ходу, я снова запускаю «решатель» с максимальной глубиной решения 14 (15 — 1). Если решение не находится, то 15 — это кратчайший путь. Если решение найдено например на 13 ходу, я запускаю инструмент с максимальной глубиной 12 (13 — 1). Я продолжаю процесс, пока возвращается какое-нибудь решение. Последнее возвращённое решение является кратчайшим решением.



Генератор





Мы создали «решатель», теперь можно переходить к генератору и проверять с его помощью каждую сгенерированную головоломку.



Фаза генерирования состоит из двух частей:




  • генерирование стен

  • генерирование объектов на поле





Генерирование стен всегда начинается с рисования неподвижной границы поля:







Генерируются случайные параметры, сообщающие, будет ли стена закрашиваться по одной плитке за раз, или по две плитки. В случае двух плиток обеспечивается генерирование случайной симметрии. Она сообщает, где должна располагаться вторая плитка — будет ли она отражена вертикально, горизонтально, повёрнута на 90 градусов или будет комбинация преобразований. В первой сетке на рисунке ниже одновременно закрашивается только одна плитка. Во всех остальных сетках представлены различные примеры случайной симметрии двух плиток:







Количество стен, их длина и направление случайны. Каждая стена начинается со случайной точки на границе. Каждая стена рисуется за одну или несколько итераций. После первой итерации случайно выбирается число между 0 и (длина стены) — 1. Если оно равно нулю, цикл итерации прекращается. Если оно больше нуля, то это число становится длиной следующей части стены. Выбирается случайная точка текущей части стены, направление выбирается случайно, ортогонально к текущей части стены, затем рисуется следующая часть стены. Результат может выглядеть следующим образом (цифрами обозначены итерации):







По картинке видно, что каждая следующая часть стены короче, так что можно быть уверенным, что в какой-то точке стена закончится.



Поскольку все стены начинаются от границы поля, то каждая отдельная плитка была соединена с границей. Для меня это выглядело скучно, поэтому я добавил ещё один этап, на котором генерируются внутренние стены. Внутренние стены не соединены ни с одной имеющейся плиткой. Этап начинается с выбора случайной плитки и проверки того, свободна ли она и плитки в пределах 3x3 от неё. Если это так, то стена БУДЕТ помещена в сетку, и следующая плитка выбирается согласно случайному направлению (это направление случайно выбирается перед тестированием первой плитки). Цикл прерывается, когда условие свободных на 3x3 плиток не выполняется. Обратите внимание на выделенное выше слово «будет». Если вы поместите стену в сетку сразу же и перейдёте к обработке следующей плитки, область в пределах 3x3 никогда не будет свободной, потому что вы только что поместили туда стену. Поэтому я сохраняю все плитки стен во временный массив и одновременно помещаю их в сетку после прекращения цикла.



При генерировании стен некоторые из них могут накладываться друг на друга, и очень вероятно, что создадутся маленькие пространства, или даже исходная область будет разделена на несколько несоединённых областей. Конечно же, мы этого не хотим. Поэтому на следующем этапе я проверяю, какая непрерывная область самая большая, и заполняю остальные стенами.



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



Весь процесс генерирования стен можно посмотреть в этой анимации. Здесь показаны генерирование стен и генерирование внутренних стен, а на последнем кадре пустота в правом нижнем углу заполняется на этапе слияния областей:







После завершения генерирования стен можно начать генерировать объекты. Нам нужна хотя бы одна пара фруктов и ноль или более препятствий (представленных в игре камнями, машинами и бочками).



Будет хорошо, если фрукты располагаются в большинстве случае в углах, в концах коридоров и других подобных местах. Иногда может быть интересным поместить их посередине открытой области, но первое более предпочтительно. Чтобы достичь этого, мы добавить вес каждой свободной плитке с точки зрения притягательности расположения на ней фрукта.



Для концов коридоров, окружённых плитками с трёх сторон, я выбрал вес 6 + Random (3). Для плиток в горизонтальных или вертикальных коридорах я выбрал вес 2. Для углов я выбрал вес 3 + Random (3), а для свободных областей — 1.



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



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



Кстати, с помощью весов можно делать и другие хитрости. Позже я добавил спящего ёжика и муравьеда (их описания приведены в начале статьи). Не имеет смысла помещать их в середине коридора, поэтому для коридоров их вес = 0.



В этой анимации показано расположение на уровне фруктов и препятствий:







Окончательный сгенерированный уровень показан на статичной картинке ниже. Для решения требуется 6 ходов (вправо, вверх, влево, вниз, вправо, вверх). Отлично, через 1-2 минуту после нажатия на кнопку Generate у нас получился интересно выглядящий уровень, прохождение которого возможно через 6 ходов (никто не будет играть в уровни, для прохождения которых нужно 30 ходов!); к тому же, для его поиска нам не пришлось ни капли мучиться. Но… всегда можно сделать чуть-чуть лучше. И с этой точки в нашей статье мы будем пытаться сделать уровни красивее.







Редактор





Генерирование уровней завершилось в предыдущей части. Наш редактор поддерживает drag&drop, так что можно легко перетаскивать объекты, чтобы получить более высокий уровень симметрии. Например, вот так:







После внесения изменений важно повторно протестировать уровень с помощью «решателя». Иногда небольшие изменения могут привести к нерешаемости уровня. В нашем примере изменения повысили количество ходов до решения с шести до семи.



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



Окончательный результат





Процедурная генерация уровней сэкономила нам гигантское количество времени. Несмотря на то, что генератор может создавать и мусор — уровни, которые слишком просто или слишком сложно пройти, уровни, полные препятствий или уродливые уровни — он всё равно сэкономил нам кучу времени. Он также позволил нам выбирать и отбрасывать часть непонравившихся уровней. Если бы мы делали их вручную, это заняло бы месяцы работы. Вот как уровни, сгенерированные в этой статье, выглядят в окончательной игре:







Об авторе: Томас Рыхновски (Tomas Rychnovsky) — инди-разработчик небольших мобильных игр для Android, iOS и Tizen.



Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/307672/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_divia

Каким должно быть безопасное знакомство ребенка с Интернетом?

Среда, 10 Августа 2016 г. 13:21 (ссылка)

Сегодня первое знакомство детей с Интернетом происходит уже в младенчестве. И как бы родители ни старались оттянуть момент, когда ребенок уйму времени проводит за компьютером, он все равно наступит. И нельзя говорить, что это плохо, ведь дети в сети ищут информацию. А вот насколько полезной она будет, могут решить только родители, которые посоветуют ребенку те или иные сайты.

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

2749438_bezopasnoe_znakomstvo_rebenka_s_Internetom (700x393, 86Kb)

Гогуль

Свой обзор мы начнем с браузера Гогуль. Этот ресурс был создан специально для родителей, которые хотят, чтобы их малыш развивался, но при этом был защищен от плохой информации. В данном браузере можно найти специальный каталог детских сайтов, которые проверили и педагоги, и психологи.

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

Что еще посмотреть и послушать?

Tvigle

Если вы посетите сайт tvigle.ru, то попадете на страницы где подобраны не просто развлекательные и детские фильмы. Там вы найдете много историй со смыслом и для разных возрастных групп. Эти мультфильмы и фильмы научат доброму, мудрому и полезному.

Детское радио

У вас подрастает меломан? Значит, ему будет полезно послушать музыку на moskva.fm в разделее детское радио. Плейлисты на этой ФМ-станции составлены из отечественных и зарубежных детских песен. Здесь присутствуют композиции из диснеевских и советских мультфильмов, современных анимационных работ, фильмов.

Дисней-ТВ

Сегодня редко можно встретить и ребенка, и взрослого, который бы ничего не знал о работе студии Дисней. Телезрители любых возрастов с удовольствием смотрят и фильмы, и мультфильмы этой киностудии. Мы предлагаем не искать любимые сюжеты в бесконечных списках для скачивания, а внимательно посмотреть на сайт disney.ru. Ребенку будет очень интересно, ведь там есть и каталог игр по мотивам любимых историй. Также на этом сайте есть возможность заниматься творчеством. На ресурсе предлагают разукрасить мультяшных героев, сделать поделку. В общем, здесь можно провести много времени и с пользой.

Караоке

Весело и полезно вы можете провести время всей семьей. На сайте karaoke.ru есть песни на любой вкус. В разделе "детских песен" есть 254 композиции. Посоревнуйтесь, устройте концерт и просто весело проведите время со своим ребенком!

Головоломки

Как известно головоломки развивают логическое мышление, внимательность, усидчивость и многие другие полезные качества. Например онлайн пазлы на puzwell.com придутся по вкусу любому, даже самому взыскательному ребенку. Попробуйте собрать из фрагментов, любимый мультипликационный персонаж. Восторг и хорошее настроение будет обеспечено.

2749438_reklama0 (191x37, 2Kb)

http://di-via.ru/post396080329/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
Divia

Каким должно быть безопасное знакомство ребенка с Интернетом?

Среда, 10 Августа 2016 г. 13:21 (ссылка)


Сегодня первое знакомство детей с Интернетом происходит уже в младенчестве. И как бы родители ни старались оттянуть момент, когда ребенок уйму времени проводит за компьютером, он все равно наступит. И нельзя говорить, что это плохо, ведь дети в сети ищут информацию. А вот насколько полезной она будет, могут решить только родители, которые посоветуют ребенку те или иные сайты.



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



2749438_bezopasnoe_znakomstvo_rebenka_s_Internetom (700x393, 86Kb)



Читать далее...
Метки:   Комментарии (2)КомментироватьВ цитатник или сообщество
Konstancia

10 cамых хитрых головоломок задаваемых при приеме на работу

Воскресенье, 07 Августа 2016 г. 10:36 (ссылка)


10 cамых хитрых головоломок задаваемых при приеме на работу



Читать далее...
Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
NoTrial

Охотники за тайнами 11. Поезд до Хеллсвича. Коллекционное издание скачать бесплатно

Среда, 03 Августа 2016 г. 19:40 (ссылка)
allkey.org/poisk-predmet/ok...llsvichace


5338654_ (700x393, 232Kb)



Наш бесконечно одолеваемый все новыми заданиями Шефа тайной организации Детектив, после завершения опасного дела с таинственным Мстителем, наконец-то получил возможность хоть ненадолго отдохнуть от всех этих поручений и отправиться в заслуженный отпуск, хотя, скорее всего, что без достойного содержания, а просто за собственный счет. Он сел в купе скорого поезда со своим неразлучным Эльфом, который по своим внешним габаритам не то собака, не то мышь, не то просто игра природы. Этот поезд промчался мимо чудесных пейзажей, а в купе тишина, горячий чай и сладкие плюшки. Но тихое и мирное счастье усталого Детектива, как всегда, длилось весьма недолго и внезапно в тамбуре поезда появилась туманная фигура в плаще с капюшоном, которая наглым образом заморозила дверь в купе Детектива, да так быстро, что Эльф чуть не подавился плюшкой! Растопить эту замороженную дверь не удалось даже с помощью всего запаса чая в купе и тогда пришлось Детективу принимать новое послание от Шефа, чтобы решить головоломку с замком на основе великого принципа - три-в-ряд! А выбравшись в тамбур, он увидел, что туманные личности в плащах, парящие на полметра над полом, вовсю хулиганят и даже запросто выбрасывают пассажиров в окна на полном ходу! Данный беспредел не мог оставить его равнодушным и доблестный Детектив вместе с не менее доблестным Эльфом ринулся на выручку мирных пассажиров во всех купе, которым так некстати обломали отдых и сместили все расписание по прибытию скорого поезда!

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
NoTrial

Тайны. Средиземноморская интрига скачать бесплатно

Воскресенье, 31 Июля 2016 г. 15:42 (ссылка)
allkey.org/poisk-predmet/ta...ya-intriga


5338654_ (700x393, 58Kb)



События этого оригинального и весьма увлекательного квеста разворачиваются в Палермо в начале прошлого века. Дедушка главного героя - антиквар, который посвятил всю свою жизнь коллекционированию раритетов и собиранию редких артефактов прошлых эпох. Но некоторые из этих реликвий могут оказаться не только ценными, но и довольно опасными, поскольку за ними давно охотятся представители некоего тайного общества. Приехав в Палермо, будущий наследник многочисленного антиквариата не застал родимого дедулю на месте, но зато обнаружил полный разгром в магазине, а вдобавок к этому какие-то туманные щупальца опутали двери и затем исчезли в старинном зеркале! Поколдовав со старинной тростью, пытливый внучек обнаружил странную записку, явно не от его деда, в которой содержалось двусмысленное приглашение в местную церковь на полночную мессу. Черные мысли от этого приглашения так и поползли в голову нашего юного дарования, поскольку месса в церкви ровно в полночь явно тоже собиралась быть черной! Но беспокойство за своего любимого дедушку и не менее любимый антикварный магазин побудили внука отбросить страхи в сторону и срочно разведать обстановку в этой церкви, где настоятель заботится только о новых пожертвованиях, а сами служители явно не пропитаны духом святости!

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
Ksu11111

Головоломки от Тины Канделаки

Воскресенье, 31 Июля 2016 г. 12:40 (ссылка)






1.

1 (514x700, 387Kb)



Читать далее...
Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество

Следующие 30  »

<головоломки - Самое интересное в блогах

Страницы: [1] 2 3 ..
.. 10

LiveInternet.Ru Ссылки: на главную|почта|знакомства|одноклассники|фото|открытки|тесты|чат
О проекте: помощь|контакты|разместить рекламу|версия для pda