Эрудит: многослов

Вышло новое обновление для Эрудита iOS.

Что нового в версии 4.0.1

– Новый режим «Несколько слов за ход»
– Выбор подсказки из множества вариантов
– Набор фирменных стикеров для iMessage
– Незначительные изменения в интерфейсе
– Исправление ошибок и улучшение производительности

«Несколько слов за ход» – это режим, в котором играют по классическим правилам Эрудита. За каждый ход вы можете составить одно, два, три или более слов из имеющихся фишек. Помните, что этот режим отличается от старого еще и тем, что любая последовательность букв по горизонтали и вертикали должна являться словом. Т.е. в игре не допускается появление на поле случайных буквосочетаний, не представляющих собою слов.

Лаптичка возвращается

Я не из тех, кто любит навсегда оставлять прошлое. Я до сих пор считаю, что Лапта достаточно хороша (особенно для дебютного проекта), чтобы уйти в забытие. Поэтому за эти выходные я пересмотрел код, почистил его и отправил обновление.
– Исправление физики
– Повыше динамичность
– Без рекламы
– Без шаринга
– Без промоэффектов
– Частичная поддержка длинных айФонов
Посмотрю на статистику, если еще есть игруны, то будут еще обновления.M5CLez0V8q8

Решение проблемы с неудаляемыми играми

Существует официальный баг в Game Center API, когда из списка не удаляется GKTurnBasedMatch. Баг достаточно распространенный, он происходит главным образом тогда, когда активный участник покидает игру (вызов participantQuitInTurnWithOutcome:…) и удаляет ее из своего списка матчей. Игра получает какое-то неверное состояние, после чего остальные игроки не могут ее удалить из списка. Причем не могут как из интерфейса матч-мэйкера, так и вызовом removeWithCompletionHandler:… Возвращается ошибка номер 17 (Error=17) о том, что какие-то параметры заданы неверно. При этом сам матч может иметь уже статус завершенного GKTurnBasedMatchStatusEnded!

Как я уже отметил, Apple призналась в баге, но не исправила до сих пор.

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

Суть в том, чтобы несмотря на завершенность матча попытаться (в случае возникновения ошибки) завершить свой ход, передав его любому другому участнику, затем выйти из игры ВНЕ хода и снова отправить запрос на завершения матча. Этот workaround помог мне со всеми неудаляемыми играми!

Вот код:

- (void) removeGameFromGC
{

    [_match removeWithCompletionHandler:
     ^(NSError *error) {
         if(!error)
         {
             DLog(@"match removed!");
         }
         else
         {
             [self reportError:error];

             GKTurnBasedParticipant *nextParticipant = nil;
             for (GKTurnBasedParticipant *participant in _match.participants)
             {
                 participant.matchOutcome = GKTurnBasedMatchOutcomeTied;
                 if(![TurnBasedHelper isHeLocal:participant.playerID])
                     nextParticipant = participant;
             }

             [_match endTurnWithNextParticipants:@[nextParticipant]
                                     turnTimeout:GKTurnTimeoutDefault
                                       matchData:nil
                               completionHandler:
              ^(NSError *error)
              {
                  if (error)
                  {
                      [self reportError:error];
                  }

                  [_match participantQuitOutOfTurnWithOutcome:GKTurnBasedMatchOutcomeQuit
                                        withCompletionHandler:
                   ^(NSError *error)
                   {
                       if (error)
                       {
                           [self reportError:error];
                       }
                       [_match removeWithCompletionHandler:^(NSError *error)
                        {
                            if (error)
                            {
                                [self reportError:error];
                            }
                        }];
                   }];
              }];
         }

     }];
}

Распознование рукописных цифр на iPhone

Фуф! Наконец-то, я добился того, чтобы оно работало более менее нормально. Итак, распознавание рукописных цифр на iPhone. Используется 5-слойная сверточная нейронная сеть.  Сеть натренерована на базе MNIST, которая содержит 60000 образцов рукописных цифр (на каждую, вроде бы, итого 600000). Вдохновлялся этой статьей. Сеть написал сам, но тренеровал ее программой из статьи. Пришлось поднять виртуальную WinXp, поставить на ней VC++ 6, собрать проект, дописать нормальный экспортер данных (по умолчанию был на MFC – CArchive, который вообще некорректно работал и не загружал тестовые данные). Очень долго шло обучение, понадобилось несколько часов. И оно все еще идет… Я периодически скидываю дамп нейросети себе в проект.

Конечно, результат далек от совершенства. Например, эта сеть отказывается воспринимать мою цифру 6, всегда говорит 5. Пришлось писать специальный твик (по-русски – костыль), которые анализирует кривую и по некоторым статистическим данным различает шестерку и пятерку. У программы много параметров, и мне предстоит с ними еще поиграться, чтобы достичь максимальной точности. Планирую скрестить несколько алгоритмов и заставить их работать, как суд присяжных.

Отправил первую программу на ревью

Ну, ребятки, понеслась!

[singlepic id=778]

Нужно игре еще страничку запилить за неделю.