
Нет в русском языке нарицательного существительного, которое не годилось бы для фамилии еврея.
И нет на Хабре статьи, которую нельзя было бы сделать игрушкой под iPad.
Для доказательства утверждения я взял первую попавшуюся публикацию (ссылка ) и сделал из нее приложение.
Продукт был выложен и одобрен в App Store.
Результат своего труда я решил вынести на обозрение общественности. Суд Хабра-хабра, конечно, не самый гуманный, но известны на Родине суды и пострашнее.
Алгоритм Эллера, спасибо автору публикации deadkrolik-у, описан подробно и внятно.
Будучи человеком небрежным, я запрограммировал его не думая и забыл.
А зря.
В качестве дизайна я выбрал тему иллюстраций М.Беломлинского к Хоббиту.
Моя любимая книга в переводе Рахмановой до сих пор.
В качестве идеи игры взят старый трюк со случайным перемешиванием всех ячеек лабиринта.
Перед стартом очередного раунда, каждая ячейка лабиринта случайно вращается на 90, 180 или 270 градусов.
Задача игрока подумать и восстановить первоначальный лабиринт, сгенерированный по алгоритму Эллера.
Ниже текст функции, массив color[] является ипостасью лабиринта 7 на 7.
Большего размера поле не подходит для игр на iPhone.
текст функции initBoard
-(int) initBoard:(int) num { int row1_numb[16]; int row1_edge[16]; int row1_down[16]; int rw_e[256]; int rw_d[256]; num_x = 7; num_y = 7; num_xy = num_x*num_y; for (int i=0; i<num_x; i++) { row1_numb[i] = 0; row1_edge[i] = 0; row1_down[i] = 0; } for (int j=0; j<num_y; j++) { for (int i=0; i<num_x; i++) { rw_e[i+j*num_x] = 0; rw_d[i+j*num_x] = 0; } } for (int j=0; j<num_y; j++) { for (int i=0; i<num_x; i++) { if (row1_numb[i]==0) row1_numb[i] = i + 1; } for (int i=0; i<num_x-1; i++) { // int mm = arc4random()%10; int mm = [self microsoft_rand:10]; int k = (mm<7) ? 0 : 1; if (row1_numb[i]==row1_numb[i+1]) k = 1; if (k>0) { row1_edge[i] = 1; row1_numb[i+1] = row1_numb[i]; } } row1_edge[num_x-1] = 1; for (int i=0; i<num_x; i++) { // int mm = arc4random()%10; int mm = [self microsoft_rand:10]; int k = (mm<7) ? 0 : 1; row1_down[i] = (k>0) ? 1 : 0; } int r_open = 0; int i_start = 0; for (int i=0; i<num_x; i++) { int r1 = row1_edge[i]; i_start++; if (row1_down[i] == 0) r_open = 1; if(r1) { if (r_open==0) row1_down[i-i_start+1] = 0; r_open=0; i_start = 0; } } for (int i=0; i<num_x; i++) { rw_e[i+j*num_x] = row1_edge[i]; rw_d[i+j*num_x] = row1_down[i]; } for (int i=0; i<num_x; i++) { row1_edge[i] = 0; if ( row1_down[i] == 1) row1_numb[i] = 0; row1_down[i] = 0; } } int j = num_y-1; for (int i=0; i<num_x; i++) { rw_e[i+j*num_x] = (i==num_x-1) ? 1 : 0; rw_d[i+j*num_x] = 1; } for (int j=0; j<num_y; j++) { for (int i=0; i<num_x; i++) { int r1 = rw_e[i+j*num_x]; int r2 = rw_d[i+j*num_x]; int r3 = (i) ? rw_e[i - 1 +j*num_x] : 1; int r4 = (j) ? rw_d[i+(j-1)*num_x] : 1; int r = (1-r1) + (1-r2)*2 + (1-r3)*4 + (1-r4)*8; color[i+j*num_x] = r; } } }
Приложение получилось быстро. Дизайн, надеюсь, не очень противный.
Никогда не стесняйтесь спросить, что непонятно
Ужасно то, что готовя эту статью, я перечитал публикацию про алгоритм Эллера и обнаружил в своем тексте 2 ошибки.
Во-первых, я, видимо, не дочитал перевод до конца (или автор добавил изменения позже) и сделал последнюю строку лабиринта по-своему, проводя горизонтальный штрек через все ячейки.
Хотел даже посетовать по этому поводу в комментариях, но постеснялся.
А зря. Никогда не стесняйтесь спросить, что непонятно.
И вторая ошибка — мои лабиринты имеют петли. Кто найдет баг или перепишет код красивее, тому уважение и персональная благодарность в следующей версии приложения.
Вот пример перемешанного и почти (найдите последнюю неправильную ячейку) собранного лабиринтов. Ошибки, увы налицо.

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