BobrWombat

BobrWombat

Играю в игры, разрабатываю игры, люблю игры. https://play.google.com/store/apps/developer?id=WombatGames https://yandex.ru/games/developer/76611
На Пикабу
Дата рождения: 1 января
128 рейтинг 0 подписчиков 0 подписок 3 поста 0 в горячем
9

Как я заново написал игру, которую начинал 7 лет назад

Привет, Пикабу! В прошлых постах 1, 2 я рассказывал об играх.

В этом посте хочу рассказать об игре, которую я хотел написать 7 лет назад, но забросил, потому что не придумал как реализовать пару моментов, а потом мне не хватало времени и стало не до написания игр.

О чем игра?

Цели игры: на поле 5x5 собрать руку из 5 карт, в которой будет наилучшая покерная комбинация.
Как видим, цель игра достаточно проста с точки зрения геймплея, но оказалась не так проста с точки зрения разработки, по крайней мере, на тот момент.
Как получилось в итоге можно увидеть на этом видео:

А дальше перейдем к разработке

Разработка

С чего начать разработку карточной игры? С игральных карт.

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

  1. Масть

  2. Достоинство

Создадим скрипт Card, который будет содержать эту информацию. Для удобства заполнения, масть сделаем через перечисления enum

Повторить еще 51 раз и колода карт готова. Теперь можно приступать к реализации геймплея. Как и говорил, нам нужно поле 5х5, заполненное случайными, неповторяющимися картами. Для перемешивания колоды(List<GameObject>) воспользуемся методом ShuffleDeck()

Затем при заполнении будем удалять из колоды карту, которую инициализировали на столе.

Подсчет комбинаций

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

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

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

Как определить, что перед нами флеш-рояль?

Для этого заведем булеву переменную isSameSuit, которая примет значение true, если в нашей руке из 5 карт все будут одной масти. Затем подсчитаем сумму руки, она должна равняться 60 в моей реализации(туз имеет вес -14, а десятка - 10). Если оба этих условия выполняются, то мы нашли его - флеш-рояль! В холдеме вероятность собрать его примерно0.000154%, в моей игре чуточку побольше )

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

Т.к. туз может быть и вначале стрита A, 2, 3, 4, 5 и в его завершении 10, J, Q, K, A, а у нас для туза прописано только высшее достоинство - 14, то комбинация A, 2, 3, 4, 5 не засчитывалась как стрит

Решил я эту коллизию "грязным трюком", если высчитывая разницу я получал ответ отличный от 1, то я проверял, не стоит ли на последнем месте туз, а на предпоследним пятерка. Если это были они, то значит перед нами стрит.

Примерно так был реализован поиск всех комбинаций.

Дальше наступил момент, на котором я застопорился много лет назад: смещение карт и генерация новых. Похожую механику мы можем увидеть у игр 3 в ряд, но как её реализовать у себя тогда я не понимал. В этот раз, подумав несколько дней я формализовал задачу и понял, что вообще требуется.
Если представить, что наше поле - это массив чисел 5х5, а уничтоженные карты это нули, то наша задача - сместить все нули "наверх", а затем на их место сгенерировать новые значения(карты). Тут примеров кода не будет; такое стыдно и нельзя показывать людям : )

На этом закончились самые сложные момент написания. Для поддержания интереса я решил добавить ачивки

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

Шкала заполняется за серию безошибочных комбинаций и после заполнения обнуляется, попутно сгенерировав игровые бонусы(доп. время и доп. очки). Говоря о безошибочности - в игре всего одна комбинация считается ошибочной - старшая карта. За неё можно заработать сброс шкалы, минус 20 очков и 5 секунд времени.

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

Если возникли вопросы, то буду рад ответить в комментариях.

А поиграть можно по ссылкам ниже:
Браузерная версия

Версия для android playmarket

Показать полностью 7
6

Спаси Хрюню, или во что выливается отдых от написания кода

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

Об идее

Идею игру я взял из своих старых заметок, где накидывал идеи игр, которые мне в тот момент казались неплохими. Спустя время, я перечитывал заметки и удалял те, что начинали казаться совсем не интересными. Так что идея текущей игры мне до сих пор кажется не самой плохой, а значит её можно реализовать.

Так в чем смысл игры? Смысл игры максимально прост - нужно с помощью импровизированной катапульты организовать побег хрюшки с фермы. Для ЛЛ: выглядеть это все стало как-то так

Реализация

Как и обычно, игру я писал на Unity.

  1. Первым дело я начал реализовывать катапульту(хотя это скорее требушет). С этим все оказалось достаточно просто как мне это показалось вначале . Создаем объект в форме длинной палки, к нему добавляем Box Collider 2D, чтобы через него не проваливались другие объекты, так же нам понадобится компонент Hinge Joint 2D (шарнирная петля, 1 - на рисунке ниже), который позволяет закрепить объект к точке в пространстве, вокруг которой данный объект может вращаться. Добавим ещё один компонент Box Collider 2D (2 - на рисунке), чтобы при наклоне влево хрюшка не падала с катапульты. Всё, катапульта требушет готова!

2. Создание противовеса. С этим все оказалось ещё проще:

При нажатии левой клавишей мыши или удерживанием тапа по экрану начинаем увеличивать масштаб противовеса(в нашем случае, это тыква) и увеличиваем массу. Делаем это пока не отпустим нажатие или размер не достигнет максимума. В коде это выглядит примерно так.
Можно увидеть переменную canChangeSize, которую добавил, чтобы нельзя было менять масштаб уже после того, как груз летит вниз. Для того, чтобы при создании противовеса - он сразу не падал вниз, я отключил ему гравитацию, а после завершения возвращал её в значение = 1. С реализацией этого механизма я допустил достаточно тривиальную ошибку, но может кто-то тоже столкнется с ней. Изначально в методе ChangeBallSize я менял массу не на Time.deltaTime, а на постоянное число, из-за этого на разных устройство при одном и том же размере груза, его масса существенно отличалась. Напомню, что Update вызывается каждый кадр. В итоге на компьютере метод вызвался каждые 0.006 секунд, а на телефонах примерно раз в 0.017.

3. Создание забора с отверстием

Пока я отлаживал игру, то отверстием в заборе служил префаб, коснувшись которого, уровень был засчитан.

Ближе к концу разработки я начал думать о том, как же на самом деле это должно выглядеть.

Идеи приходили разные: одна изумительней другой
- добавить бочку, через которую будет пролетать хрюня;

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

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

С забором определились. После забора встал вопрос: как обыграть генерацию следующего уровня? Лучшим решением посчитал добавить грузовик, в который хрюня приземляется и покидает ферму. В грузовике есть водитель, который помогает нам :)

4. Внутриигровой контент

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


Ну всё, игра готова?!

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

Чтение статей и книг по геймдеву и костылях в них, не проходит даром. Решением стало изменение высоты пола, в зависимости от массы противовеса. Конец катапульты сталкивается с полом и позволяет запустить снаряд, как максимально вверх, так и вниз.

Вот теперь всё


Подготовим промо-материл, придумаем название, отправим на модерацию, исправим замечание модерации и игра опубликована.

Спасибо, что прочитали статью. Надеюсь, вам понравилось.

Буду рад ответить на ваши вопросы, а

поиграть в игру можно тут

Показать полностью 9
13

Как я создавал свою казуальную игру с "уникальной" идеей

Привет, Пикабу! Тут, в попытках завоевать расположение, можно было бы рассказать, как давно я здесь в режим ридонли. Но Хочу поделиться своим опытом разработки и публикации свой Web-игры.

Об идее:

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

Кстати, нашел на эмуляторе эту игру, вот она:

Тогда мне захотелось придумать что-то своё и я подумал, почему бы не сделать аналогичную игру, но где нужно смешивать цвета, чтобы получить нужный?!

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

Когда-то давно, в студенчестве я уже пробовал написать свою игру на Unity под Android. Я написал небольшую игру про оборону дома от зомби, выпустил её и.... получил 5 установок(одна из которых моя собственная).
Поэтому выбор игрового движка был очевиден, хоть и уверен, что получившуюся игру несложно реализовать на чистом HTML/JS.

Забегая вперед, игра выглядит как-то так:

Про сравнение цветов

До момента создания игры я ничего не знал про сравнение цветов в RGB пространстве, поэтому первая идея, которая пришла мне в голову – это находить расстояние между двумя точками в координатах RGB. Но чем больше я погружался в вопрос, тем отчетливей начинал понимать, что такой подход неверен. Так я пришел к тому, что стоит использовать формулу цветового отличия.

Если кратко: то RGB напрямую никто не сравнивает, а переводят в цветовое пространство Lab, а затем уже сравнивают по формулам, что есть по ссылке выше.

Разработка

Выбрав Юнити я в том числе надеялся, на то, что смогу быстро вспомнить всё, что о нем знаю и начать разработку. В реальности пришлось всё учить чуть ли не заново.

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

Для постепенного усложнения игры я решил вначале генерировать простые цвета, которые можно получить передвинув один или два ползунка в крайние положения.
Сами цвета я объявил в массиве и обращался к ним, пока количество очков не превышало заданного значения. Далее все примеры кода будут на C#.

Попытался вместо картинки использовать код с markdown, но не получилось

Попытался вместо картинки использовать код с markdown, но не получилось

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

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

Для сохранения использовал метод PlayerPrefs, что предлагает сам движок.
Пример записи одного из достижений PlayerPrefs.SetInt(Constants.FIRST_STEP, 1);

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

Примерно так

Примерно так

Сам экран получился таким:

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

Окно обучения

Окно обучения

Публикация

Игрой я решил поделиться на каких-нибудь популярных площадках и заработать миллионы на доширак. Пока игру опубликовал только в Яндекс.Играх, прикрутив рекламу от самой платформы.

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

Когда не показываешь рекламу при первом запуске

Когда не показываешь рекламу при первом запуске

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

Буду рад ответить на вопросы!

Если будет интересно, то игру назвал "Ловец цвета", а поиграть её можно здесь

Ловец Цвета — играть онлайн бесплатно на сервисе Яндекс Игры (yandex.ru)

Показать полностью 7
Отличная работа, все прочитано!

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества