Японский дурак

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

Игра очень простая, быстрая и азартная. Один на один. Колода 36 карт. Разыгрывалось 18 взяток. Кто брал меньшее число взяток — тот мыл тарелки. Например, я выиграл 11 взяток, соперник — 7. Неудачник отправлялся мыть 11 — 7 = 4 посудины. Было выгодно проигрывать первые раздачи, при наличии слегка запачканных вилок, чайных ложек и стаканов. Под конец бедолагам оставались лишь жирные сковородки и неподъемные кастрюли.

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

Мотивация


С появлением Xcode 6.4 я стал настолько ленив, что выпускал игры, на разработку которых уходило не более 48 часов грязного времени. Я долго зрел для создания японского дурака. Думал, ворочался перед сном. Толчком для старта послужил неожиданный всплеск популярности карточных игр для iOS.
Судите сами, мои старые карточные игры (Кинг и Диабло) приносили в течении последних 3 лет по 1 доллару в день. И вдруг последние полгода Admob и Chartboost реклама стала приносить на порядок больше. Доходы от Admob выросли до $2-$10 в день с приложения. Без всяких манипуляций с моей стороны.

image
Рис. 1 Доходы от Chartboost за последнее воскресенье от карточных игр.

Был еще повод создать эту игру, но повод печальный. Эх-эх…

Монетизация


В Японского я тоже поместил показ рекламы. Но с интересом. Если игрок набирает нужное число побед — реклама отключается. Я отключил рекламу на своем iPod за 8 часов непрерывной игры.
Какие использовать рекламные площадки?
Несмотря на увлекательный доклад про аукцион второй цены, прочитанный golubevpavel на Мобильных Белых Ночах пару недель назад, я в целях экономии времени оставил прежнюю связку рекламных площадок.

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

Разработка


Все сделал на Obj-C, к Swift отношусь настороженно, а документацию-то почитываю.

Дизайн


Если принять логическую ширину экрана в 320 точек, то оптимальный размер игральной карты — 66 на 96 пикселей. При этом карта описывается как UIView, содержащий 4 UIImageView.

image
Рис. 2 Образец игральных карт

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

В свою очередь большие лицевые картинки игральных карт являются составными — голова героя, прическа (8 штук), глаза (7 штук), рот (6 штук) и рубашка (4). Эти же элементы я использую для выбора соперника — всего 8×7*6×4 = 1200 уникальных персонажей с различной манерой поведения.

Для отображения лично хозяина айФона, как главного героя, я использую аватарку из Game Center. Поскольку алгоритм выдергивания личной фотографии из GC мной не найден, рискну предложить свой вариант. Критика приветствуется.

-(void)authenticateLocalPlayer{
    GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
    localPlayer.authenticateHandler = ^(UIViewController *viewController, NSError *error){
        if (viewController != nil) {
// зарегистрироваться бы
            [self presentViewController:viewController animated:YES completion:nil];
        } else {
// аа!! уже зарегистрирован
            if ([GKLocalPlayer localPlayer].authenticated) {
                // Get the default leaderboard identifier.
                [[GKLocalPlayer localPlayer] loadDefaultLeaderboardIdentifierWithCompletionHandler:^(NSString *leaderboardIdentifier, NSError *error) {
                    if (error != nil) {
                        NSLog(@"%@", [error localizedDescription]);
                    }
                }];
// А вот тут сцуко выдергиваем твое фото                
                [[GKLocalPlayer localPlayer]  loadPhotoForSize:GKPhotoSizeSmall withCompletionHandler:^(UIImage *photo, NSError *error) {
                    if (photo != nil)
                    {
// и запихиваем его во View, где морда героя будет светиться при просмотре текущего счета
                        [scoreView storePhoto: photo];
                    }
                    if (error != nil)
                    {
                        NSLog(@"%@", [error localizedDescription]);
                    }
                }];
            }
        }
    };
}

...
   IBOutlet UIImageView *myPhoto;
...

-(void) storePhoto: (UIImage*) photo
{
    myPhoto.image = photo;
}



Трюки разные всякие


Раскруткой игр я не занимаюсь. Дело это совершенно для профессионалов или бездельников. Платные игры без раскрутки вообще не приносят загрузок. А Вы не знали? В день в магазине Apple появляются 1000+ игр (тысяча, Карл!), и платные никто не видит. Бесплатные также никто не видит, если о них никто-никто не расскажет.

Я использую простой трюк — игра всегда платная, но раз в 2 недели объявляется бесплатной на 2 дня. Эти сроки (2 недели и 2 дня) проверены мной на 100 авторских играх и им можно верить. Иногда распродажу можно делать 3 дня. Лучшее время для sales = это воскресенье+понедельник. При этаком трюке некоторые игры получают до 500 скачек. А бывает 20. Здесь уже важно название, описание, картинки, видео.
Видео для игры делается в связке QuickTime (сдергивает 30 секундный ролик с экрана пришпиленного iPhone) и HandBreak для редактирования видео в правильный формат 30 кадров в секунду.

Пример видео имеется в магазине.

Еще трюк


Я выпускаю всегда два приложения — отдельно для iPhone и отдельно для iPad. Хотя они универсальные. Зачем? Два абсолютно одинаковых приложения — отличный полигон для эксперимента с рекламой, ключевыми словами, иконкой и прочей атрибутикой. Что увеличивает загрузку, а что — тормозит. Что использовать для interstitial — Гугл или Чартбуст (ЧартБуст — правильный ответ). Возможно, есть еще какие-то плюсы от дуализма. Минусов не замечал. Впрочем мужчины меня поймут, у нас много что продублировано в организме. И лишним это никто не считает.

Правила игры

Правила игры в японского дурака для двоих

Играют двое. Колода 36 карт. Каждому игроку на руки по 6 карт, 6 карт рубашкой вверх на стол, на каждую закрытую карту рубашкой вниз — еще по карте.
Ходит игрок, взявший последнюю взятку или следующий за раздавшим карты.
Ходить можно любой открытой картой или картой с руки.
В ответ противник должен положить карту обязательно той же масти. Если нет масти — обязательно козырь.
Взятку из двух карт забирает тот, чья карты старше.
прим. Козырь назначает противник раздающего по своим первым трем картам.

Надеюсь, было нескучно.

P.S. По инерции от создания японского дурака я разработал классический деберц и уже играю в него. Это любимейшая игра выпускников мех-мата МГУ 80-ых годов. Если есть желающие (и знающие правила) получить игру на свой айФон на стадии тестирования — шлите мне свой Apple ID.

Экран игры в Деберц
image

© Habrahabr.ru