Как стать автором
Обновить
0

Лабиринты Бильбо Беггинса

Время на прочтение 3 мин
Количество просмотров 23K


Нет в русском языке нарицательного существительного, которое не годилось бы для фамилии еврея.
И нет на Хабре статьи, которую нельзя было бы сделать игрушкой под 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.

В корпоративном блоге можно заниматься рекламой


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

Вывод


Публикации алгоритмов очень полезны.
Часто они помогают найти собственные ошибки.
Пишите чаще. Перечитывайте еще чаще. Публикуйте реже.
Теги:
Хабы:
+18
Комментарии 32
Комментарии Комментарии 32

Публикации

Информация

Сайт
bashni.org
Дата регистрации
Дата основания
Численность
Неизвестно
Местоположение
Россия

Истории