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

в 11:25, , рубрики: mobile development, Блог компании Papa Buba Diop, Лабиринт, разработка под iOS, Хоббит, метки:

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

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

Приложение бесплатно.
Ссылка здесь.

Вывод

Публикации алгоритмов очень полезны.
Часто они помогают найти собственные ошибки.
Пишите чаще. Перечитывайте еще чаще. Публикуйте реже. Люди со слабыми нервами вообще не публикуйтесь.

Автор: PapaBubaDiop

Источник

Поделиться

* - обязательные к заполнению поля