алгоритм

Дизайн & математика

Задачка:
Есть n объектов, которые нужно рандомно разбросать по карте, но - одни объекты должны появляться чаще, а другие реже. Иными словами это как сделать заданное неравномерное распределение :)

Решим что для всех n объектов есть некий коэффициент частоты:
double kk[8]={1,1,0.5,2,2,0.3,0.9};
Причем сами цифры (их абсолютная величина) - не играет роли, нам важна их относительная величина (относительно к другим).

Подсчитаем общий вес: double k_s = sum_double(kk,8);
Он равен = 7.7 :) Хорошее число между прочим получилось.

TOP и рекорды

Сразу после внедрения TOPа сразу решено было сделать еще и доску рекордов - различных, один из первых что напрашивался - рекорд про прохождению тренировочной арены. Данный рекорд на время - за сколько может игрок пройти тренировочную арену?

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

TOP игроков

Вообще сама задача создания TOPа - пустяковая, нужно просто решить по какому принципу она будет сортироваться (например по полученному опыты) и отсортировав игроков, вывести первых 10 (или 20, или 100).

Но вот задача будет посложнее если игроков уже далеко за 100000. Сортировка такого количества чисел, даже на мощном сервере может занять некоторое время. А т.к. структура игроков изменяемая придется блокировать ее, и в этот момент не обрабатывать другие запросы, от других игроков.

Глобальные переделки

Вообще ничего не предвещало беды, загрузил тестовый лабиринт с 10 пауками.
Сделал три шага и .... Очень долго ждал. На вид игры было похоже, что она зависла. Через секунд 20 - клиент получает от сервера 100 сообщений, о новых ходах, о ходах мобов, ну и завершающий что ход опять у игрока.

Дело в том, что было сделано, что при переходе хода - срабатывает функция computerTurn, в которой происходят все действия компьютерного игрока, а затем жмется кнопка конец хода.

А если следующий игрок тоже компьютер - то опять тоже самое.

По чуть-чуть

Изменил алгоритм патрулирования, теперь в наличии 6 вариантов обхода, что разнообразит игру.

Сам алгоритм ниже:

if (as %2 == 0) {f=w;n=h;} else {n=w;f=h;}
for(int i=0;i<f;i++)
for(int j=0;j<n;j++)
{
int off;
int ii=i,jj=j;
if (as && 0x2)
if (as%2 == 0) {ii=(w-i)-1;} else {ii=(h-i)-1;}
if (as && 0x4)
if (as%2 == 0) {jj=(h-j)-1;} else {jj=(w-j)-1;}
if (as%2==0) off=jj*w+ii; else off=ii*w+jj;
}

Тень и другое

Изменил функцию тени на Flash-клиенте, теперь оно считается также как и на сервере – круговым просмотром, конечно не быстро – зато уж точно правильно.

Теперь на клиенте просмотр считается заполнением дополнительной карты, где 1 означает, что данный квадрат игрок видит, а 0 – что нет. Определение видит ли игрок, любой и объект – весьма простой – нужно посмотреть координаты и значение по этим координатам в этой карте.

Сейчас внедряем чат.

Также дописал алгоритм, поведения лучника – и теперь этот гад убивает меня быстрее, чем я его :)

ИИ. Обход территории. Дополнение

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

Для флага и индекса использую одну переменную в структуре TMazeCreature - это int cPoint.
В самом начале переменная равная 0 и означает, что существо (моб) прошел(узнал) не всю карту.
В случае когда карта пройдена выполняется инструкции:

ИИ. Патрулирование

Одним из важнейших составляющих игры является наличие так называемого искусственного интеллекта. Чем хуже ИИ – тем скучнее игра.

Чаще всего создатели игр компенсируют низкий интеллект мобов (компьютерных игроков), за счет повышения им характеристик и/или обмундирования.

Этот подход мне нам не очень нравится, как и вариант когда компьютерный игрок знает «чуть больше», чем обычный. Например, точное расположение сундуков, противников, ловушек.

В идеале, хотелось бы создать такой ИИ, что при игра с ним, не сильно отличалась от игры с реальным противников.

Полет стрелы. Серверная часть.

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

Проверка на наличие снарядов и возможности стрельбы – очень простая: проверяется, что оружие в правой руке – тип артиллерия (TW_RANGE), наличие снарядов, что в правой есть предмет с типом снарядов (TW_ARROW), далее проверяется количество снарядов (прочность предмета).

Магазин

Продолжение темы про городские постройки, ранее было уже реализованы наброски алгоритма работы магазина.

В дополнение, т.к. теперь в одном городе (или на точке карты) может быть несколько магазинов, то по умолчанию ссылка на магазин /shop автоматически перемещает на "лучший" (по рейтингу) магазин /shop?id=XXXX.
Рейтинг будет считаться от количества прибыли и прочего (пока в размышлениях), но понятно что частным магазинам будет очень "приятно" если их магазин будет открываться как по умолчанию.

RSS-материал