Нет в русском языке нарицательного существительного, которое не годилось бы для фамилии еврея.
И нет на Хабре статьи, которую нельзя было бы сделать игрушкой под 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.
В корпоративном блоге можно заниматься рекламой
Приложение бесплатно.
Ссылка здесь.
Текущий рейтинг игроков можно посмотреть здесь.
Удивляет наличие американцев, ведь играть сложно и успеха эта игра не принесет. Кроме пары сотни долларов на рекламе.
Вывод
Публикации алгоритмов очень полезны.
Часто они помогают найти собственные ошибки.
Пишите чаще. Перечитывайте еще чаще. Публикуйте реже.