Идея написать эту игру-головоломку появилась примерно в ноябре 2016 года. Надо сказать, что особых успехов в сборке реального кубика я не достигал никогда. Мой личный рекорд никогда не был меньше минуты. Но само устройство в начале 80-х произвело на меня сильное впечатление.

Идеей стало не повторять многочисленные имитации реального кубика в 3D, а сделать его развертку на плоскость, чтобы было видно сразу все шесть граней:

Скриншот
image

В качестве среды разработки был выбран фирменный Xcode, а в качестве языка — Swift. К тому времени у меня уже был опыт работы с этой средой и языком, поэтому особых сложностей само кодирование вызывать было не должно. Хотя, некоторые моменты алгоритмического характера требовали пеших прогулок и раздумывания над ними. Вот только один пример: на каждом шаге (ходе) пользователя нужно проверять собранность кубика. Если решать задачу в лоб, то можно просто пробегать по элементам массивов и сравнивать их на одинаковость.

Исходный массив (кубик собран, как в самом начале игры) представлен в виде:

var Tnew = [
    [[1, 1, 1], [1, 1, 1], [1, 1, 1]], // синий
    [[2, 2, 2], [2, 2, 2], [2, 2, 2]], // белый
    [[3, 3, 3], [3, 3, 3], [3, 3, 3]], // зеленый
    [[4, 4, 4], [4, 4, 4], [4, 4, 4]], // желтый
    [[5, 5, 5], [5, 5, 5], [5, 5, 5]], // оранжевый
    [[6, 6, 6], [6, 6, 6], [6, 6, 6]]  // красный
]

То уже после сборки можно получить перестановки строк в любом порядке, например, вот так:

var Tnew = [
    [[5, 5, 5], [5, 5, 5], [5, 5, 5]], // оранжевый
    [[3, 3, 3], [3, 3, 3], [3, 3, 3]], // зеленый
    [[1, 1, 1], [1, 1, 1], [1, 1, 1]], // синий
    [[4, 4, 4], [4, 4, 4], [4, 4, 4]], // желтый
    [[2, 2, 2], [2, 2, 2], [2, 2, 2]], // белый
    [[6, 6, 6], [6, 6, 6], [6, 6, 6]]  // красный
]

Но при этом расположении надо считать, что кубик так же успешно собран.

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

При этом движение строки или столбца должно приводить в движение «связанные» с ним строки или столбцы. Все как во взрослом кубике — перемещаете одно — в движение вовлекаются и «соседи».

Но при использовании %device% мы, если и задумываемся над этим, то весьма мимолетно и не особо глубоко. Для нас это как часть картины мира, которая особо и не удивляет. Другое дело — программная модель! Тут уже надо создать искусственную реальность, а потому понимать «реальную реальность» надо достаточно полно.

Были изрисованы и исписаны десятки листов. Иногда заметки или идеи приходилось записывать просто на том, что есть под рукой, чтобы потом уже не потерять их насовсем. И где-то к началу апреля получился работающий прототип программы. Кубик можно было собирать. Но и правило 20 на 80 (или его вариант 30 на 70) работало по полной. Надо было доделать массу сервисных мелочей: таймер сборки, счетчик ходов, какую нибудь сигнализацию об окончании сборки, подключить Game Center. И подумать о возможной монетизации. Это было бы весьма приятным бонусом.

В итоге где то к середине мая программа была готова к тому, чтобы ее можно было начинать тестировать не только на устройстве разработчика. Был оплачен аккаунт разработчика и несколько избранных из разных городов и сёл планеты получили возможность «покрутить» плоский кубик на своих устройствах (программа распространялась через Test Flight).

Что касается локализации, то я сразу решил не делать никаких надписей на экране и тем самым уйти от этой проблемы. Пока это удается.
Экран весьма минималистичен. Пользователь видит классическую развертку кубика на плоскость в виде креста, четыре кнопки: собрать кубик, запутать кубик, сменить фон и показать Game Center. Ну а вверху два счетчика: ходы и время. Время стартует только после нажатия кнопки «Запутать». Если пользователь запутал кубик сам и потом собрал — считаются только ходы.

Впечатления от программы у «аудитории»


Естественно, что меня всегда интересовало мнение тех, кто тестировал программу. Кто-то говорил, что кубик надо делать в 3D, на что я отвечал, что такие варианты кубика в АппСторе уже есть и делать их очередной клон у меня нет никакого интереса. Видимо само магическое слово «3D» уже как то привлекало людей и они считали это хорошей идеей. Кто-то сразу понимал идею развертки. Однако, наблюдения за тестерами показали, что переход «3D -> 2D» у большинства нормальных людей вызывает не иллюзорные сложности. Даже те, кто довольно легко умеют собирать реальный кубик, не могли сразу собрать правильно даже одну грань. Не говоря уже о дальнейшей сборке. Впрочем, каждый может сам попробовать это на себе.

Забавно наблюдать за Game Center. Точнее за появление в нем новых пользователей. Эта штука просто нереально крута! Я сделал в GC две таблицы: время сборки и количество ходов. В них попадает любой, кто соберет кубик полностью. А если при дальнейших сборках какой то результат будет улучшаться, то он будет оставаться в соответствующей таблице. Довольно долгое время в таблицах были только мои результаты, записанные с устройств разных тестеров под их именами. И я потихоньку начал разочаровываться в человечестве. И вот не так давно в таблицы попал совершенно не известный мне персонаж. Сначала он находился в обоих таблицах в нижних строчках. Затем начал уверенно двигаться вверх. Примерно через пару суток он занял верхние строчки обоих таблиц с довольно потрясающими результатами: 1 минута 40 секунд и 80 шагов. Впрочем, его рекорд до сих пор никем не побит в рамках Flat Cubik.

И еще совсем недавно появился второй (!) собравший, который собрал Flat Cubik за 25 минут 01 секунду и 254 хода. И занял пока шестое место в рейтинге. При этом упорства в улучшении своих достижений он не проявляет. По крайней мере лучших результатов от него не появляется.

Что сейчас и дальнейшие планы


Первая версия программы попала в App Store в последних числах июня.
Первой ошибкой было ставить на программу цену в 1$. Первый день принес 6 платных скачиваний, потом число скачиваний упало до 2.
Можно ли считать это провалом? Очень на то похоже… Позже игра стала бесплатной и в настоящее время набрала около 200 скачиваний.
Рекламы нигде не было. Если не считать короткое сообщение в конференции iXBT (внутри одной из тем MacLife).

В дальнейшем планируется добавить баннер AdMob. Была идея сделать undo для ходов пользователя. А так же определенные варианты подсказок ходов. Пока с подсказками все находится на той же стадии прогулок и размышления. Те, кто знает, как собирать кубик, понимают, что от текущего состояния можно прийти к собранному совершенно разными путями.
Да вот хотя бы маленький пример: перестановка 3-х угловых элементов: я знаю вариант в 22 хода и вариант в 8 ходов. Сам использую 8-ми ходовку.

Или вот сама стратегия сборки: самая простая — послойная. Начиная, например, с белого креста, затем углы, затем второй слой, а затем и третий. Но рано или поздно, можно попытаться пойти по варианту: 6 крестов (все грани), а затем 8 углов. В общем путей много.

В разработке сейчас версия для Андроид. Ну, а сейчас программа полностью бесплатна и доступна в АппСторе для всех устройств с установленной iOS 10. Буду рад появлению в таблицах GC новых людей.

P.S.: iOS 10 была выбрана после потери нескольких дней на поиск проблемы во внутренних библиотеках Apple (может потом напишу про это отдельную заметку). Обнаружилось, что проблема отсутствует в версиях iOS, начиная с 10. Чтобы не обходить проблему в более ранних версиях iOS и было принято решение, что Flat Cubik будет работать на устройствах с iOS10+.

PS2: демонстрация сборки кубика
видео

Поделиться с друзьями
-->

Комментарии (9)


  1. DrZlodberg
    22.07.2017 16:51

    При этом движение строки или столбца должно приводить в движение «связанные» с ним строки или столбцы. Все как во взрослом кубике — перемещаете одно — в движение вовлекаются и «соседи».


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


  1. s_suhanov
    22.07.2017 22:05

    Чтоб не проверять все перестановки вида


    var Tnew = [
        [[5, 5, 5], [5, 5, 5], [5, 5, 5]], // оранжевый
        [[3, 3, 3], [3, 3, 3], [3, 3, 3]], // зеленый
        [[1, 1, 1], [1, 1, 1], [1, 1, 1]], // синий
        [[4, 4, 4], [4, 4, 4], [4, 4, 4]], // желтый
        [[2, 2, 2], [2, 2, 2], [2, 2, 2]], // белый
        [[6, 6, 6], [6, 6, 6], [6, 6, 6]]  // красный
    ]

    можно сортировать Tnew по второму элементу второго элемента (центры сторон всегда на своих местах).


  1. s_suhanov
    22.07.2017 22:07

    Еще хотел спросить про расширяемость: размерность "кубика" можно поменять, чтоб "собирать" 5х5, вместо 3х3?


    1. abcdsash
      23.07.2017 00:45
      +1

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

      Одна из основных причин, почему данная цель не преследовалась сразу: разрешение плитки. Для iPhone 5/5s/SE это значение 58*58 точек (соотвественно, 29*29 в координатах экрана). Потому что мне надо было разместить 9*12 плиток на экране + некий «защитный интервал» с каждой стороны по горизонтали. По итогу даже в варианте 3*3 на 5/5s/SE выглядит уже мелковато и, я считаю, где то на грани комфортности. Более мелкая плитка (допустим, 4*4) привела бы к трудностям такого плана: надо было разместить 12*16 плиток. Берем физическое разрешение 5/5s/SE 640*1136 и видим, что 640/14 = 45.7 (можем округлить до 46), то есть 46*46 это физический размер в точках для 1 плитки (или 23*23 логический), делитель 14 — с учетом защитного интервала (экран вытянутый по вертикали, поэтому о вертикали тут не беспокоимся). Уже мелковато совсем. 5*5 дало бы еще более мелкую плитку.


  1. PapaBubaDiop
    22.07.2017 23:34

    1) 6 покупок — невероятная удача.
    2) AdMob при 200 загрузках — не нужен (20 000 загрузок принесут 1 доллар в день)
    3) Что за проблема с iOS<10? Реализация Вашей идеи не подразумевает рисков, на мой дилетантский взгляд.


    1. abcdsash
      23.07.2017 01:16

      в iOS 9.x некорректно работают некоторые функции в SpriteKit
      в iOS 10 (и уже в iOS 11) они работают правильно.
      C учетом статистических данных Apple — доля iOS 9 и младше достаточно мала и продолжает уменьшаться.
      Кроме того, если бы я принял решение запрашивать версию iOS и потом в зависимости от нее вызывать метод из SK или его самодельный аналог. На данном этапе решил этого не делать. Это если кратко.

      Сейчас решил установить симулятор iOS 9, чтобы еще раз посмотреть на то, о чем я говорю. Один и тот же код ведет себя по разному в iOS 9 и iOS 10


  1. LoadRunner
    24.07.2017 09:08

    Пока с подсказками все находится на той же стадии прогулок и размышления. Те, кто знает, как собирать кубик, понимают, что от текущего состояния можно прийти к собранному совершенно разными путями.
    Число Бога для кубика Рубика — 20. Проблемы для подсказки нет — просто для текущего состояния запускается решение и показывается следующий ход для кратчайшего пути.


    1. abcdsash
      24.07.2017 11:50

      коллега, я тоже про это думал…
      есть пара «но»:

      1) к сожалению, мой уровень математической подготовки не достаточен, чтобы получать эти самые 20 ходов из любой текущей комбинации. Это исправимо самообразованием. Но есть и второе «но»:

      2) мне бы хотелось давать пользователю какие то осмысляемые им ходы. Другими словами, чтобы он понимал логику хода. Почему он сделан именно так. Сильно сомневаюсь, что ходы в соотвествии со стратегией «числа Бога» могут быть осмыслены на уровне бытовой логики.

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

      Так ведь?


      1. LoadRunner
        24.07.2017 12:02
        +1

        Учитывая, что «мыслить» послойной сборкой в 2D-плоскости — не самая тривиальная задачка и надо адаптироваться после 3D, то пользователь и сам должен владеть какими-то базовыми стратегиями и знать про Алгоритм Бога. А если не знает — чем не повод и возможность его научить?

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