C++

Программируем

Слегка переписал секцию enter


int wm=STD_LABIRINT_WIDTH,hm=STD_LABIRINT_HEIGHT;
makeMaze(wm,hm,&mazeid,NULL,-1,-1,data);
if (userList[userid].return_map) delete [] userList[userid].return_map;

userList[userid].return_map = new string[wm*hm];

, а еще само-собой в структуре TUser добавил string *return_map.

Также изменил код в секции getmap


int gx=params->Branch("x")->Integer(),gy=params->Branch("y")->Integer();
int mazeid = userList[userid].mazeid;
char *map = new char[SEE_RADIUS*60];

Вводим действия

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

vector<THistoryAction> historyAction, где THistoryAction - некая абстрактная структура, предположим:
typedef struct
{
int action;
int data[5];
} THistoryAction;

Допустим игровой клиент запрашивает таймер, а с таймером ему приходит еще и количество записанных действий (lastAction=histroyAction.size()).

Синхронизация времени

Тема данной статьи – синхронизация времени между клиентской машинкой и сервером. В инете покопавшись ничего не смог найти путного. Итак.

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

Первое решение – «в лоб». Просто запрашиваем сервер и получаем от него ответ, сколько сейчас времени по его мнению. Разницу в величинах запоминаем и используем при расчетах.
Минусы данного метода – не учитывается время, затрачено на «путь» запроса.

Делаем очередность хода

Так как лабиринты планируются игрой пошаговой, необходимо внедрить алгоритм перехода хода.

Пока решил внедрять фиксированное время на ход, потом может поменяю, а может и нет.

Для начала, внес некии правки в структуру TMazeMap
typedef struct
{
int Id;
unsigned char w,h;
char *data;

TCreatureList creatures;
time_t lastTime;
int currentId;
int timelenght;

} TMazeMap;

А также написал несколько дополнительных функций, а именно:
void initMaze(TMazeMap *m);
void nextTurn(TMazeMap *m);
void checkMazes();

Первые успехи

Вместо эпиграфа - "Да уже что-то получилось!".
А именно игрок может зарегистрироваться, и пройти тестовый лабиринт "Подвал старейшины".

Ну про саму ссылку на тестовый лабиринт было ранее,

Для использования шаблонов пришлось написать кой-какой код, для замены переменных в тексте.

if (!strcmp(params->Branch("action")->Char(),"getmap"))
{
/* запрос на карту в окресностях игрока */
int mazeid = userList[userid].mazeid;

Замена текста в готовых шаблонов текста

Далее код для замены в готовых текстах - определенных кусков текста. Код довольно быстрый.

Замена производиться для комбинации $word_tag$, причем нормально обрабатывается $1000.
Размер выделяемой памяти, может быть указан принудительно, либо определяется автоматически (в случае нехватки - добавляется).

Вызов:
int v=patternProcessing(s_in,d,&out);
Где - s_in (char*) - указатель на шаблон, d - typedef map<string,string> map_as_hash, out - указатель на указатель (char**).

map_as_hash d;

Пример вызова:

Объять не объятное

Пытался сделать все сразу, но не получается – решил вот на выходных расписать, что именно и как нужно сделать.
Задача. Сделать на странице города вход в тестовый лабиринт – для сбора, скажем тестовых очков – и выходе из лабиринта при нахождении оного.
Что уже есть. Есть страница логина и страничка города (пока пустая). В ней поставить ссылку типа /maze?mazeid=new_test_arena&type=enter – нефиг делать. А дальше нужно:
А) сделать редирект на /maze в него передать сгенерированный mazeid, userid и сессию – для загрузки флэша

Лог-он

Все-таки решено интерфейс сделать ввиде симбиоза Flash&html, соотвественно авторизация
будет на html, посредством сессии передаваемой через куки. Код будет на C++.

Алгоритм следующий.
Если переход на страницу требует закрытого доступа, то проверяется кука, если ее нет - то она генериться.
Дальше проверяется в массиве авторизированных кук на наличиее оной, если ее нет - то выдается окно с формой логин/пароль методом POST.
Если происходит POST данных, то проверяется связка логин/пароль и если она верна, кука заноситься в массив.

map & multimap

map в STL - что-то вроде хеша в Perl, иными словами это массив ключом которого может быть любая сущность, а не только цифровой индекс как в обычном массиве.

Для объявления что-то вроде хеша в Perl на C++
map perlHash
теперь можно запросто писать:
perlHash myHash;
myHash["name"] = "Ivan";

Если нужно что-то посложнее в качестве ключа или значения то можно использывать value_type
myHash.insert( map::value_type("name","Ivan"));
Для поиска значения по ключу:

Перекодировка CP1251->Unicode->Utf-8

Задачу можно разбить на две части
1. Перекодировка CP1251 в Unicode
2. Unicode->Utf-8 (про Utf-8 довольно неплохо написано в википедии)

Unicode (во всяком случае 16), на каждый символ выделяется два байта - первый указатель на таблицу, второй на символ в этой таблице, для кодировки русских букв CP-1251 используется следующая таблица перекодировки (для символов больше 127)

unsigned short win_cp1251[128]=
{ 0x0402, 0x0403, 0x201A, 0x0453, 0x201E, 0x2026, 0x2020, 0x2021,
0x20AC, 0x2030, 0x0409, 0x2039, 0x040A, 0x040C, 0x040B, 0x040F,

RSS-материал