немножко наврал в уменьшении переменной "дистанция". на самом деле, это счётчик, который уменьшается после каждого изменения x/y. то есть код внутреннего цикла выглядит как
Код:
  дистанция = 2+random(4);
  выбрать_напр:
    напр = random(4);
    switch (напр) {
       case 0:
          если (ХодилиВлево) goto выбрать_напр;
          for (;;)
          {
            если (A[x-2,y]!=#FF или A[x-1,y]!=#FF или
                  A[x-2,y-1]!=#FF или A[x-1,y-1]!=#FF или
                  A[x-2,y+1]!=#FF или A[x-1,y+1]!=#FF)
            {
               ХодилиВлево = да;
               goto выбрать_напр;
            }
            иначе
            {
               x=x-1; A[x,y] = 0;
               дистанция=дистанция-1;
               если (дистанция == 0) break; // внутренний for (;;)
            }
          }
          break; // case
  // аналогично по остальным направлениям
в принципе, лабиринты тоже будут получаться хорошие, только менее извилистые, т.е. меньше точек, в которых ответвляется корридор. можно попробовать оба варианта

ещё забыл вставить перед первым for (; команды A[x,y]=0, без которой начальный квадрат оказывается отрезан от остального лабиринта

ещё не забудь, что куча обращений типа A[x+1,y-2] на самом деле кишит остатками от деления на размер лабиринта (mod 64)

а насчёт начального квадрата, почему он кодируется кодом #80, а не #00?