Первый опыт или как пытаться стать Легендой кода и магии

в 14:38, , рубрики: Алгоритмы, ненормальное программирование, Программирование, Спортивное программирование

Всем привет. Меня зовут Валентин.

10 июля я прочел на Хабре пост Оли Ollisteka про платформу codingame.com и решил попробовать свои силы в логических задачах, а так же в конкурсе Legends of Сode and Magic.

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

image

Далее будет краткая информация о правилах конкурса, а так же о некоторых очевидных или не очень вещах для новичков.

Legends of Code and Magic

Контест, который проходит с 25 июля по 24 августа. Игра в некотором смысле похожа на Hearthstone, однако часть вещей улучшена в сторону баланса между игроками.

Игра проходит между двумя игроками, и это пошаговая игра. Каждый игрок имеет свою колоду карт, выбранную из доступных вариантов во время фазы Draft перед фазой Battle.

Фаза Draft

Во время фазы Draft каждый из игроков формирует свою колоду из 30 карт. Соответственно первые 30 ходов, каждый ход предлагает игроку на выбор 3 карты, одну из которых он может выбрать.

На момент написания статьи в игре существует 4 типа карт:

  1. Существа(Creatures) — по сути монстры. Именно они главный ресурс игрока, который позволяет ему как защищаться, так и атаковать противника.
  2. Зеленые предметы. Используются на союзных существах. Поднимают значение атаки/защиты. Добавляют способности существу.
  3. Красные предметы. Используются на существах противника. Снижают значение атаки/защиты. Отнимают способности. Могут мгновенно убить вражеское существо(-99 защиты)
  4. Синие предметы. Эти карты используются только на противника. Чаще отнимают жизни и противника, иногда восполняют здоровье своему владельцу.

Так же в игре присутствует 6 типов способностей у существ:

  1. Прорыв(Breakthrough). Если существо с этой способностью нанесет урон больше, чем здоровье существа противника, оставшийся урон перейдет оппоненту. (Полезная способность, но как показала практика, мало кто использует эти карты по своему назначению)
  2. Заряд (Charge). Позволяет атаковать в тот же ход, что было вызвано.

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

  3. Drain. Атака по вражеским существам/противнику восполняет здоровье сопоставимое с атакой. (Убер-способность. Нужное количество карт позволяет увеличить здоровье до 50-70 пунктов(с исходных 30), но большая часть карт с этой способностью так же обладает низкими значениями атаки/защиты)
  4. Guard. Способность защищает от прямой атаки по игроку. Сначала нужно уничтожать существ именно с этой способностью.(По моему мнению самая полезная способность у карты. Однако стоит учитывать тот момент, что часть карт с этой способностью обладают нулевой атакой)
  5. Lethal. Уничтожает существо, которое атакует. (Как правило карты с леталом обладают единичной защитой, что означает, что удалить они смогут максимум одну карту)
  6. Ward. По сути — защита от первого урона. После первой атаки по существу защита пропадает и карта становится ординарной. (Эта способность контрит и летал и прорыв и дрейн. Но карта не защищает владельца от урона, поэтому я мало встречал в стратегиях других игроков карты с вардом).

После выбора карт в своей колоде, фаза Draft заканчивается. Начинается фаза Battle

Фаза Battle

В этой фазе основная цель — победить соперника, снизить количество его здоровья до 0.
При этом у игрока есть такой параметр как Мана. Во время 1 хода в Battle фазе значение маны — 1. Далее каждый ход показатель увеличивается на 1 пока не достигнет максимального значения 12. Очки маны тратятся на призыв существ, а так же использование предметов.

image

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

Каждый ход из собранной колоды достается одна рандомная карта. Если здоровье падает до отметок 25, 20, 15, 10 или 5 единиц, в следующий ход будет вызвано больше карт.

image
В следующих ход противник вытянет из колоды 3 карты.

Как правило, если противники примерно равны по силам, игра заканчивается примерно на 200 ходу, однако у меня бывали игра и по 240-250 ходов. Нижняя же граница примерно 80-85 при условии, что у игроков не вылетали ошибки с неправильным использованием команд.

Возможные полезные стратегии

Главное отличие этого конкурса от предыдущего Code of Kutulu в том, что это карточная игра и в ней присутствует элемент случайности и удачи.

За время контеста было опробовано несколько стратегий:

  1. Набор существ с чарджем, леталом и прорывом для быстрой победы.
  2. Набор существ с Guard для максимальной безопасности+карты с чарджем и дрэйном.
  3. Набор существ с Guard + зеленые и красные карты.
  4. Набор существ с максимальной атакой/защитой, наличием показателей + к здоровью игрока или — к здоровью противника и только потом в зависимости от способностей.

Условно стратегии можно разделить на 2 категории.

Быстрая победа — существа атакуют только противника и существ guard если такие есть.
Полная победа — уничтожаются существа противника, а если существ нет, то и сам противник.

Теперь коротко по каждой стратегии:

Набор существ с чарджем, леталом и прорывом для быстрой победы

Стратегия показала свою несостоятельность из-за элемента случайности. Можно набрать очень много карт, которые стоят 1-2 маны, но при этом в стартовых картах их не будет вовсе. Данную стратегию стоит использовать только для быстрой победы и в случае, если противник не призвал ни одного существа c Guard. За время контеста встречал эту стратегию у других игроков, даже из топа, но как правило если игра переваливала за 100-120 ходов, они быстро проигрывали.

Набор существ с Guard для максимальной безопасности+карты с чарджем и дрэйном

Одна из лучших стратегий для быстрой игры. Вызываются карты защитники. А если таких нет, то Чардж и Дрейн. Данная стратегия позволяет эффективно уничтожать существ-защитников противника и при этом оставаться под защитой. В случае перехода к долгой игре, стратегия не теряет свою силу, так как существуют существа с Guard и имеющие высокие показатели атаки/защиты.

Набор существ с Guard + зеленые и красные карты

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

Набор существ с максимальной атакой/защитой

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

Минусы. А так же обходные пути

При составлении бота для последней стратегии был обнаружено, что если команда призыва направленна на карту, которую нельзя призвать в виду отсутствия маны, или атака на карту, которую нельзя атаковать, то данная команда отмечается как Action is not legal. С одной стороны это замечательная особенность контеста, мало кто из участников учитывал здоровье существ при атаке или воздействие карт-предметов, поэтому если все существа атаковали карту, которая уже уничтожена, все команды автоматически переключались в not legal.

Однако появилась возможность вносить просто огромное количество команд за раз.

image

В теории можно написать команды по атаке одной картой по каждому из существ противника, а потом и по самому противнику. Написать все возможные комбинации SUMMON и ATTACK.

Выполнится что выполнится, а остальное отойдет в Action is not legal.

Результаты

На момент написания статьи мой бот находится на 120 месте бронзовой лиги.

И на 950 месте в общем топе. Однако, к окончанию конкурса я скатился из топ 1000.
Скромный результат. Отчасти это объясняется первым опытом участия в контесте. Рейтинг игроков рассчитывается исходя из алгоритма True Skill. По данному алгоритму в начале проводится 10-20 боев с лучшими в данной лиге, исходя из результатов определяется стартовое место в таблице, а затем проводятся бои с рейтингом ± 10, каждая победа повышает рейтинг, каждое поражение понижает. Так проводится 100 с лишним боев и определяется место в таблице. А далее, бот продолжает сражаться с игроками, которые отправляют свою программу на обработку. Таким образом можно повышать свой рейтинг просто находясь в таблице. Я же снова и снова отправлял алгоритм в обработку в надежде сразу оказаться в топе.

Остается ждать и готовиться к следующему конкурсу на codingame.com. Кроме того, жду, когда игра попадет в мультиплеер, что улучшать свой код.

Автор: ValikSirbik

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js