Сервер и вопросы

Вчера вечерком (вернее сказать ближе к середине ночи), решил покодить - а то мозг заплывет
жиром или наоборот раззжижиться от пива нафик.

Решено было ударить по серверной части, т.к. в клиентской в принципе меньше работы.
Пишем именно ту часть которая генерит мир 7 лабиринтов.
Предполагается (по геймплею) что игрок заходит в какой-то лабиринт по его ид, т.е.
для первоначального запуска нужно сгенерить 4 лабиринта во всех частях света от славного города Датора.

Также очень важно чтобы сервер, когда генерил смежные лабиринты - делал входы/выходы на той-же горизнотали/вертикали что и у соседа.
Для хранения в памяти решено использывать массив идшников лабиринтов в мире:

int world_mazeid[WORLD_WIDTH*WORLD_HEIGHT];

и map (от STL) с ключем - ид лабиринта

typedef map TMazeList;
TMazeList mazeList;

На первый взгляд такая концепция обеспечит быстрый доступ к данным.
Забыл самое главное TMazeMap - структура, пока самая примитивная

typedef struct
{
unsigned char w,h;
char *data;
} TMazeMap;

Алгортим

Нужна функция
int makeMaze(int width,int height,int *id,char *data,int wx,int wy)
где

  • width - ширина лабиринта
  • height - высота лабиринта
  • id - указатель куда засунем ид лабиринта если сделаем
  • data - указатель на карту (хотя может использывать TMazeMap?)
  • wx,wy - глобальные координаты мира

    первое нужно проверить откуда идет запрос ИД лабиринту или по глобальным координатам
    если по координатам то сводим его к ид и если он есть то достаем карту и возвращаем.
    Также если идем по координатам то проверяем не город ли на данных координатах?
    Если он тут - то как-то сигналим об этом. (Например на клиенте - переход в локацию город)

    Если карты не нашлось - то запрашиваем 4 смежных лабиринта (если это возможно)
    и запоминаем их точки выхода, если в смежном город или еще нет лабиринта - то точки определяем
    рандомно.

    Также определяем не является ли лабиринт смежный с границами карты - тогда также на данной стороне
    не создаем выходов.

    Генерим лабиринт Map.MakeGoodLab2(numPt,pt);
    Если нет ИД - ищем максимальный по карте world_mazeid и увеличиваем на единицу
    Сохраняем новый лабиринт в структуре mazeList

    Возвращаем ок!.

    Вот первые "овраги", которые появились при написании алгоритма - что если один игрок перекроет
    выход(вход) из города, а второй попробует выйти из него?
    Конечно можно для городов рисовать в лабиринтах большие ворота (например в 2 клетки) - но это
    тоже не выход. Или например принудительно запретить игрокам стоять больше одного хода на выходе
    - типа подтянуть сюжет - стражники злые или чего-нить еще.
    Пока решений нет