• Как устроен балансировщик команд в World of Tanks Blitz



      WoT Blitz — это мобильный танковый шутер, в котором игроки сражаются в формате 7 на 7.
      Матчмейкер, или балансировщик это механизм, который на основе очереди игроков, желающих попасть в бой, формирует состав команд.

      У танков есть следующие важные для матчмейкинга параметры:

      • Уровень. В зависимости от уровня, у танков меняются различные характеристики (например, скорость, бронепробитие). На 1-ом уровне — самые слабые танки, на 10-ом — самые сильные.
      • Тип. В WoT Blitz существует 4 типа танков: лёгкий, средний, тяжёлый и ПТ-САУ (противотанковые самоходные артиллерийские установки)

      Самая простая реализация матчмейкера — закидывание игроков в команды случайным образом. Но в данном случае у игроков на низких уровнях не будет никаких шансов нанести хоть какой-то урон, и играть станет неинтересно.
      Читать дальше →
    • Исправляем опечатки с учётом контекста

        Недавно мне понадобилась библиотека для исправления опечаток. Большинство открытых спелл-чекеров (к примеру hunspell) не учитывают контекст, а без него сложно получить хорошую точность. Я взял за основу спеллчекер Питера Норвига, прикрутил к нему языковую модель (на базе N-грамм), ускорил его (используя подход SymSpell), поборол сильное потребление памяти (через bloom filter и perfect hash) а затем оформил всё это в виде библиотеки на C++ со swig биндингами для других языков.

        Читать дальше →
        • +19
        • 12.2k
        • 2
      • Python: строим распределенную систему c PySyncObj

          Представьте, что у вас есть класс:
          class MyCounter(object):
              def __init__(self):
                  self.__counter = 0
              def incCounter(self):
                  self.__counter += 1
              def getCounter(self):
                  return self.__counter
          

          И вы хотите сделать его распределённым. Просто наследуете его от SyncObj (передав ему список серверов, с которыми нужно синхронизироваться) и отмечаете декоратором @replicated все методы, которые изменяют внутреннее состояние класса:
          class MyCounter(SyncObj):
              def __init__(self):
                  super(MyCounter, self).__init__('serverA:4321', ['serverB:4321', 'serverC:4321'])
                  self.__counter = 0
              @replicated
              def incCounter(self):
                  self.__counter += 1
              def getCounter(self):
                  return self.__counter
          

          PySyncObj автоматически обеспечит репликацию вашего класса между серверами, отказоустойчивость (всё будет работать до тех пор, пока живо больше половины серверов), а также (при необходимости) асинхронный дамп содержимого на диск.
          На базе PySyncObj можно строить различные распределенные системы, например распределенный мьютекс, децентрализованные базы данных, биллинговые системы и другие подобные штуки. Все те, где на первом месте стоит надёжность и отказоустойчивость.
          Читать дальше →
        • Скриншотим игры — the hard way

            Ну что такого сложного может быть в создании скриншота? Казалось бы — позови функцию, любезно предоставленную операционкой и получи готовую картинку. Наверняка многие из вас делали это не один раз, и, тем не менее, нельзя просто так взять и заскриншотить полноэкранное directx или opengl приложение. А точнее — можно, но в результате вы получите не скриншот этого приложения, а залитый черным прямоугольник.
            Читать дальше →
          • Молнии

            • Translation


            Вы летите на своём корабле по пещере, уклоняясь от вражеского огня. Однако, довольно скоро вы осознаёте что врагов слишком много и похоже что это конец. В отчаянной попытке выжить вы жмёте на Кнопку. Да, на ту самую кнопку. На ту, что вы приготовили для особого случая. Ваш корабль заряжается и выпускает по врагам смертоносные молнии, одну за другой, уничтожая весь флот противника.

            По крайней мере, таков план.

            Но как же именно вам, как разработчику игры, отрендерить такой эффект?
            Читать дальше →
          • Boids — простой алгоритм перемещения групп юнитов

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



              Под катом описание алгоритма с примерами кода.

              Читать дальше →
            • Сервис шаринга скриншотов и кода

                Многие из вас наверняка слышали про сервисы, позволяющие делится скриншотами одним нажатием кнопки. Общая концепция следующая: жмёшь хоткей, выделяешь область экрана, в буфер обмена получаешь ссылку на скриншот, который автоматически загружается на какой-то хостинг. Так же многие из вас наверняка пользовались другими сервисами — позволяющими опубликовать фрагмент исходного кода и получить ссылку на страничку, отображающую этот исходник с подсветкой синтаксиса.

                Мы объединили две эти идеи и сделали проект, обладающий следующими фичами:

                • Публикация скриншотов и исходников по нажатию хоткея
                • Open Source — можете форкнуть / поднять на своём сервере / добавить новые фичи
                • Прямая ссылка на изображения, отсутствие рекламы
                • Кроссплатформенность
                • Устойчивость к высоким нагрузкам (хостимся в облаке)

                Читать дальше →
              • Как мы делали плагин для kate

                  В данной статье описан процесс написания плагина для kate под названием Neznaju. Плагин предназначен для совместного редактирования текста через сеть. Используя этот плагин вы можете создать сервер, или подключиться к созданному кем-то серверу и совместно редактировать какой-то текст. Плагин максимально простой. На данный момент он поддерживает подключение нескольких клиентов, а также редактирование объёмных файлов (т. к. передаётся только информация об изменениях в документе).
                  Читать дальше →
                • Детектор попадания мячика с использованием OpenCV



                    Недавно мне довелось поучаствовать в одном интересном проекте. Моя сестра учится на дизайнера в БВШД, и им дали задание сделать проект на тему Street Interactive. Идея была выбрана довольно простая. На экране демонстрируется анимация движущегося медведя, всем желающим предлагается попасть в него из рогатки импровизированным снежком. Результат продемонстрирован на видео, кому интересна техническая реализация, добро пожаловать под кат.
                    Читать дальше →
                    • +51
                    • 11.4k
                    • 9
                  • Минималистичная программа в формате ELF

                    Вдохновившись статьёй Привет из свободного от libc мира, я так же решил проделать нечто подобное. Чтобы не заниматься этим бесцельно, я решил поставить перед собой следующую задачу. Сделать программу, выводящую какую-нибудь простую строку, вроде «ELF, hello!». Разобраться с тем, как именно она будет представлена в исполняемом файле. Ну и попутно, постараться уложиться в 100 байт.
                    Читать дальше →