Вчера я участвовал в своем первом хакатоне! Школа кодов викингов дала нам день, чтобы построить все, что мы хотим. Единственными квалификаторами были следующие:

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

Одной из моих идей, которую я вынашивал некоторое время, был помощник по выбору чемпионов для League of Legends. League of Legends — это командная игра в жанре экшн/стратегия, в которой две команды по пять игроков осаждают башни, убивают монстров и устраивают засады друг для друга. Когда одна команда наберет достаточно золота и опыта, она нападет на вражескую базу, сражаясь между башнями и противоборствующей командой, чтобы разрушить вражеский Нексус и выиграть игру.

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

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

Викинг дал нам один день, чтобы начать и закончить что-то совершенно новое. Я знал, что если я собираюсь добиться этого, мне нужно будет агрессивно сужать проблемное пространство. Вместо того, чтобы пытаться использовать официальный API или парсить один из сайтов, собирающих данные об игре, я начал с создания JSON-файла о чемпионах, которых использую чаще всего.

После создания класса Champion в Ruby и загрузки моего JSON с диска я запустил сервер Sinatra и начал блокировать то, как будет выглядеть интерфейс в Bootstrap. Я хотел, чтобы он вольно отражал интерфейс выбора чемпионов самой игры — две команды, по одной с каждой стороны, со списком чемпионов для каждой.

Поскольку Champion Select требует, чтобы вы принимали решение быстро, я знал, что важно, чтобы интерфейс был быстрым и плавным. Имена некоторых чемпионов трудно произносимы, поэтому мне нужна была хорошая система автозаполнения; Я нашла именно то, что мне было нужно в Awesomplete Леа Веру. (Даже если однажды я потерял 20 минут, прежде чем понял, что ошибся в написании слова Awesomeplete.) Это был единственный найденный мной вариант, позволяющий пользователям нажать Enter, чтобы принять первое предложение, который идеально подходит для этой ситуации.

Я создал класс Team, который бы, помимо всего прочего, объединял сильные и слабые стороны всех товарищей по команде в один хэш. Это позволило мне создать облако слов, которое с первого взгляда характеризует команду.

Затем пришло время для улучшения интерфейса. Меня беспокоило, что команды с разным количеством чемпионов будут создавать несогласованный интерфейс, поэтому я установил количество чемпионов для каждой команды равным пяти. Для большей ясности я также вытащил значки для каждого чемпиона из папки с игрой на жестком диске и установил их рядом с именем каждого чемпиона. Так как время было на исходе, я также добавил возможность удалить чемпиона из вашей команды; таким образом, вы могли бы экспериментировать с добавлением и удалением чемпионов, чтобы увидеть их влияние на состав вашей команды.

Это то, что я представил классу в конце нашего вчерашнего хакатона. Из 14 представленных проектов мой занял третье место, что я считаю очень даже неплохо! Сегодня я выложил его на Heroku, так что он жив, если хотите поиграть с ним!

Чтобы стать действительно полезным, проекту нужно немного больше данных. Сейчас он знает только 16 чемпионов, с которыми я больше всего знаком. Я могу редактировать файл данных JSON по мере накопления опыта работы с League, и я принимаю запросы на вытягивание на GitHub, если кто-то хочет что-то добавить. Следующее, чему нас учит Viking, — это Ruby on Rails, поэтому я должен в конечном итоге создать форму, которую люди смогут использовать для добавления данных более удобным для пользователя способом. Дополнительные запланированные функции перечислены в файле README на GitHub.

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