Русский
Русский
English
Статистика
Реклама

Игры для программистов

Как видеоигры помогают прокачивать реальные навыки и найти работу мечты расшифровка

01.08.2020 12:08:37 | Автор: admin


14 июля в нашем инстаграм-аккаунте и ютубе прошел прямой эфир с техническим директором GameAcademy компании, которая помогает прокачивать реальные рабочие скиллы через видеоигры.

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

Делимся с вами расшифровкой эфира.

***



Меня зовут Андрей Чернявский. Я выпускник ВМК МГУ, 2005 года, кафедра квантовой информатики. Преподавал довольно долго там же. Моя жизнь связана с наукой, это моя бесконечная любовь. Я занимаюсь квантовой информатикой, также неврологией в Научном центре неврологии, и, помимо этого анализом данных и разработкой учебных курсов проекта Game Academy, формально CTO данного проекта. Хотел бы рассказать именно о нашем проекте.
Проект посвящен играм, как можно догадаться из названия и из моего фона все, наверно, узнают Fallout, о котором, в том числе, пойдет речь сегодня.

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

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

Зачастую игры создаются специально с целью обучения каким-то скиллам обучающие игры, мобильные приложения, инструкции по селфимпрувменту и прочее но это не то, что нам нужно. Мы используем любимые игры: если человек что-то любит, то мы должны помочь ему играть немного по-другому и за счет этого развиваться. Я расскажу об этом подробнее, как мы это делаем, почему это работает, почему это круто когда буду отвечать на вопросы.

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


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

Замечательный комментарий. Об этом мы очень много думали.

Приведу один пример: в Испании есть компания на базе университета, которая делает приложение по связи игр с навыками. У них есть одна научная статья (правда, у меня к ней довольно много критики). Я попробовал их сервис, в который подключается аккаунт Steam он рассказывает, в какие игры вы играли в последнее время и какие навыки как бы натренировали. Я тогда играл в Fallout 4 (честно признаюсь я не фанат этой части, люблю предыдущие, особенно 1 и 2); мне написали, что, оказывается, я, поиграв часов 10 в Fallout 4, натренировал решение проблем, аналитическое мышление и все такое. Правда, я не понял, как это F4 тренировал мое аналитическое мышление.

То есть, действительно, обычно нельзя четко связать игру с развитием определенного навыка. Во-первых, надо разделить навыки на soft skills и hard skills, как это делается в английском языке.

Четких понятий здесь нет, но все примерно понимают, что это означает. Hard это конкретные навыки: например, играть на гитаре, резать по дереву, бить по мячу сильно в футболе (у меня из этих есть только первый навык). Soft это очень широкое понятие: принятие решений, эмоциональный интеллект, traits, мотивации.

Игры гораздо сильнее относятся именно soft; они очень редко развивают hard-скиллы. Определенные вещи можно тренировать, например, с помощью VR. В Центре неврологии шлемы виртуальной реальности используются для реабилитации после инсультов, это можно причислить к soft, хотя мы говорим не совсем об этом. Если подумать о чем-то более конкретном, например, можно взять EVE Online. Как многие шутят, это симулятор Excel работу с таблицами вполне можно назвать хардскиллом.

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

Какие навыки человек мог развить после 5000 часов в DOTA?


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

Мы обнаружили, что с esport-играми работать сложно, и для анализа того, что человек развивает, играя в них, нужно глубже смотреть на то, как он играет. Ведь можно играть огромное количество времени, но все равно делать это плохо. Или можно ориентироваться на командную игру, или иметь хорошую реакцию.

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

Вот моя кепка VaultTec. На ней есть надпись: HARD WORK IS HAPPY WORK. Я с этим согласен на все 100%. Когда я был безумно счастлив от своей работы? Например, когда я делал свою диссертацию и неделю сидел почти без сна, как псих, над кодом по анализу квантовой запутанности, пытаясь его перевести на первую версию QUDA, которая была жутко неудобна, это было очень сложно, и мне было безумно интересно. Для диссертации это было вообще не важно, и дедлайна не было, но я все равно почти не спал, работал и получал безумное удовольствие.

Я надеюсь, у всех когда-то было что-то подобное в работе. Еще был другой проект по квантовым вычислениям, над которым я сидел две недели и спал по 4 часа максимум; при этом, можно было сделать в три раза меньше того, что сделал я. Или работа над данными в Game Academy. Когда я начинал это делать, это было занятие на уровне я попробую помочь но потом я снова сидел без сна, связывал разные работы, машинное обучение, статистику. Это было очень трудно, но приносило невероятное удовольствие.

К чему я это рассказываю? Многие пишут на тему того, как найти призвание. Важно понять следующее: обычно человек в своей жизни уже делал что-то, что было связано с его призванием. Он уже этим занимался. Часто такие моменты ищут в детстве или еще где-то. Кроме того, человек впадает в поток (хотя я и не люблю слово поток): в таком состоянии ему не нужна внешняя мотивация, он будет неотрывно сидеть и делать. Но ведь именно так мы постоянно играем в игры: вроде бы и спать хочется, и есть, но ты сидишь и играешь, у меня так было много раз с Fallout, Arcanum и другими RPG-играми. То же самое в работе.

Я называют это core motivations вещи, которые сами по себе являются сверхмотивационными для человека, за которыми он будет сидеть без сна.

Что для вас есть хорошие игры?


Это сложно определить, но я бы сказал так: есть определенные игры (мобильные, F2P), которые я называю дофаминовой ямой. Один мой знакомый, который ими занимается, сказал: Ну да, я понимаю, что мы практически никотин продаем. Немного двигаешь пальчиком яркие цвета, звон, мозг это воспринимает, дофамин булькает. Вот это никак не хорошие игры.

Для меня хорошие игры это игры, в которых есть настоящие трудности, в которых победить сложно. Примеров можно привести множество: например, Stellaris или Europa Universalis 4. Там такие правила, что освоить их будет сложно любому человеку. Или, например, Dark Souls конечно, есть люди с супер-реакцией, и им играть легко, но большинство тратит на нее огромные усилия. Это тоже относится к core motivations.

Как-то раз, когда я занимался данными для Game Academy, я вдруг обнаружил, что вообще не играю ни ночью, ни днем, ни в одну игру. И я подумал, что это странно: я же люблю играть, что происходит? Вспомнил, что, когда я занимался другими своими научными проектами, я тоже не играл.

Я стал думать, почему, и нашел очевидный ответ: в моих любимых однопользовательских RPG присутствуют ровно те вещи, которые я люблю в работе. Их две. Во-первых, развитие персонажа: если я дохожу до level cap, я бросаю игру, потому что мне надо постоянно развиваться и в моих научных работах тоже всегда присутствует развитие, обучение, я чувствую, что расту. Во-вторых, охота за сокровищами: в RPG всегда ищешь сундуки, в которых может оказаться новый супер-меч, и в науке, анализе данных, то же самое. Это мой стиль. Я не беру стандартные методы, я беру сложную задачу, пробую её по-всякому и сижу над ней ночи напролет, пока не нарвусь на решение.

Вот те вещи, которые двигают поток как в игре, так и в работе. Их можно анализировать через игры. И, кроме этого отличать hard skills от soft skills, но при этом не привязываться к слову скиллы и стараться смотреть шире.

В соревновательных играх разделяют роли на carrier, support, технических игроков. Вы следите за этими ролями в исследованиях?


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

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

Как зависит уровень интеллекта от жанров, на что показывает высокий и низкий уровень игроков?


Я пытался в анализе данных использовать жанры, но это не работает. Жанр это очень условное разделение. Взять хотя бы мои любимые RPG: тут есть action-RPG, есть сюжетные, есть олдскульные с дико сложной механикой, есть Fallout 4, который и к RPG причисляется условно (даже Fallout 3 гораздо проще в плане механики, чем первые части). Или стратегии: к ним относятся как совсем простенькие игры, так и серии от Paradox.

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

Существует ли строгая статистическая корреляция между профессией и любимыми играми?


Я расскажу, с чего началась моя работа. Основатель проекта, Ирина близкая подруга моей близкой подруги, она позвонила мне, чтобы обсудить его. Я подумал классно, я люблю игры, сам думал об этом, сам давно замечал подобное, было бы здорово заодно посмотреть на современный machine learning (я до этого занимался ML только в 2004-06 годах). Удалось собрать (с использованием открытых старых данных из Steam) довольно большую базу с информацией о том, во что и сколько играли игроки и какие у них профессии. В процессе я попробовал новый machine learning, нейросети, SVM, деревья решений, бустинги.

Профессий, связанных с IT, оказалось не намного больше, но все же больше. Я стал думать, как к этому подойти, обсуждал с людьми. Мне порекомендовали использовать классическую статистику; это, конечно, в разы сложнее, чем ML. Были использованы банальные точные тесты; тут прелесть в том, что можно получить совершенно строгие зависимости и конкретные (а не абстрактные) корреляции. Они были получены, что меня очень порадовало. Когда работаешь с реальными данными, связанными с людьми (например, в неврологии), получить что-то статистически значимое очень тяжело, но здесь удалось.

Удалось получить довольно сильные корреляции между IT-профессиями и определенными играми: например, сложными tower defense. Было забавно потом обсуждать это с людьми: у меня много знакомых программистов, особенно системных программистов, и оказалось, что многие из них играют в Defense Grid (любимая игра, всем отделом играем!). Я её опробовал там действительно требуется алгоритмическое мышление. Попадались и другие головоломки, и есть определенные идеи, как можно расширить и углубить это исследование; в общем, корреляции действительно статистически значимы. Если интересно, можно поговорить об аккуратности результатов.

В другом вопросе упоминалась серия Total War. Второй важный результат нашей работы корреляция между сериями Total War / XCOM и менеджерскими позициями. Это было интересно: мне очень нравятся обе эти серии, но хорошо играть в них у меня никогда не получалось, сколько бы я ни пробовал. Тогда я решил засесть за XCOM на день (не просто так, а для проекта!). У меня опять толком не получилось, но я аккуратно записал, что именно меня напрягает в этой игре и почему мне тяжело играть в нее. Позвонил Ирине она сама менеджер, у неё PhD по менеджменту и описал свои наблюдения. Она ответила: О, ты только что мою жизнь описал.

Например, одна из основ игры в XCOM это работа с рисками. Когда играешь в RPG, тебе обычно не приходится просчитывать риски на уровне более сложном, чем обычный выбор из двух зол. В XCOM всегда существует много вероятностей в том числе глобальных, заметных не сразу и действующих отложенно (а в RPG только взял не тот меч, тебя убили, перезагрузился). Их нужно уметь оценивать. Если вы в XCOM играли, вы знаете, как устроен тактический ход: у каждого юнита есть два действия, которые можно потратить на передвижение; по-хорошему, нужно тратить одно (мало ли, что впереди), но это же нудно! Нужно делать баланс и учитывать мотивацию это довольно менеджерская вещь. Корреляция сильная, и обсуждения с конкретными людьми показали, что она соответствует действительности.

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

Может быть, вы слышали про исследование по психологии, когда из топовых журналов взяли 200 работ топовых психологов и попробовали повторить эксперименты, и смогли повторить только три из десяти. И в медицине такие цифры встречаются в общем, в работе со статистикой есть проблемы. Может быть, кто-то читал книгу Несовершенная случайность Леонарда Млодинова там прекрасно рассказано о том, как наш мозг глупит с вероятностями, с кучей экспериментов.

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

Серьезные работы все же есть. Например, было доказано, что 3D Action (многие в них играют) тренируют то, что называется hand-eye coordination, а также быстрое принятие решений. У меня был курс по принятию решений, и тут важно отметить, что быстрое и медленное принятие решений это два совершенно разных soft skills.

Как именно платформа анализирует человека по геймерскому профилю? Как по играм в Steam понять, что вы умеете и любите делать?


Мы анализируем не только по Steam. У нас было уже несколько MVP с разными принципами работы. Сначала мы делали автоматизированную систему, основанную на найденных корреляциях, но она давала мало информации. Потом мы попробовали противоположный подход с аудитом, и это дало нам много инсайтов и повысило понимание. Мы проводили анализ игр и опрашивали самого человека о том, что его ночью держит в играх, о жизненной ситуации и так далее. Основная идея в том, что нельзя на 100% расписать человека по его профилю в Steam, это не работает. Человек должен сам себя анализировать, заглядывать внутрь себя. Я вот до того момента, как меня осенило на тему почему это я не играю во время проекта?, ни разу не задумывался о том, что меня держит в играх то же, что и в работе. Большинство людей, с которыми мы ведем обсуждения, тоже об этом не задумывается.

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

Существует ли строгая статистическая корреляция с профессиями?


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

Как способность играть в сложные игры вроде SpaceChem и Stellaris лучше показывает уровень интеллекта, чем полученное образование?


Я приведу один пример. У меня есть очень близкий человек, у него 9 классов образования. Понятно, что в обществе к такому пренебрежительно относятся. Но он с детства всегда играл в хорошие игры, первый Fallout проходил, например. Всегда было понятно, что у него все в порядке с интеллектом, несмотря на 9 классов. Сейчас у него все хорошо, есть успешный бизнес. Я уверен, что это не единственный пример (собственно, я знаю еще примеры).

Если взять SpaceChem это еще одна игра, которая сильно коррелируется с IT. В Steam можно найти отзывы на неё, вроде прихожу с работы программистом, снова программирую этот химический завод. А в Stellaris и другие игры от Paradox просто невозможно играть без хорошо развитой рабочей памяти. Там очень много правил, и если их не держать в уме, все рушится. Если в какой-то игре в том же Stellaris, или даже в Skyrim у человека наиграно 500 часов, из этого можно сделать определенные выводы. У Skyrim нет онлайна, все квесты можно переделать часов за 100 значит, человек что-то креативное сам придумывает, проявляет нестандартное мышление. Такие связи тоже есть, и люди, склонные к творческим профессиям, часто играют в определённые игры огромное количество часов, придумывая что-то самостоятельно. К таким можно отнести Stardew Valley или Cities: Skylines я в них играл и просто проходил, но они могут придумывать красивую геометрию города, например, делать свои карты или что-то еще необычное.

Научная сторона: как собираются данные, как анализируются, почему создатели платформы уверены в том, что рассказывают?


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

Какие игры рекомендуются для того, чтобы прокачать, например, уверенность в себе?


Важный вопрос. Аудитория, с которой мы начали (мы, конечно, будем расширяться в будущем) это довольно трудная аудитория, геймеры. Часто они бывают на низкооплачиваемых профессиях, которые могут быть автоматизированы. Зачастую, когда с человеком общаешься или опрашиваешь его, возникает впечатление, что его основная трудность не в том, что он чего-то не умеет, а в неуверенности. Даже если человек играет в те же игры от Paradox, объективно сложные, он все равно говорит да я ничего не могу, куда мне. Неуверенность это один из ключевых моментов. Сейчас я не могу посоветовать определенные игры, но мы подходим к этому комплексно. Одна из задач нашей платформы помогать людям объективно видеть свои плюсы. Я очень надеюсь, что это получится.

Будете ли анализировать игровых стримеров?


У нас был интересный эксперимент, когда Ирина с HR-ом анализировали стримера по Fortnite, подмечали некоторые навыки, но в целом это планы на будущее.

Существуют разноплановые слои игровой информации. Самый простой это сами аккаунты XBOX / PS Live / Steam, часы игры, ачивменты, рецензии, и на это сейчас делается упор. Плюс опросы, которые человек заполняет более широко; здесь все чуть сложнее. Следующий слой это внутриигровое поведение человека, тут гораздо сложнее. Мы на это нацелены, но здесь нужны более серьезные подходы. Хотя уже есть примеры например, компания, которая анализирует игроков в DotA и предлагает советы по тренировке.

Расскажите о людях, которые играют в одну игру (например, action), она им надоедает, они идут в следующую (например, гонку), и так далее, они не заканчивают ни одну из них и постепенно возвращаются по кругу.


Интересный вопрос. Заставил меня призадуматься. В жизни у людей тоже так бывает, что они постоянно все бросают.

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

Перейдем ко второй части прокачке софсткиллов, я это люблю не меньше, чем анализ игр. Я до этого проекта один раз делал это целенаправленно, и мне это помогло в жизни.

В RPG я обычно играл за воинов, очень редко за магов (если это фэнтези); все прямолинейно, обычно, типа lawful good. Но я попробовал выйти из этого застарелого паттерна, и в очередную сессию в Enderal (это мод для Skyrim, бесплатный, отличного качества) решил играть максимально неблизким мне персонажем. Я стал играть за ассасина, и это был невероятный экспириенс. Я делал это осознанно, анализируя свои ощущения. Изначально я думал господи, да зачем я его взял, сейчас бы тут все решил за воина. А потом оказалось, что есть много прикольных возможностей, можно проходить различными способами, иногда даже лучше, чем воином.

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

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

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

Создание персонажа затягивается на три дня, наконец завершаю; блин, не то получилось, начинаю читать советы по созданию, сразу же получаю спойлеры в общем, неприятно, удовольствие рушится. Но потом я стал изучать этот вопрос; преподавать я люблю, я долго преподавал. Стал думать, как можно прокачать принятие решений. Есть определенные советы: например, попробовать придумать третий вариант, совместив два имеющихся. Это полезно.

Но нужно помнить, что для того, чтобы совет был действительно полезным, им нужно пользоваться. Он должен войти в привычку, скоррелироваться с бытом. Здесь как раз помогают игры. Если подумать сколько решений мы принимаем в день в жизни? Имеются в виду именно значимые решения, которые заставляют задуматься, а не те, которых мы даже не замечаем (по подсчетам, их может быть 35 тысяч). Их не так много. Но в игре их много например, каждый ход в Civilization это пачка решений. И к каждому из них можно применить совет. По моим наблюдениям, для того, чтобы совет вошел в привычку в жизни, нужна неделя-две, если регулярно пользоваться им, но в играх на это нужно несколько часов. В играх очень высокая плотность решений; кроме того, эмоции вызывают запоминание.

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

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

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

У нас на тему вижна был интересный стрим, кстати. И здесь шикарно помогают RPG. Когда я играл в Fallout: New Vegas, я придумал себе образ персонажа, его предысторию, жизненные принципы и цели и тут внезапно получилось, что решение по генерации персонажа разрешается не за целый день, как обычно бывает у меня, а за пять минут. Каждое решение, встреченное в игре, я принимал с точки зрения целей меня-персонажа и все решения принимались элементарно. Здесь главное то, что мозг это запоминает, и ты привыкаешь думать о целях, когда принимаешь решения; более того, мозг запоминает и то, насколько легче даются решения, если есть цель. Естественно, наша методика обучения не ограничивается играми. Нужно поиграть потом применить в жизни, снова поиграть снова применить. Игры дают привычку, применять в жизни становится легко, и это действительно помогает. Если честно, я очень нервничал, пока не увидел положительные отзывы я всегда стараюсь научить людей, для меня очень важно, чтобы они что-то усваивали. В отзывах люди писали, что им стало веселее играть, они перестали читать спойлеры, они начали придумывать кучу безумных историй внутри игр особенно мне запомнилась одна история из RimWorld. И в жизни наши советы оказались полезны, наши ученики их применяют. Важно не забывать, что без игровой составляющей применение таких советов занимает раз в пять больше времени, и зачастую у людей не хватает терпения применять их.

Игры как опросник сотрудника. Почему опросник легко обмануть, а игру нет?


Действительно, по профилю можно анализировать человека. Это мне тоже нравится. Игру не обманешь разве что отдашь свой аккаунт в какой-то сервис, где за деньги выбивают ачивки, но это уже какое-то безумие. Если человек наиграл тысячу часов и получил определенные ачивки скорее всего, так и было, тогда как опросники люди часто обманывают подсознательно, пытаясь показать себя кем-то другим. Конечно, хорошие опросники составляются в расчете на раскрытие обмана, но это далеко не всегда работает. Даже в наших опросах получается много каши. А в играх, если играл значит, играл.

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

Например, как сказать, что человек программист? Мы знаем, что у него обязательно должен быть этот полу-софт-полу-хард-скилл алгоритмическое мышление, по играм его можно выявить. А в софт-скиллах? Если работаешь в науке, то можно вообще сидеть одному, делать свои проекты и ни с кем не общаться коммуникации не нужны, упорство тоже не особенно нужно, так как дедлайны в науке бывают нечасто. Но вот в стартапе все совсем по-другому: коммуникация важна, дедлайны, постоянные кризисы, нужна стрессоустойчивость. Кстати, по играм можно определить стрессоустойчивость я всегда обращал внимание на то, что люди, которые играют в различные хоррор-игры, например, обычно лучше переносят стресс. Или обычный коммерческий разработчик для него тоже другой набор требований. Крупная компания, отчеты, встречи, нужна аккуратность, коммуникация тоже нужна.

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

Как работает профориентирование?


Я расскажу о нашей мечте каким я вижу проект через определённое время, и какой путь я хотел бы давать человеку, который к нам пришел.

Первое это интроспекция: помочь через игры, через то, как человек играет, намного лучше разобраться в себе. Поставить вижн, понять, куда хочется прийти, понять core motivations. Я искренне считаю, что, если человек в жизни занимается чем-то, что не относится к его главной мотивации и главному счастью, то это какая-то неправильная жизнь.
Хотя не обязательно, чтобы мотивация лежала именно в его работе. Например, если core motivation лежит в семье человека, то он может работать на ее благо и тоже получать огромное удовольствие от этого.

Мне очень хочется помочь людям. Это было мое хобби всегда, я знал, как это делать, знал некоторые приемы. Но в играх это делать намного проще помочь, поставить, сформулировать, чего человек четко не хочет, понять, в чем человек силен, а дальше помочь пользователю сформировать путь к этим вещам. По развитию навыков, по выполнению упражнений в жизни и в играх, по конкретным вещам например, по прохождению каких-то курсов. Наша мечта сделать так, чтобы это было похоже на skill tree в играх, с различными навыками и выполнением требований для их обретения. Когда этот этап пройден, когда четко можно сказать, какие навыки есть у человека, можно помогать человеку найти работу мечты. От работодателей идет множество запросов на разные вещи; например, я недавно разговаривал с другом по ВМК, у него свой айтишный бизнес он говорил, как сложно найти программиста-управленца, тимлида в программировании. Программистов самих по себе очень много, хотя среди них еще нужно выбрать хорошего программиста, но еще сложнее найти человека, у которого при программистской базе есть менеджерские навыки и навыки коммуникации. Игры здесь, конечно, могут помочь.

Кстати, нам в проект нужны два человека. Один data scientist; работа абсолютно творческая, огромное поле для деятельности, куча задач, очень много работы. Пример задачи: есть названия профессий и есть базы данных с этими профессиями, но названия не коррелируют (того же программиста могут называть по-всякому программер, кодер, software engineer и так далее). Здесь может помочь обработка описаний профессий и вакансий с помощью NLP. Потом из всего, что есть из инсайтов, данных, надо будет формировать правила, rule-based-систему, которая будет выдавать людям полезную информацию, которую они прочтут. Работы очень много, безумно интересная работа я бы сам дальше занимался ею, но на все времени не хватает. Поэтому нам очень нужен человек, которому интересно работать с данными, ML, статистикой; кстати, мой друг поможет со статистикой, он гуру статистики. И, конечно, наше дополнительное требование любовь к играм, эрудиция в играх, а также общая эрудиция надо понимать, что с чем связано, какие есть профессии, работы. Надо знать Python, иметь опыт и любить данные. Должно быть знакомо это состояние treasure hunting, когда смотришь на табличку с данными и думаешь может, попробовать так, может, здесь будет статистически значимо. Я только сегодня этим занимался, с данными по игрокам в EVE Online. Сначала вроде бы ничего, но потом все-таки нашел значимое.

Второй человек, которого мы ищем full stack программист. Опять же, нам нужны исключительно фанаты игр, которые хотят, чтобы игры помогали людям.

Более того, у меня есть мечта. То гипер-оказуаливание игр с дофаминовыми ямами, которое сейчас происходит, меня очень расстраивает. Я помню мой глубокий шок, когда я узнал, что это есть не только на мобильных платформах. Когда-то мне подарили PlayStation 3 c GTA5 я стал играть, мне нравилось, попалась сложная миссия. Я ее несколько раз провалил, и увидел окошко: нажмите кнопку для пропуска. И как это понимать? Это ведь серия, в которой есть сложные задания, приносящие огромную радость при успехе вспомните миссию с вертолетиком в Vice City. Моя искренняя мечта состоит в том, что Game Academy будет развиваться и сможет доказать пользу игр, и этим повлияет на геймдев вырастет спрос именно на хорошие игры, и их будет больше выходить.

Важный момент состоит в том, что попытки сделать edutainment обычно натыкаются на то, что создатели не могут выдержать баланс: люди, которые преподают, обычно не разбираются в играх, и наоборот, и получается полная каша. Мне приносит безумную радость то, что в нашем курсе, хотя бы, удалось совместить: и в игры интересно играть, и польза есть.
В общем, нам нужен full stack-программист, которому это нравится. Мы сотрудничаем с очень крутым продукт-дизайнером, у нас есть представления, у нас есть wireframe и это нужно реализовывать, с упором на frontend. Дизайн будет, backend по большей части на мне и на data scientist, но совмещать это нужно. Нам нужен человек с опытом законченных проектов чтобы были проекты с deployment и пользователями.

Но, опять же, мы стартап, нас мало, если что задачу можно отдать на аутсорс, и в команду нам нужны люди, которые горят играми и хотят, чтобы игры помогали людям.
Если вы хотите поделиться своим опытом того, как вам удалось что-то развить в себе с помощью игр, пишите на почту Game Academy, или на мою почту. Мы рады любому сотрудничеству: может быть кто-то захочет с нами работать; многим нравятся наши проекты, многие помогают по комьюнити и по другим вещам. Я сам начал с того, что просто хотел помочь этой команде. Любому живому обсуждению про игры мы тоже рады. Особенно интересный момент то, в какие игры вы играете по ночам, что именно держит вас в них и не дает идти спать, и чувствуете ли вы, что по жизни вас держат такие же вещи. Если кому-то будет интересно отписаться о своем опыте, буду очень рад.



Что было ранее


  1. Илона Папава, Senior Software Engineer в Facebook как попасть на стажировку, получить оффер и все о работе в компании
  2. Борис Янгель, ML-инженер Яндекса как не пополнить ряды стремных специалистов, если ты Data Scientist
  3. Александр Калошин, СEO LastBackend как запустить стартап, выйти на рынок Китая и получить 15 млн инвестиций.
  4. Наталья Теплухина, Vue.js core team member, GoogleDevExpret как пройти собеседование в GitLab, попасть в команду разработчиков Vue и стать Staff-engineer.
  5. Ашот Оганесян, основатель и технический директор компании DeviceLock кто ворует и зарабатывает на ваших персональных данных.
  6. Сания Галимова, маркетолог RUVDS как жить и работать с психиатрическим диагнозом. Часть 1. Часть 2.
  7. Илья Кашлаков, руководитель фронтенд-отдела Яндекс.Денег как стать тимлидом фронтендеров и как жить после этого.
  8. Влада Рау, Senior Digital Analyst в McKinsey Digital Labs как попасть на стажировку в Google, уйти в консалтинг и переехать в Лондон.
  9. Ричард Левелорд Грей, создатель игр Duke Nukem 3D, SiN, Blood про личную жизнь, любимые игры и о Москве.
  10. Вячеслав Дреер, гейм-дизайнер и продюсер игр с 12-летним стажем про игры, их жизненный цикл и монетизацию

Подробнее..

Перевод 10 лучших игр по программированию, которые улучшат ваши навыки

11.03.2021 20:12:02 | Автор: admin

Вы помните далёкие дни из детства, когда вы, проводили целый день, а иногда даже не ели целый день, чтобы поиграть в игры на Nintendo? (Ах, дни Mario и Contra!!!)

С того времени игры претерпели гигантские преобразования и сфера стала более обширной. Это уже не просто хобби. Сейчас в Интернете доступно множество игр, связанных с программированием, и вы можете использовать их чтобы изучить и отточить свои скилы в увлекательной форме. Более того, эти игры могут помочь вам улучшить навыки решения задач, поскольку вам нужно будет решать задачи различной сложности, а также соревноваться с другими опытными программистами по всему миру. Специально к старту новых потоков курсов Fullstack-разработчик на Python, разработка на C# и разработка на Java, в этой статье мы отобрали несколько таких игр, играя в которые можно параллельно качать и себя самого.

1. Untrusted

Приключения доктора Эвала!

Untrusted это приключенческая онлайн-игра, предназначенная для людей, которые хотят попрактиковаться и проверить свои навыки в JavaScript . В этой игре от вас требуется направлять доктора Эвала через машинный континуум и изменять его реальность, чтобы получить свободу. Игра предоставляет вам игровую среду, похожую на мошенническую, и окно консоли с JavaScript-кодом. У вас будет доступ ко всем исходным кодам, но, чтобы спастись, вам нужно внести необходимые изменения в этот код.

В игре есть несколько уровней, таких как cellBlockA, где вы будете генерировать и удалять стены, theLongWayOut, в котором вам нужно создать новый выход, и многое другое. Игра довольно увлекательное путешествие, если вы обладаете хорошими знаниями концепций и программирования JavaScript. Интерфейс игры выглядит так:

2. Robocode

Было бы здорово изучать программирование, и создавать боевых роботов-танков (звучит увлекательно, правда?).

Да, вы можете сделать это в известной игре Robocode. Robocode позволяет разработать боевого робота-танка с использованием Java или .NET, для борьбы с другими танками. Вам нужно написать ИИ для робота, чтобы он знал, что делать и как реагировать на события, происходящие на поле битвы.

Игра очень полезна для изучения и практики нескольких языков программирования, таких как Java, Scala, и C# . Она также поможет вам попасть в сферу искусственного интеллекта . Более того, Robocode предоставляет вам полноценную среду разработки: есть собственный установщик, встроенный редактор роботов и компилятор Java. Кроме того, Robocode это проект с открытым исходным кодом, и вы все можете придумывать свои собственные надстройки или режимы, чтобы продемонстрировать свои навыки разработки.

3. Elevator Saga

Elevator Saga поможет вам продемонстрировать свои навыки в JavaScript в контексте программирования движения лифтов для эффективной перевозки людей. Задачи самые разные, начиная с простых: перевезти 15 человек за 60 секунд или меньше и т. д., И они постепенно усложняются. Вам нужно придумать оптимизированный алгоритм, чтобы сократить время ожидания пассажиров. Игра действительно очень полезна для работы над вашими навыками JavaScript и подходами к оптимизации алгоритмов.

Кроме того, интерфейс Elevator Saga довольно прост, всё, что вам нужно, ввести свой код в окно ввода и нажать кнопку Применить, чтобы начать испытание. Некоторые из примеров кода для Elevator Saga приведены ниже, чтобы дать вам общее представление:

  • чтобы сообщить лифту о переходе на 1-й этаж: elevator.goToFloor(1);

  • чтобы остановить лифт, если он движется: elevator.stop();

  • чтобы получить номер этажа, на котором в настоящее время находится лифт: elevator.currentFloor();

  • и многие другие.

4. Vim Adventures

Если вы часто испытываете трудности с VIM, то Vim Adventures наверняка создан для вас!! Vim Adventures это онлайн-игра, которая позволяет вам изучать горячие клавиши VIM и другие известные концепции в увлекательной и интересной форме с помощью игровой среды, подобной Zelda. Эта игра упрощает изучение и понимание мощного текстового редактора Vim, который впоследствии поможет вам стать более эффективным программистом.

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

5. CodeCombat

CodeCombat в основном рекомендуется тем людям, которые имеют небольшой или даже нулевой опыт в программировании, поскольку игра не только помогает вам практиковать свои навыки, но и обеспечивает замечательный процесс обучения в формате игры. Вы можете изучить различные языки программирования, такие как Python, JavaScript, CoffeeScript, Lua и т. д., с помощью игры. Вам нужно будет написать код на любом из этих языков, чтобы сообщить персонажу, что ему нужно делать. Более того, игра начинается с простых головоломок и задач, а затем уровень сложности постепенно растёт. И, да, в игру также включены различные обучающие программы, позволяющие овладеть синтаксисом языка.

Кроме того, CodeCombat это проект с открытым исходным кодом, и вы можете не только учиться и играть, но и вносить вклад в исходный код, чтобы добавлять новые функции, исправлять ошибки и т. д., чтобы повысить уровень своего программирования. Что ещё нужно?

6. Flexbox Defense

Flexbox Defense действительно один из лучших способов укрепить свои знания и навыки CSS Flexbox! Это игра в жанре Tower Defense, в которой вам необходимо не дать приближающимся врагам пройти через вашу оборону, переместив башни на такое место, чтобы турели могли стрелять во вторгшихся врагов, прежде чем они пройдут через вас. Вам необходимо использовать свойство justify-content в контейнере для размещения ваших башен. Несколько наиболее распространённых значений, принимаемых свойством justify-content, следующие:

  • flex-start: группировать элементы в начале главной оси;

  • flex-end: группировать элементы в конце главной оси;

  • center: группировать элементы в центре;

  • space-around: равномерно распределить элементы по главной оси так, чтобы вокруг всех элементов было равное пространство.

Есть много других свойств CSS Flexbox, которые используются в игре, такие как align-items, flex-direction, order и некоторые другие.

7. Code Hunt

Ещё игра в списке, которая может помочь вам попрактиковаться и улучшить свои навыки программирования в игровой манере, это Code Hunt. Это игра по программированию от Microsoft Research. Игра основана на головоломках, которые вы должны изучить, используя данные подсказки и контрольные примеры. Сначала вам нужно определить шаблон, а затем написать решение. Code Hunt позволяет вам овладеть двумя известными языками Java и C #. Игра разработана таким образом, чтобы научить вас основам этих двух языков.

Поскольку Code Hunt принадлежит Microsoft, её предпочитают миллионы студентов (и даже профессионалов) во всём мире, и, если вы с нетерпением ждёте, чтобы укрепить свои навыки владения Java или C# более увлекательным способом, вы, безусловно, можете попробовать.

8. CheckIO

CheckIO это игра по программированию, которая позволяет вам улучшить свои навыки, особенно для двух языков Python и TypeScript . Игра рекомендуется как новичкам, так и опытным программистам для повышения уровня своих навыков, так как она предоставляет вам множество захватывающих задач различных уровней сложности. Каждый набор этих задач расположен на разных островах, и пользователям необходимо решить требуемую задачу или головоломку, чтобы перейти с одного острова на другой. Кроме того, обогащающее и поддерживающее сообщество CheckIO помогает вам делиться знаниями и опытом с разными блестящими умами по всему миру.

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

9. Screeps

А вот и ещё одна популярная игра по программированию для всех программистов Screeps! Это онлайн-стратегия в реальном времени, которая требует от вас хотя бы некоторых базовых знаний в области программирования. В этой игре вам нужно создать свою собственную колонию в определённом мире, доступном всем игрокам. А колония сможет добывать ресурсы, создавать юнитов и завоевывать территории. Более того, необходимо запрограммировать реакцию юнитов на события, и вы можете сделать это, используя язык программирования JavaScript .

Вам также необходимо знать, что написание скрипта для Screeps ничем не отличается от написания любого другого приложения JavaScript. И вы также можете разделить свои скрипты на модули с помощью синтаксиса Node.js, чтобы сделать игру более удобной.

Кроме того, вы можете использовать другие языки, такие как C++ и т. д., А также можете компилировать их с помощью WebAssembly. А также Screeps позволяет вам вносить свой вклад в разработку игрового движка и изменять поведение игровых объектов.

10. CSS Diner

Наконец, CSS Diner игра по программированию, которая помогает вам практиковаться и совершенствовать свои навыки CSS. Игра помогает вам управлять селекторами CSS на всех 32 уровнях, включённых в игру. И уровень сложности каждого раунда повышается по мере прохождения игры. Игра состоит из различных захватывающих уровней в зависимости от нескольких важных атрибутов, таких как id, classname, empty, first-child, only-of-type и многих других. Более того, если вам нужна подсказка для решения определённого уровня, всё, что вам нужно сделать, это навести указатель мыши на элементы в таблице и просмотреть HTML-разметку.

Игра предоставит вам лучшее понимание для выбора определённых элементов в HTML и CSS и впоследствии поможет вам перемещаться по элементам DOM, когда дело касается JavaScript. И самое приятное то, что вы можете играть в CSS Diner в своем браузере без каких-либо затрат или хлопот, таких как вход в систему, создание учётной записи и т. д.

Также можно принять во внимание несколько других игр: Codewars, SQL Murder Mystery и Duskers. Излишне говорить, что почти каждый технический энтузиаст так или иначе склонен к играм. А с помощью упомянутых выше игр по программированию вы можете улучшить свои навыки более увлекательным и авантюрным способом. Тем не менее вам не рекомендуется идти на компромисс с продолжающимся процессом обучения и использовать эти игры в течение ограниченного времени, поскольку избыток чего-либо всегда неблагоприятен.

Если у вас есть на примете полезные игровые проекты подобные этим, но в список не попавшие делитесь ими в комментариях!

Играми поделились, а теперь поделимся и релевантными программами обучения. Тем кому в освоении нового не хватает "крепкого плеча" ментора, которая поможет довести начатое до конца добро пожаловать на наши программы Fullstack-разработчик на Python, разработка на C# и разработка на Java и да прибудет с вами сила.

Узнайте, как прокачаться и в других специальностях или освоить их с нуля:

Другие профессии и курсы
Подробнее..

Гайд по Flight Simulator от пилотов учимся управлять самолетом

02.09.2020 16:16:09 | Автор: admin

Всем привет! В связи выходом нового Microsoft Flight Simulator я и мои друзья решили написать для вас гайд по полетам в симуляторе.



Учиться мы будем на Cessna 152 одном из самых востребованных самолетов. Он прост в управлении, прощает многие ошибки и весьма популярен в летных школах сам автор учился летать именно на нем. Что немаловажно, встроенное в Microsoft Flight Simulator обучение также использует его.


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


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


А теперь вперед, за штурвал! Загружайте первый урок.


Основы управления самолетом


В полете самолет управляется по трем осям.


Изменение наклона вверх/вниз называется управлением по тангажу (pitch). Основной способ изменить тангаж самолета дать штурвал от себя (нос вниз) или на себя (нос вверх). На тангаж также влияет множество других параметров, некоторые из которых мы разберем ниже.


image


Наклон самолета на крыло называется управлением по крену (bank/roll). Основной способ создания крена поворот штурвала влево или вправо. Крен будет расти до тех пор, пока штурвал не будет возвращен в нейтральное положение, после чего большая часть самолетов будет стремиться удержать заданный крен. Для нейтрализации крена обычно выполняют обратное движение штурвалом. Как и в случае с тангажом, крен также зависит от множества других параметров.



Рыскание (yaw) это движение носа вправо/влево. Как и крен, рыскание зависит от многих внешних факторов. Основной способ управления рысканием в самолете это педали.



Обратите внимание, что педали в самолете имеют двойную функцию. Их можно нажимать (это работает как тормоз), а можно толкать вперед (как руль, на земле и в воздухе).


Помимо штурвала и педалей, самолет имеет несколько других важных органов управления:


Ручка управления дроссельной заслонкой (throttle), далее газ эквивалентна педали газа и управляет количеством поступающей в двигатель топливно-воздушной смеси. На большей части самолетов она имеет закругленную форму и окрашена в черный цвет.


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


Колесо управления триммером руля высоты (trim wheel), далее триммер. Как мы выясним чуть позже, изменение параметров полета требует от пилота приложения разного давления на штурвал. Поворот этого колеса изменяет положение нейтральной точки штурвала то есть вы сможете сделать так, чтобы штурвал сам поддерживал это давление без вашего участия.



Контролируем тангаж


Пройдите начальное обучение и попросите инструктора дать вам немного полетать в свободном режиме. В центре приборной панели расположен авиагоризонт (artificial horizon, attitude indicator, AI). Его легко узнать по характерному синему и коричневому цвету, которые обозначают соответственно небо и землю. По центру прибора расположена точка, которая показывает нос вашего самолета, а по бокам риски, символизирующие крыло.


Слева от него расположен указатель воздушной скорости (airspeed indicator, ASI). Читается примерно так же, как спидометр в наземном транспорте, но скорость измеряет в узлах морских милях (1.852 км) в час.



Мы учимся летать по правилам визуальных полетов, поэтому сам авиагоризонт нам использовать необязательно. Тем не менее, наш полет это хорошая возможность ознакомиться с принципами его работы.


За изменение тангажа отвечает руль высоты (elevator), расположенный, как правило, на хвосте самолета. Настало время им воспользоваться.


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


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


Проверьте скорость. Вы увидите, что она упала.



Нос направлен вверх


Отпустите штурвал. Самолет начнет сам выводить нос в горизонт. Снова проверьте скорость она должна вернуться к исходному значению.


Повторите ту же процедуру, но наклонив нос вниз. Теперь землю видно больше, чем небо, а скорость растет. При отпускании штурвала нос возвращается в прежнее положение.



Нос направлен вниз


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


Подытожим. Первичный эффект руля высоты это изменение тангажа самолета. Вторичный же это изменение скорости.


Создаем крен


За управление креном обычно отвечают элероны (ailerons) специальные рулевые поверхности, расположенные ближе к законцовкам крыла. Они контролируются поворотом штурвала.


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


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



Самолет в крене


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


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


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


Первичным эффектом элеронов является создание крена, а вторичным рыскание.


Управляем рысканием


За рыскание отвечает руль направления (rudder), расположенный на хвосте самолета. Самое время познакомиться с ним.


Выровняйте самолет и проверьте скорость. Снизу от указателя скорости расположен другой прибор, координатор разворотов (turn coordinator). Нас интересует черный шарик, плавающей в специальной дужке снизу. Как правило, в обычном полете он находится в центральной области.


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


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



А вот так выглядит рыскание


Первичным эффектом руля направления является рыскание, а вторичным крен.


Даем газку


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



Не касаясь штурвала и педалей, полностью дайте газ.


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


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


Обратите внимание также на то, что в момент изменения режима самолет слегка рыскает вправо/влево, в зависимости от того, увеличили или уменьшили вы режим.


Первичным эффектом от изменения газа является изменение оборотов и скорости. Вторичным же эффектом является изменение тангажа и рыскания.


Выпускаем закрылки


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


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


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


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


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



Солнечные батареи в южной Англии


Учимся триммировать


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


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


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


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


Мы только что выполнили триммирование самолета. Давайте обобщим эффект от триммера: поворот колеса триммера руля высоты меняет усилия на штурвале по оси тангажа.


Общие советы по пилотированию


Несколько советов по правильному пилотированию самолета и самым частым ошибкам.


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


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



Окрестности Рима


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


Не стесняйтесь триммировать самолет, но не стремитесь контролировать тангаж триммером. Правильная последовательность действий: изменение конфигурации, удержание носа штурвалом, снятие усилий со штурвала триммером. Не надо использовать триммер вместо штурвала.


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


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


Не превышайте крен в 15 градусов, особенно на низкой скорости. На первых порах не превышайте его вообще.


Эффективность рулевых поверхностей зависит от их обдувания воздухом. Чем сильнее воздушный поток, тем меньшее отклонение рулевой поверхности потребуется для достижения нужного результата. Обдув хвостовых рулевых поверхностей (рулей высоты и направления) производится встречным потоком и струей от винта. Обдув элеронов производится только встречным потоком. На меньших скоростях потребуется большее отклонение рулевых поверхностей.


Итоги


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


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



Хоть эту статью и ревьюили два коммерческих пилота, она может не покрывать некоторых интересных для вас аспектов. Если так, обязательно дайте мне знать об этом в комментариях. Увидимся в небе!


Подробнее..

Игра на WebAssembly, часть 2 уровни и опыт, админка

01.07.2020 02:19:17 | Автор: admin
В предыдущей статье получилось сделать прототип игры с вопросами. Но не получилось сделать это полноценно на WebAssembly. В этот раз предлагаю конвертировать этот прототип, сделав с него полноценное WebAssembly приложение, а так же добавить к нему атрибуты большинства игр опыт и уровни игрока. А так же простую логику при переходе на некоторые уровни будем открывать новые навыки.

Demo



Создаем WebAssembly проект


Создадим новый проект, который будет хостить WebAssembly приложение, внутри Web приложения (ASP.NET Core ). Если быть точнее, то Web приложение возвращает WebAssembly приложение, которое остается в браузере у пользователя и взаимодействует с сервером посредством http (или веб сокетов). Для этого, нам нужно создать BlazorApp проект и выбрать пункт ASP.NET Core hosted


Или же, из консоли:
dotnet new blazorwasm --hosted


По скольку у нас уже есть Blazor проект с предыдущей статьи, а синтаксис одинаковый у проектов с серверным хостингом и WebAssembly, то все страницы можно просто скопировать. Но с классами для логики так не получится нужно создать новый контроллер, как часть backend-а. Это обычный asp.net контроллер, с которым наш клиент будет коммуницировать.

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

Меняем версию на .NET 5 preview 6


Срочной необходимости это делать нет. Но, поскольку предварительная версия .NET 5 уже доросла до шестой, поддерживает Blazor и в ней есть некоторые новые фичи (например, extension методы для запросов на сервер), то почему бы и не перейти на неё сейчас. Мигрировать довольно просто, если знать что делать. В нашем случае это замена версий target framework в серверном проекте и переход на новую версию всех nuget пакетов.

Github commit: Update to .NET 5 preview 6


Добавляем опыт и уровень


Для связи между уровнем и опытом будем использовать простую формулу: минимум опыта для уровня = 2^(уровень). Для того, чтобы игрок мог понимать сколько опыта он накопил и какого он уровня, добавим в его модель эти два параметра. А так же, добавим поле в таблицу с вопросами для индикации сколько очков опыта даст один вопрос. Пока все вопросы будут добавлять 1 очко опыта.

Для отображения на пользовательском интерфейсе, используем простые компоненты Bootstrap.
<div class="row">    <div class="col-md-auto">        <span class="badge badge-warning">            Уровень <span class="badge badge-light">@state.Level</span>        </span>    </div>    <div class="col">        <div class="progress mt-1">            <div class="progress-bar" role="progressbar" style="width: @GetExperienceWidgetWidth()" aria-valuenow="@state.Experience" aria-valuemin="0" aria-valuemax="@experienceDiff">                XP: @state.Experience            </div>        </div>    </div></div>


Результат:


Github commit: Add level and experience to UI


Навыки уровней


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

Github commit: Show features depending on level


Так же добавим рейтинг игроков с наивысшим уровнем. Это послужит примером того, как выглядит комит с отдельной компонентой, которая касается разных существующих частей. На мой взгляд, выглядит очень даже понятно.
Github commit: Add leader board


В этом же изменении, при редактировании фидбека на неправильный ответ, наткнулся на интересный момент. Попробовал одновременно подписаться на события нажатия клавиши (если это Enter отправить на сервер) и изменения значения контрола (если оно пустое убрать сообщение о не верном ответе). Оказалось, что такой вариант не поддерживается. Что, в свою очередь спровоцировало как-то это обойти. В описном тикете есть варианты, но я попробовал еще один:
 var timer = new Timer(1);timer.Elapsed += (object sender, ElapsedEventArgs e) => { wrongStyle = "visibility:hidden"; };timer.Start();

Работает именно так, как мне нужно при изменении ответа, сообщение пропадает. Хотя и таймер на 1 миллисекунду. Вообще, использования .NET таймера внутри браузера звучит странно. Но, похоже, что если пользователь не активен, то таймер автоматически замораживается.

Админка


Приятным бонусом использования Blazor внутри ASP.NET Core приложения является возможность использования инструментов зрелого фреймворка. В данном случае мы можем сделать простую админку для просмотра\редактирования вопросов с помощью кодо-генерации.

Добавим несколько типичных строк в логику конфигурации авторизации (Startup.cs) и сгенерируем пару стандартных частей Identity страницы для авторизации и контроллер с представлениями для просмотра вопросов. Получилась простыня кода, из которой руками писалось всего несколько строк.

Github commit: add admin part


Проверка ответов и безопасность


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

Выводы


На сегодняшний день есть как позитивные так и негативные моменты разработки на Blazor. Самое приятное это видеть как интерактивно меняется пользовательский интерфейс, при этом использовать только C# как язык программирования. Как ни странно, не смотря на простоту фреймворка, требуемый пользовательский интерфейс получается сделать довольно просто и при этом всё работает. Из негативных моментов главная проблема, это ощущение сыроватости. Возможно при использовании стабильных версий всё выглядит лучше.

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

Результат:

Github
Demo
Подробнее..

Перевод Реверс-инжиниринг тетриса на Nintendo для добавления Hard Drop

25.03.2021 18:04:40 | Автор: admin

Тетрис на Nintendo одна из моих любимых версий тетриса. Моя единственная жалоба заключается в том, что ему не хватает возможности Hard Drop мгновенного падения текущей фигуры и её фиксации на месте. Давайте её добавим

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

Ускоренное и мгновенное падение

Текущая фигура перемещается на одну клетку вниз за каждый тик игры. Реализации тетриса обычно предоставляют два способа ускорить падение ускоренное и мгновенное падение.

В случае ускоренного падения нажатие кнопки мгновенно переместит текущую фигуру вниз на одну позицию, а удерживание кнопки заставит её упасть быстрее.

Hard drop мгновенно опускает текущую фигуру и фиксирует её на месте. Поскольку игроку может быть сложно визуально определить, выровнена ли фигура с тем местом, куда она должна приземлиться, реализации тетриса с мгновенным падением обычно отображают контур этой фигуры, показывающий, где она в конечном счёте окажется.

До моих изменений NES Тетрис поддерживал только ускоренное падение.

Артефакт

Я сделал программу на rust, которая считывает файл NES ROM в формате INES. Если на входе был NES Tetris (обычно файл назван что-то вроде Tetris(U)[!].nes), на выходе она создаст новый файл ROM NES, который представляет собой NES Tetris, с добавлением быстрого падения фигуры.

Входной файл должен иметь хэш sha1 a99f922e9da20b2a27e4398348505d2e9d15271b.

$ cargo install nes-tetris-hard-drop-patcher   # install my tool$ nes-tetris-hard-drop-patcher < 'Tetris (U) [!].nes' > tetris-hd.nes   # patch a NES Tetris ROM$ fceux tetris-hd.nes   # run the result in an emulator

Этот инструмент полагается на то, что пользователь получит ROM-файл NES Tetris. В нём нет встроенного тетриса. Полученный файл ROM совместим со всеми эмуляторами NES он неспецифичен для fceux.

Патч

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

Инструменты

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

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

b.inst(Clc, ());                  // clear carry flagb.inst(Rol(Accumulator), ());     // rotate accumulator 1 bit to the left (x2)b.inst(Rol(Accumulator), ());     // rotate accumulator 1 bit to the left (x4)b.inst(Sta(ZeroPage), 0x20);      // store current accumulator value at address 0x0020b.inst(Rol(Accumulator), ());     // rotate accumulator 1 bit to the left (x8)b.inst(Adc(ZeroPage), 0x20);      // add the accumulator with the value at 0x0020 (x12)

Это позволяет мне использовать rust как язык высокого уровня для ассемблерных программ NES. Гибкость Rust важна при добавлении пользовательского кода к существующей программе, написанной в 1980-х годах.

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

Наконец, я использовал сторонний эмулятор NES под названием Mesen, который может похвастаться богатым набором инструментов отладки. Он был полезен для понимания содержимого памяти и состояния графического чипа в конкретный момент.

Визуализация конечного положения фигуры

В NES есть два разных типа графики:

  • фон представляет собой сетку из плиток 8x8 пикселов;

  • спрайты это плитки, которые можно рисовать в произвольных местах на экране.

В большинстве игр используется комбинация фонов и спрайтов, и Тетрис не исключение.

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

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

Говоря о контурных плитках, я добавил в игру новую плитку, чтобы использовать её для призрачной фигуры:

Моя цель здесь выследить ту часть кода, которая рендерит текущую фигуры, чтобы повторно использовать этот код для рендеринга конечного положения фигуры.

Для рендеринга спрайтов на NES вы заполняете область основной памяти метаданными спрайта (положение, плитка и т. д.), а затем записываете адрес начала этой области памяти в регистр OAMDMA. (Прямой доступ к памяти атрибутов объекта OAM это специальная память для хранения метаданных спрайта, а DMA это общий термин для устройств, непосредственно считывающих и записывающих основную память.) Запись адреса в OAMDMA заставляет графическое оборудование NES копировать метаданные спрайта указанной области основной памяти и в специализированную память атрибутов объекта, которая будет использоваться во время рендеринга для рисования спрайтов.

Регистр OAMDMA отображается в адресное пространство ЦП по адресу 0x4014. Поиск в дизассемблированной программе по этому адресу показывает:

0xAB63  Lda(Immediate) 0x02       # load accumulator with 20xAB65  Sta(Absolute) 0x4014      # write accumulator to 0x4014

При этом значение 2 записывается в OAMDMA, в результате чего память от 0x0200 до 0x02FF копируется в OAM. И одна функция определённо передаёт управление подпрограмме как ответственная за заполнение буфера. Она находится в 0x8A0A и может многое рассказать о том, как работает Тетрис.

Она начинается с чтения значений из адресов 0x0040 и 0x0041, умножения каждого на 8 и добавления их к некоторым смещениям. На NES каждая плитка имеет размер 8x8 пикселей, так что это, по-видимому, переводится из координаты плитки в координату пиксела, где смещения являются компонентами координаты пиксела верхнего левого угла доски. Несколько минут копания в мезене подтверждают это: 0x40 это координата x, а 0x41 координата Y текущего фрагмента.

Затем функция считывает данные из 0x42. Это место всегда содержит значение от 0 до 12, которое, по-видимому, кодирует форму текущей фигуры, а также её вращение. Для фигур с вращательной симметрией (например, фигура S) несколько одинаковых вращений получают одно значение в 0x42. Я буду называть это значение индексом формы.

Каждая фигура в Тетрисе состоит из 4 плиток, и для каждой плитки рендерится один спрайт. Координаты в 0x40 и 0x41 это позиция фигуры, но для рендеринга спрайтов мы должны узнать положение каждой плитки. С этой целью эта функция обращается к таблице в ПЗУ по адресу 0x8A9C, которую я буду называть таблицей форм. Каждая из 13 частей (включая уникальные вращения) имеет 12-байтовую запись в таблице форм. Запись таблицы форм для фрагмента хранит по 3 байта для каждой из 4 плиток:

  • смещение плитки по оси y (относительно 0x41);

  • индекс спрайта, используемый при рендеринге плитки;

  • смещение плитки по оси x (относительно 0x40).

Эта функция вычисляет местоположение и индекс спрайта каждой плитки текущей фигуры и заполняет буфер OAM DMA этой информацией. Чтобы визуализировать призрачную фигуру, мне нужна аналогичная функция, за исключением того, что она отображает каждую плитку с контуром, а не плиткой из таблицы форм, и визуализирует фигуру с вертикальным смещением, так что фигура появляется в том месте, где она должна приземлиться после hard drop. Было бы нетривиально изменить эту функцию на месте, чтобы она была общей для призрачной и обычной фигуры, поэтому вместо этого я скопировал/вставил код и изменил его, чтобы сделать то, что мне нужно.

Сначала я стал использовать программу для просмотра памяти mesen, чтобы найти, казалось бы, неиспользуемую область ПЗУ. Я не знаю, что здесь делают строки с 0x00 и 0xFF! Также я не знаю, как изменить шрифт в mesen на Monospace!

Я выделил 512 байт памяти, начиная с адреса 0xD6D0. Первым кодом, который я добавил в эту область, была функция, которая просто вызывает существующую функцию обновления буфера DMA OAM:

b.label("oam-dma-buffer-update");// Call original functionb.inst(Jsr(Absolute), 0x8A0A);// Returnb.inst(Rts, ());

Мой инструмент для патча заменяет все вызовы исходной функции (0x8A0A) вызовами новой функции.

Затем я взял дизассемблированный код из исходной функции обновления буфера DMA OAM и вручную перевел его на язык rust для сборки NES.

Этот код:

0x8A0A  Lda(ZeroPage) 0x400x8A0C  Asl(Accumulator)0x8A0D  Asl(Accumulator)0x8A0E  Asl(Accumulator)0x8A0F  Adc(Immediate) 0x600x8A11  Sta(ZeroPage) 0xAA...

превратился в:

b.label("render-ghost-piece"); // function label so it can be called by name laterb.inst(Lda(ZeroPage), 0x40);b.inst(Asl(Accumulator), ());b.inst(Asl(Accumulator), ());b.inst(Asl(Accumulator), ());b.inst(Adc(Immediate), 0x60);b.inst(Sta(ZeroPage), 0xAA);...

Я изменил свою копию обновления буфера DMA OAM, чтобы использовать контурную плитку вместо плитки, считанной из буфера формы. Чтобы проверить это изменение, я обновил oam-dma-buffer-update, чтобы вызвать мою функцию вместо оригинала:

b.label("oam-dma-buffer-update");// Call new functionb.inst(Jsr(Absolute), "render-ghost-piece");// Returnb.inst(Rts, ());

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

b.label("oam-dma-buffer-update");  // Call original function first b.inst(Jsr(Absolute), 0x8A0A); // Render the ghost piece, passing the vertical offset argument in address 0x0028. b.inst(Lda(Immediate), 6); b.inst(Sta(ZeroPage), 0x28); b.inst(Jsr(Absolute), "render-ghost-piece"); // Return b.inst(Rts, ());b.label("oam-dma-buffer-update");// Call original function firstb.inst(Jsr(Absolute), 0x8A0A);// Render the ghost piece, passing the vertical offset argument in address 0x0028.b.inst(Lda(Immediate), 6);b.inst(Sta(ZeroPage), 0x28);b.inst(Jsr(Absolute), "render-ghost-piece");// Returnb.inst(Rts, ());

Теперь вычислим истинное вертикальное смещение от текущей фигуры до места, где она приземлится после падения. Наблюдая за памятью с помощью mesen, я заметил, что ничего, похоже, не работает с памятью от 0x0020 до 0x0028. Первые 256 байтов памяти называются нулевой страницей и обеспечивают более быстрый доступ, чем остальная часть памяти. Мне нужно 8 байтов нулевой страницы для хранения координат X, Y каждой плитки текущей фигуры и обнаружения столкновений, а также один дополнительный байт для хранения временных значений во время вычислений.

Начните с инициализации значений от 0x20 до 0x27 координатами X, Y каждой плитки текущей фигуры:

b.label("compute-hard-drop-distance"); // function label so it can be called by name laterconst SHAPE_TABLE: Address = 0x8A9C;const ZP_PIECE_COORD_X: u8 = 0x40;const ZP_PIECE_COORD_Y: u8 = 0x41;const ZP_PIECE_SHAPE: u8 = 0x42;// Multiply the shape by 12 to make an offset into the shape table,// storing the result in IndexRegisterX.b.inst(Lda(ZeroPage), ZP_PIECE_SHAPE);  // read shape index into accumulatorb.inst(Clc, ());               // clear carry flag to prepare for arithmeticb.inst(Rol(Accumulator), ());  // rotate left: index * 2b.inst(Rol(Accumulator), ());  // rotate left: index * 4b.inst(Sta(ZeroPage), 0x20);   // store index * 4 at 0x0020b.inst(Rol(Accumulator), ());  // rotate left: index * 8b.inst(Adc(ZeroPage), 0x20);   // add to 0x0020: index * 12b.inst(Tax, ());               // transfer accumulator to IndexRegisterX// Store absolute X,Y coords of each tile by reading relative coordinates from shape table// and adding the piece offset, storing the result in zero page 0x20..=0x27.for i in 0..4 { // this is a rust loop - the assembly generated inside will be generated 4 times    b.inst(Lda(AbsoluteXIndexed), Addr(SHAPE_TABLE)); // read Y offset from shape table    b.inst(Clc, ());                                  // clear carry flag to prepare for addition    b.inst(Adc(ZeroPage), ZP_PIECE_COORD_Y);          // add to Y coordinate of piece    b.inst(Sta(ZeroPage), 0x21 + (i  2));            // store the result in zero page    b.inst(Inx, ());                                  // increment IndexRegisterX to sprite index    b.inst(Inx, ());                                  // increment IndexRegisterX to X offset    b.inst(Lda(AbsoluteXIndexed), Addr(SHAPE_TABLE)); // read X offset from shape table    b.inst(Clc, ());                                  // clear carry flag to prepare for addition    b.inst(Adc(ZeroPage), ZP_PIECE_COORD_X);          // add to X coordinate of piece    b.inst(Sta(ZeroPage), 0x20 + (i  2));            // store the result in zero page    b.inst(Inx, ());                                  // increment IndexRegisterX to next tile}

Теперь о фактическом обнаружении столкновений! Неоднократно увеличивайте компонент Y каждой координаты плитки в адресах от 0x20 до 0x27, пока одна из плиток не столкнётся с зафиксированной плиткой или не выйдет за нижнюю часть поля. Изучая память с помощью mesen, я узнал, что состояние поля хранится в виде строкового массива индексов спрайтов, начинающихся с 0x0400, и что 0xEF это индекс плитки пустого пространства. Стратегия будет заключаться в использовании координаты каждой плитки для построения индекса в этом массиве и остановке, если будет найдено что-либо кроме 0xEF.

Возможная путаница в приведённом ниже коде заключается в том, что он реализует цикл в сборке, но есть также цикл for в rust, который генерирует сборку. Эти два цикла не связаны между собой. Сборка в цикле rust проходит 4 раза, и результат составляет тело цикла сборки.

const BOARD_TILES: Address = 0x0400;const EMPTY_TILE: u8 = 0xEF;const BOARD_HEIGHT: u8 = 20;b.inst(Ldx(Immediate), 0);   // Load 0 into IndexRegisterX - this will be our loop counterb.label("start-ghost-depth-loop"); // This is a label - a target for branch instructionsfor i in 0..4 { // the assembly in this rust loop will be emitted 4 times    // Increment the Y component of the coordinate    b.inst(Inc(ZeroPage), 0x21 + (i * 2));    // Break out of the loop if the tile is off the bottom of the board    b.inst(Lda(ZeroPage), 0x21 + (i * 2));    b.inst(Cmp(Immediate), BOARD_HEIGHT);    b.inst(Bpl, LabelRelativeOffset("end-ghost-depth-loop"));    // Multiply the Y component of the coordinate by 10 (the number of columns)    b.inst(Asl(Accumulator), ());    b.inst(Sta(ZeroPage), 0x28); // store Y * 2    b.inst(Asl(Accumulator), ());    b.inst(Asl(Accumulator), ()); // accumulator now contains Y * 8    b.inst(Clc, ());    b.inst(Adc(ZeroPage), 0x28); // accumulator now contains Y * 10    // Now add the X component to get the row-major index of the cell    b.inst(Adc(ZeroPage), 0x20 + (i * 2));    // Load the tile at that coordinate    b.inst(Tay, ());    b.inst(Lda(AbsoluteYIndexed), BOARD_TILES);    // Test whether the tile is empty, breaking out of the loop if it is not    b.inst(Cmp(Immediate), EMPTY_TILE);    b.inst(Bne, LabelRelativeOffset("end-ghost-depth-loop"));}// Increment counter and loopb.inst(Inx, ());b.inst(Jmp(Absolute), "start-ghost-depth-loop");b.label("end-ghost-depth-loop");

Это приводит к тому, что IndexRegisterX содержит количество повторений цикла, которое также является вертикальным расстоянием от текущей фигуры до того места, где она окажется после падения. Для удобства эта функция вернёт результат через регистр аккумулятора:

// Return depth via accumulatorb.inst(Txa, ());  // transfer IndexRegisterX to accumulatorb.inst(Rts, ());  // return

Вот полный код замещающей функции обновления буфера DMA OAM:

b.label("oam-dma-buffer-update");// Call original function firstb.inst(Jsr(Absolute), 0x8A0A);// Compute distance from current piece to drop destination, placing result in accumulatorb.inst(Jsr(Absolute), "compute-hard-drop-distance");// Check if the distance is 0, and skip rendering the ghost piece in this caseb.inst(Beq, LabelRelativeOffset("after-render-ghost-piece"));// Render the ghost piece, passing the vertical offset argument in address 0x0028.b.inst(Sta(ZeroPage), 0x28);b.inst(Jsr(Absolute), "render-ghost-piece");b.label("after-render-ghost-piece");// Returnb.inst(Rts, ());

Результат:

Добавление контроллера для Hard Drop

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

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

Моя первая попытка состояла в том, чтобы найти код, который считывает регистр состояния контроллера 0x4016, но, похоже, существует довольно много косвенных связей между чтением этого регистра и обновлением состояния игры на основе того, какие кнопки нажимаются.

Моя вторая идея заключалась в том, чтобы настроить мой эмулятор для логирования каждой выполненной инструкции. Я загрузил Тетрис и прошёлся по меню, чтобы начать новую игру, а затем сохранил файл состояния. У моего эмулятора есть возможность запускать определённое количество кадров. Я настроил его на работу в 20 кадров, загрузил файл состояния и записал каждую инструкцию, не нажимая никаких элементов управления. Затем я повторил этот процесс, но на этот раз я нажимал левую кнопку на протяжении 20 кадров. Теперь у меня было два лога потока инструкций один без нажатых элементов управления, а второй с их нажатием. Само собой разумеется, что в первую очередь эти потоки различаются, когда программа в первый раз разветвляется по состоянию левой кнопки.

Конечно же:

@@ -116912,9 +116912,175 @@ 0x89B8  Lda(ZeroPage) 0xB5 0x89BA  And(Immediate) 0x03 0x89BC  Bne(Relative) 0x15-0x89BE  Lda(ZeroPage) 0xB6-0x89C0  And(Immediate) 0x03-0x89C2  Beq(Relative) 0x45+0x89D3  Lda(Immediate) 0x00+0x89D5  Sta(ZeroPage) 0x46+0x89D7  Lda(ZeroPage) 0xB6+0x89D9  And(Immediate) 0x01+0x89DB  Beq(Relative) 0x0F...

Перекрёстная ссылка с дизассемблированным ПЗУ, эта функция начинается с:

0x89AE  Lda(ZeroPage) 0x400x89B0  Sta(ZeroPage) 0xAE0x89B2  Lda(ZeroPage) 0xB60x89B4  And(Immediate) 0x040x89B6  Bne(Relative) 0x51 (relative: 0x51, absolute: 0x8A09)0x89B8  Lda(ZeroPage) 0xB50x89BA  And(Immediate) 0x030x89BC  Bne(Relative) 0x15 (relative: 0x15, absolute: 0x89D3)0x89BE  Lda(ZeroPage) 0xB60x89C0  And(Immediate) 0x030x89C2  Beq(Relative) 0x45 (relative: 0x45, absolute: 0x8A09)...

Это ветвление на основе содержимого адресов 0x00B5 и 0x00B6. Во время наблюдения за этими адресами в mesen во время затирания элементов управления у меня создаётся впечатление, что 0xB5 хранит различия между кадрами в состоянии контроллера, а 0xB6 хранит текущее состояние контроллера. Несмотря на то что тетрис не использует её, состояние кнопки вверх отражается в этих значениях.

Я запустил эту функцию так же, как и мою замену для обновления буфера DMA OAM. Всё, что он сделал, это вызвал исходную функцию и вернул:

b.label("handle-controls");// Call the original functionb.inst(Jsr(Absolute), 0x89AE);// Returnb.inst(Rts, ());

Теперь добавим проверку, нажата ли кнопка вверх. А пока просто телепортируем текущую фигуры на фиксированную высоту при нажатии кнопки:

b.label("handle-controls");const CONTROLLER_STATE: u8 = 0xB6;const CONTROLLER_BIT_UP: u8 = 0x08;// Call the original functionb.inst(Jsr(Absolute), 0x89AE);// Skip to the end if the UP bit of the controller state is not setb.inst(Lda(ZeroPage), CONTROLLER_STATE);b.inst(And(Immediate), CONTROLLER_BIT_UP);b.inst(Beq, LabelRelativeOffset("controller-end"));// Set the current piece's Y coordinate to 7b.inst(Lda(Immediate), 7);b.inst(Sta(ZeroPage), ZP_PIECE_COORD_Y);b.label("controller-end");// Returnb.inst(Rts, ());

Вот код в действии, когда я несколько раз нажимаю вверх:

Затем замените тестовую константу 7 на фактическое положение, в котором деталь окажется после резкого падения. Используйте функцию compute-hard-drop-distance, которую мы написали для рендеринга призрачной части, а затем просто добавьте текущую позицию фигуры, чтобы получить абсолютную координату Y, в которой он окажется после падения:

b.label("handle-controls");const CONTROLLER_STATE: u8 = 0xB6;const CONTROLLER_BIT_UP: u8 = 0x08;// Call the original functionb.inst(Jsr(Absolute), 0x89AE);// Skip to the end if the UP bit of the controller state is not setb.inst(Lda(ZeroPage), CONTROLLER_STATE);b.inst(And(Immediate), CONTROLLER_BIT_UP);b.inst(Beq, LabelRelativeOffset("controller-end"));// Compute distance from current piece to drop destination, placing result in accumulatorb.inst(Jsr(Absolute), "compute-hard-drop-distance");// Add the current piece's Y coordinateb.inst(Clc, ());b.inst(Adc(ZeroPage), ZP_PIECE_COORD_Y);// Update the current piece's Y coordinate with the resultb.inst(Sta(ZeroPage), ZP_PIECE_COORD_Y);b.label("controller-end");// Returnb.inst(Rts, ());

Выглядит неплохо!

Однако имеется небольшая проблема со скоростью. Похоже, что игра ожидает окончания текущего тика, прежде чем создать следующую фигуру. После hard dropa текущий тик должен немедленно закончиться и следующая фигура должна появиться без задержки.

Глядя на память с помощью mesen, можно увидеть, что есть счётчик по адресу 0x0045, который ведёт отсчёт до некоторого числа, а затем сбрасывается на следующем тике (когда текущая фигура перемещается вниз сама по себе). Чтобы узнать больше, я заставил свой эмулятор записывать все инструкции и запускать игру в течение 13 тиков. Я выбрал 13, потому что казалось маловероятным, что они генерируются случайно.

Во время этого прогона таймер истёк бы 13 раз. Где-то в логах инструкций есть связанная инструкция, которая была выполнена ровно 13 раз. Давайте найдём!

Логи инструкций находится в файле с именем /tmp/log.txt:

cat /tmp/log.txt | sort | uniq --count | sort --numeric-sort

Мы сортируем инструкции по частоте. Просматривая те, которые были выполнены 13 раз, я заметил:

13 0x8958  Lda(Immediate) 0x0013 0x895A  Sta(ZeroPage) 0x45

Это кажется актуальным, потому что он взаимодействует с таймером по адресу 0x0045!

Обращение к дизассемблированному коду этой инструкции:

0x8980  Lda(ZeroPage) 0x45    # load the timer value0x8982  Cmp(ZeroPage) 0xAF    # compare with the value at 0x00AF0x8984  Bpl(Relative) 0xD2 (relative: D2, absolute: 8958)  # branch if it was higher0x8986  Jmp(Absolute) 0x89720x8972  Rts(Implied)0x8958  Lda(Immediate) 0x00  # load 0 into the accumulator0x895A  Sta(ZeroPage) 0x45   # store the accumulator (0) in the timer

Две последние инструкции устанавливают значение таймера в 0, и они выполняются ровно 13 раз. Единственный способ получить эти инструкции через ветвь (0x8984), что означает, что условие ветвления выполняется только 13 раз вероятно, один раз за такт. Таким образом, вероятное повествование состоит в том, что таймер увеличивается на единицу каждый кадр, а кадр, в котором он становится больше значения в 0xAF, отмечает конец текущего тика, в этот момент таймер сбрасывается, и текущая фигура перемещается вниз.

Наблюдаем за 0x00AF в mesen, и это, кажется, максимальное значение, которого достигает таймер в 0x0045. Кроме того, когда вы завершаете уровень, значение 0x00AF уменьшается, что ускоряет игру! Поэтому после hard drop просто установите значение таймера на значение 0x00AF:

b.label("handle-controls");const CONTROLLER_STATE: u8 = 0xB6;const CONTROLLER_BIT_UP: u8 = 0x08;const TIMER: u8 = 0x45;const TIMER_MAX: u8 = 0xAF;// Call the original functionb.inst(Jsr(Absolute), 0x89AE);// Skip to the end if the UP bit of the controller state is not setb.inst(Lda(ZeroPage), CONTROLLER_STATE);b.inst(And(Immediate), CONTROLLER_BIT_UP);b.inst(Beq, LabelRelativeOffset("controller-end"));// Compute distance from current piece to drop destination, placing result in accumulatorb.inst(Jsr(Absolute), "compute-hard-drop-distance");// Add the current piece's Y coordinateb.inst(Clc, ());b.inst(Adc(ZeroPage), ZP_PIECE_COORD_Y);// Update the current piece's Y coordinate with the resultb.inst(Sta(ZeroPage), ZP_PIECE_COORD_Y);// Set the timer to its maximum valueb.inst(Lda(ZeroPage), TIMER);b.inst(Sta(ZeroPage), TIMER_MAX);b.label("controller-end");// Returnb.inst(Rts, ());

Выглядит лучше, но всё равно есть большая задержка, если вы очень быстро опустите первую фигуру во время первого тика. Оказывается, первый тик занимает больше времени, чем все остальные тики. Глядя на память в mesen, я заметил, что значение 0x004E увеличивается во время первого тика. Для всех остальных тиков он установлен на 0. Установка его на 0 после появления hard dropa решает проблему с синхронизацией.

b.label("handle-controls");const CONTROLLER_STATE: u8 = 0xB6;const CONTROLLER_BIT_UP: u8 = 0x08;const TIMER: u8 = 0x45;const TIMER_MAX: u8 = 0xAF;const TIMER_FIRST_TICK: u8 = 0x4E;// Call the original functionb.inst(Jsr(Absolute), 0x89AE);// Skip to the end if the UP bit of the controller state is not setb.inst(Lda(ZeroPage), CONTROLLER_STATE);b.inst(And(Immediate), CONTROLLER_BIT_UP);b.inst(Beq, LabelRelativeOffset("controller-end"));// Compute distance from current piece to drop destination, placing result in accumulatorb.inst(Jsr(Absolute), "compute-hard-drop-distance");// Add the current piece's Y coordinateb.inst(Clc, ());b.inst(Adc(ZeroPage), ZP_PIECE_COORD_Y);// Update the current piece's Y coordinate with the resultb.inst(Sta(ZeroPage), ZP_PIECE_COORD_Y);// Set the timer to its maximum valueb.inst(Lda(ZeroPage), TIMER);b.inst(Sta(ZeroPage), TIMER_MAX);// Clear the first tick timerb.inst(Lda(Immediate), 0x00);b.inst(Sta(ZeroPage), TIMER_FIRST_TICK);b.label("controller-end");// Returnb.inst(Rts, ());

Кажется, это работает!
Исходный код инструмента исправления доступен на github. Загрузите патч IPS, который применяет изменения, описанные в этом посте, здесь. Второй патч, который добавляет hard drop, но не визуализирует конечное положение фигуры, доступен здесь.

А если хотите создать свой игровой бестселлер, который, как и детище Алексея Пажитнова войдёт в историю приходите к нам на курс Разработчик игр на Unity, на котором мы рассказываем про все тонкости разработки игр.

Узнайте, как прокачаться в других специальностях или освоить их с нуля:

Другие профессии и курсы
Подробнее..

Recovery mode Как поднять боевой дух команды на удаленке?

16.06.2021 10:13:29 | Автор: admin

Если коротко, то дать сотрудникам возможность отвлечься и поиграть. Мы как команда это то, что мы делаем. Поэтому нужно делать что-то интересное вместе. Удаленка не приговор и не помеха.

Эта статья от том, как я организовал Хакатон для IT компании в Малайзии в самые первые месяцы пандемии. Игра была целиком посвещена Linux администрированию, траблшутингу и хакингу. При этом она позволяла поучаствовать всем сотрудникам, от junior инженера технической поддержки до senior архитектора.

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

Дано:

  • Компания системный интегратор в Куала Лумпуре;

  • Интернациональная команда IT-специалистов;

  • 99.99% персонала внезапно ушло на удаленку.

Задачи:

  • Позволить сотрудникам отвлечься от работы и снизить уровень стресса;

  • Развить навыки, используя геймификацию;

  • Развить внутренний бренд для будущих IT игр.

В чем заключалась сложность?

  • Неравномерный уровень подготовки и квалификации.

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

  • Сменный график работы сотрудников.

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

  • Локальный менталитет.

К особенностям местного населения необходимо привыкнуть. Работают в компании в основном малайцы, индийцы и китайцы. Преимущественно они не задают вопросов, опасаются участвовать в чем-то новом и непонятном. Раз в неделю 80% сотрудников покидает офис на 2,5 часа по религиозным соображениям. На корпоратив добрая половина придет только если пообещать им лотерею и призы (очень популярная практика у местных компаний). Заинтересовать таких людей участием в игре было нелегко.

[Спойлер]

Мне удалось =)

А где Гарри? Шалит с новым хакатоном.А где Гарри? Шалит с новым хакатоном.
  • Неразбериха из-за пандемии.

Я называю это удаленка через force. С началом пандемии нам пришлось работать из дома не по своей воле. Не все к этому были готовы. Отдельные сотрудники и даже целые департаменты долго приводили свои рабочие процессы в порядок. Многие не представляли, как можно втиснуть в график еще больше работы.

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

  • Демотивированный персонал.

Мы затеяли игру, чтобы мотивировать инженеров на новые свершения, но как это сделать если они уже демотивированны резкой сменой обстановки, отсутствием живого общения и неожиданными препятствиями в работе? Был шанс, что сотрудники не станут участвовать потому, что воспримут наши Linux задачки как лишнюю работу, на которую просто нет времени. Если я и так каждый день ковыряюсь в серверах, то это не может быть весело, правильно?

[Спойлер]

Еще как может! Риск не собрать аудиторию не оправдался.

Типичный сотрудник в самом начале пандемии.Типичный сотрудник в самом начале пандемии.

План подготовки и проведения хакатона

В моем случае выполнение всех этих действий позволило мне успешно провести мероприятие.

  • Разработка концепта игры.

Я решил, что темой хакатона будет Linux администрирование. Соответственно, задания должны были строиться вокруг базовых административных задач: проверялось умение использовать command line, браузерные тулзы, знание SQL, DNS, самые основы шифрования.

Хакатон должен был длиться несколько дней. Поэтому я придумал систему уровней и кодов. Каждый уровень представлял собой одну виртуальную машину, в которую участникам нужно было зайти по SHH и найти спрятанный код. На каждой из машин был запущен Apache c простым сайтом, где размещались подсказки. Ну или нет =)

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

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

На этом же этапе была продумана система поощрений.

  1. Top-3 самые ценные индивидуальные призы;

  2. Top-10 дополнительный специальный пак призов;

  3. Первые 50 участников гарантированные призы из дешевого ценового диапазона.

Участники, занявшие первые 3 места должны были забрать призы из всех трех категорий.

  • Технический дизайн.

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

В качестве хостинг площадки был выбран AWS. Игровые серверы и хост с веб формой были подняты на t2.medium EC2 инстансах. К каждому инстансу был привязан 1 бесплатный домен. В качестве базы данных использовалась Amazon DynamoDB. Форма была написана на Python и фреймворке Flask. Бэкенд формы был выполнен на основе FaaS (Function as a Service) подхода с помощью связки API Gateway + Lambda + DynamoDB.

Выбор такой технологической базы был обусловлен субъективными пожеланиеми организаторов, наличием необходимой корпоративной облачной подписки, и знаменитым правилом start where you are. Последний принцип подсказал, что можно взять подходящую web форму, используемую в продакшене, и переписать ее под нужды игры. Пользуясь случаем, Алекс и Саша, огромное спасибо за помощь с AWS деплойментом и девелопментом формы. Без вас мне бы было значительно сложнее.

  • Презентация концепта руководству и получение бюджета.

К моменту запуска игры руководство догадывалось, что ежегодный корпоратив и некоторые другие привычные активности в этом году не произойдут. Поэтому бюджет на необычный способ тимбилдинга и незнакомый формат были одобрены довольно быстро. Менеджмент из трех предложенных вариантов призового бюджета выбрал самый дорогой.

[Спойлер]
Как ощущаешь себя когда получаешь максимальный бюжет на проект.Как ощущаешь себя когда получаешь максимальный бюжет на проект.
  • Разработка дизайна и внешнего вида.

Сначала я определился с названием бренда для внутренних игр и выбрал цвета на свой вкус. На мое счастье в компании был дизайнер, который помог подготовить несколько вариантов логотипа. Я написал и согласовал ТЗ. Итоговый логотип в белом, черном и цветном вариантах был использован для рассылок и печати на призах. Абсолютно все материалы были выдержаны в одном стиле, распространялись под одним брендом и сопровождались одним и тем же логотипом. Недавно, когда я рассылал тизеры о новом хакатоне мне уже не задавали вопросов о том, что происходит. Инженеры точно знали, чего ожидать.

  • Выбор и заказ призов.

Про бизнес по-малазийски я мог бы написать отдельный пост. В рамках этой статьи позвольте мне упомянуть только, что на получение призов пришлось потратить 2 месяца и кучу нервов. Рассылка призов была выполнена много позднее окончания игры, а некоторым призам даже пришлось лететь в Россию и на Филиппины вслед за некоторыми победителями.

  • Рассылка тизеров до начала игры.

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

  • Сюжетное обрамление.

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

  • Релиз.

Первое письмо было отправлено на весь офис и содержало начало истории, ссылки и правила игры. Тут же посыпались вопросы: коллеги просили подсказки, пытались уточнить правильно ли они понимают задание, а также старались выудить полезную информацию любой ценой. Не то чтобы получалось. Я был кремень.

Один из финальных тизеровОдин из финальных тизеров
  • Элемент обучения.

Одной из задач было научить чему-то новому. Поэтому, начиная со второго дня игры, я отправлял подробнейшие инструкции о том, как пройти один из уровней. На второй день я рассказал про первый уровень, на восьмой про финальный седьмой.

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

  • Организовать постоянный follow up.

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

  • Выдать призы.

Из-за пандемии и Малазийских локдаунов мне удалось отправить призы своевременно только ТОП-3 игрокам. Остальным своих посылок пришлось ждать дольше. Несмотря на небольшую стоимость гарантированного призового пака сотрудники были воодушевлены получением заветных пакетов.

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

  • Собрать обратную связь.

Действовать следовало итеративно и с фидбеком. Поэтому всем участникам был разослан опросник. 25% заполнили его. Об ответах в описании результатов.

Весь подготовительный процесс занял 2 месяца и 68 человеко-часов главного организатора. Но результат стоил того.

Результаты:

  • Боевой дух команды вырос.

Игра подразумевала индивидуальное участие и решение задач. Однако, мне доподлинно известно, что люди объединялись в команды, устраивали созвоны и брейнштормы. Активным участникам точно было не скучно. Люди, которым в силу неопытности удалось прорваться только через несколько уровней, определенно научились чему-то новому. Цель отвлечь участников и снизить градус напряжения была достигнута.

  • Позитивный фидбек от участников.

Одним из факторов, которые говорят о безоговорочном успехе мероприятия, является факт участия тяжелых на подъем сотрудников. Хакатон имел успех и среди линейных менеджеров, которые по долгу службы не работают с Linux напрямую, и среди инженеров-ветеранов.

Три наиболее частые причины почему участники согласились играть:

  1. Возможность проверить свои скиллы;

  2. Любовь к играм и соревнованиям;

  3. Любопытство.

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

  • Карт-бланш и бюджет на проведение новых хакатонов.

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

Личное:

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

А еще я сформулировал и взял на вооружение...

Ключевые принципы организации хакатонов.

  • Знайте свою целевую аудиторию.

Хакатоны - для всех!Хакатоны - для всех!

Хороший хакатон сделан специально для ваших сотрудников и в соответствии с нуждами компании. И да, хакатоны могут быть не только для программистов. Они могут быть вообще для всех.

  • Агитируйте правильно.

[Спойлер]
Землю - крестьянам, игры - айтишникам!Землю - крестьянам, игры - айтишникам!

Коммуникация о предстоящей игре должна выделяться в общем потоке спама полезной и нужно почты по работе. Коммуникация должна создать интерес и немного его подогреть чуть позже. Здесь важно найти баланс. Если перегреете, то коммуникации по предстоящей игре станут восприниматься как настоящий спам и ваши усилия по брендированию пропадут. Если создадите интерес, а сама игра будет сильно позже тоже плохо, про вас успеют забыть.

  • Управляйте сложностью.

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

[Спойлер]
У меня есть пароль, но нет логина. Зарепортить игровой баг или поискать еще?У меня есть пароль, но нет логина. Зарепортить игровой баг или поискать еще?
  • Позвольте играть не так как задумано.

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

[Спойлер]
А Барсик один в игре ковыряется, посмотри на него!А Барсик один в игре ковыряется, посмотри на него!
  • Призы хорошо, но не главное.

[Спойлер]
А как же сектор приз?А как же сектор приз?

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

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

Спасибо, что прочли. Увидимся в будущих публикациях!

Подробнее..

Перевод Параллели между Factorio и проектированием ПО

18.08.2020 08:21:44 | Автор: admin

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

Я играл в две такие игры. Первая это Shenzhen.io. Она похожа на то, чем бы мог заниматься инженер, проектирующий встроенные устройства. Инженер решает головоломки путём писания ассемблерного кода для устройств с низким энергопотреблением. В этой игре здорово то, что её разработчики убрали из неё раздражающие аспекты написания кода и его ввода в эксплуатацию.

  • Требования понятны и на удивление точно соответствуют задаче.
  • Цикл редактирования, отладки и компиляции невероятно быстр. Благодаря этому, а также отличной системе тестирования можно за минуту проверить несколько потенциальных решений.
  • Платформа, от которой зависит код игрока (сама игра) не имеет багов. Не нужно чинить зависимости перед тем, как приступать к написанию собственного кода.

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

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


И тем не менее, эта игра больше любой другой напоминает мне о проектировании программного обеспечения. Позвольте объяснить, почему.

  • Технический долг. Создать ли временный грязный хак или реализовать всё правильно? Ответ всегда один это зависит от условий. Хакинг приближает нас к решению текущих задач, но позже нам придётся вернуть долг. Новички (типа меня!) начинают с соединения различных частей базы конвейерами, пока база не начинает напоминать спагетти, похожее на плохо поддерживаемые кодовые базы. Постепенно мы осваиваем способы укрощения этой сложности, поэтому становится проще обдумывать нашу игровую базу/кодовую базу.
  • Принцип Не повторяйся (Dont Repeat Yourself, DRY). Один из таких способов снижение количества дублируемых элементов. Если нам нужен компонент, который требуется в нескольких местах, стоит ли создать его один раз и использовать повсюду, или копипастить по необходимости? Ответ всегда один это зависит от условий. Проектируя ПО, вы иногда используете библиотеку, а иногда копипастите. Это зависит от сложности компонента пару функций можно скопипастить, а что-то сложное, скорее всего, не стоит. Так и в Factorio определённый компонент (электронные схемы) производился в 4-5 местах. Я заменил их одним централизованным производственным массивом для упрощения структуры фабрики.
  • Масштабирование. В этой игре часто бывает так, что мы создаём производственный массив, а позже обнаруживаем, что необходимо повысить его производительность в 3-5 раз. Когда такое происходит первые несколько раз, для исправленя ситуации требуется полная переделка с нуля. Когда мы становимся умнее, то начинаем проектировать массивы с учётом пространства для масштабирования. Так же происходит и с ПО наши системы необходимо масштабировать под гораздо большее количество пользователей, иногда без каких-либо предупреждений. Мы проектируем наши системы, помня об этом.
  • Пересборка. При пересборке компонента в однопользовательской игре или личном программном проекте мы обычно не беспокоимся о кратковременной приостановке работы этого компонента или целой системы. Однако когда я играл в мультиплеер с друзьями, то пытался сделать так, чтобы компоненты, над которыми я работаю, ничего не ломали. Я создал новую нефтеперерабатывающую систему, перенёс новых потребителей на неё, и уже потом вывел из строя старую. Нулевое время простоя!
  • Отладка для поиска первопричины проблем. Наша фабрика далека от идеала, поэтому при добавлении новых элементов постоянно что-то ломается. Поиск первопричин таких проблем сложная задача, особенно когда их устранение приводит к другим проблемам. Вчерашний пример нам не хватало электричества, поэтому мы добавили больше котлов, но теперь нужно было исправить водопровод. Исчезла проблема с водой, но появились перебои с углём. Всё это отражает реальную жизнь
  • Командная работа. Большинство задач при наличии времени можно решить в одиночку. Но быстрее и интереснее работать с командой, которая тебе нравится. Можно двигаться скорее, разделяя ответственность по членам команды. У нас, среди прочих должностей, был один ответственный за нефть (я), ответственный за поезда, министр обороны. Другие не занимались тонкостями нефтепереработки, им важен только интерфейс, они используют выходные ресурсы и сообщают мне, если что-то ломается. То же самое происходит с крупными программными проектами все не могут знать тонкостей работы всей системы. Поэтому каждый изучает API всех компонентов, и только немногие отвечают за реализацию.
  • Исследование. БОльшую часть времени мы тратили на использование уже имеющегося знания, чтобы оставаться в точке локального максимума выработки. Однако один умный игрок потратил какое-то время на изучение новых техник. В нашей игре угольные электростанции нам не подходили, а от ядерной энергетики мы отказались из-за нехватки урановой руды. Я снова обратился к ней, когда нам отчаянно не хватало энергии и мы производили слишком сильное загрязнение. Оказалось, что при правильной реализации даже небольшого количества руды хватает на питание базы в течение 100 часов. То же самое и с ПО уже готовый стек может работать хорошо, но будет мудро посмотреть, какие ещё есть возможности, и учиться у других. В этом могут помочь и новые члены команды для них всё новое, поэтому они тратят на обучение больше времени, чем вы. Они могут обнаружить нечто, о чём вы не знаете, и использовать это знание для нахождения более высокого максимума. Свежий взгляд на ситуацию это всегда хорошо.
  • Автоматизация. Большинство задач можно выполнять вручную, просто это требует времени. Но если вы делаете что-то много раз, то это нужно автоматизировать. Игра мягко подталкивает вас к этой мысли, требуя автоматизации некоторых аспектов. Позже, когда вы разблокируете строительных роботов, всё становится лучше. Вы можете указать им схему спроектированного вами производственного массива, дать им материалы, и они построят всё за вас. Это напоминает мне AWS CloudFormation и похожие инструменты хоть мы и можем настраивать серверы вручную, быстрее и правильнее будет указать конечное состояние и позволить всё сделать инструменту за вас. Однако если вы разрабатываете ПО, то знаете, что автоматизация не только средство достижения цели, но и сама цель. Мы реализуем её, потому что это делает нас счастливее, даже если её становится слишком много и мы забываем, чем занимались изначально.
  • Тушим пожар. Иногда бывает слишком сложно реализовывать новые возможности, потому что мы отвлекаемся на устранение сигналов тревоги такое в командах разработки ПО происходит очень часто. Обычно в таком случае одному члену команды поручают решать проблемы, а другие продолжают работать над расширением возможностей. В игре происходит то же самое.

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

Мне кажется, что игра в Factorio не сделает вас более умелым проектировщиком ПО. Но если вы проектируете ПО, то игра может показаться вам увлекательной. И наоборот если вы хорошо справляетесь с игрой, то вам определённо стоит попробовать себя в проектировании ПО.

Купить Factorio можно на официальном сайте или в Steam. Если вы хотите попробовать игру перед покупкой, то у неё есть бесплатное демо. (Только один совет не ждите распродажи. У этой игры никогда не было распродаж, а возможно и не будет.)



Благодарю Минеша Патела для вычитывание черновика и предложения по улучшению статьи.

Комментарии можно прочитать на Hacker News и на reddit.
Подробнее..

Перевод 13 игр, в которые можно поиграть, взломать и убить ими эти выходные

06.11.2020 20:04:29 | Автор: admin
В конце ноября у нас стартует новый поток курса Разработчик игр на Unity и C#, и специально к нему мы делимся подборкой игр на тему Хеллоуина. Все они создавались на соревнованиях вроде Ludum Dare, JS13K и Game Off. Игры написаны на разных языках и движках, причём некоторые из них созданы всего за 48 часов. И у всех этих игр есть общая черта: исходный код этих игр открыт, так что давайте уже рубить и кромсать его! Пост не претендует на высокий технический уровень, это просто подборка забавных проектов, которые, возможно, вдохновят вас на создание своих игр.

ВНИМАНИЕ: в этом посте есть зомби, оборотни, существа из других измерений, мумии и многое другое! Действуйте на свой страх и риск.





Evil Glitch (JS13K 2016)


Играйте в вашем браузере. Исходники (JavaScript)



У Evil Glitch авторства @agar3s есть всё: линии развёртки, эффекты CRT и удовлетворяющий геймплей. Когда в вашем измерении появятся странные сбои, остановите их ураганом пуль.

Весёлый хак: закомментируйте эту строку и вы станете невидимым.

if(killer)die(killer);

Chamber (Ludum Dare 47)


Играйте на Windows или в вебе. Исходники (Heaps, Haxe)



Chamber от @saint11 и @AmoraBettany заняла первое место на LD47 на этой неделе. С помощью дружелюбного призрака вы должны исследовать таинственные комнаты и спланировать побег.

Sealed Bite (Game Off 2019)


Играйте в Windows, macOS, Linux или в Интернете. Исходники (Godot, GDScript)



Sealed Bite это пиксельный платформер от @securas, вы играете против часов и ищете осколки кристалла, который мешает вам превратиться в оборотня. Sealed Bite победитель прошлогоднего Game Off.

Весёлый хак. Игра сложная? Прыгайте выше или станьте неуязвимым вот так:

JUMP_VEL = -250.0 

и так:

func can_be_hit( area = null ) -> bool:    if fsm.state_cur == fsm.states.hit: return false    if fsm.state_cur == fsm.states.dead: return false    if is_invulnerable: return false    #print( cur_target, " ", area, " ", cur_target.get_ref().name, " ", area.get_parent(), " ", area.owner.name )    if cur_target != null and \        area != null and \        cur_target.get_ref() != null and \        cur_target.get_ref() == area.owner:            return false    return false

Retrohaunt (JS13K 2019)


Играйте в браузере Исходники (JavaScript)



Не у каждого есть время, терпение или умения, чтобы написать головоломку всего на 13 килобайт JS.Моя мама говаривала: If youve got it, haunt it докучай своему таланту [Отсылка на фразу If you got it, flaunt it не зарывай талант в землю]. Именно это и делал @DennisBengs с Retrohaunt.

Luna (Halloween Competition 2019)


Загрузите на C64 Исходники (Assembly)



Если вы выросли с Commodore 64 или увлекаетесь ретро-играми, Luna от @smnjameson вам понравится. Проведите ведьму через бесконечные пещеры, быстрых, проблемных врагов и прочий геймплей.

Конечно, понадобится эмулятор Commodore 64. К счастью, есть множество свободных и открытых реализаций на выбор.

Unnecessary Evil (Ludum Dare 43)


Играйте на Windows или в Интернете. Исходники (Unity, C#)

Screenshot of Unnecessary Evil

Unnecessary Evil от @Xenation, @Suliac, @Voxelse, и @evaabollivier вам предстоит по очереди переключаться между пятью бесстрашными бойцами, чтобы найти выход. Но будьте осторожны. Бойцами придётся жертвовать.

Heaven Ascent (JS13K 2020)


Играйте в браузере. Исходники (JavaScript)



В Heaven Ascent вы сражаетесь с демонами, собираете звёзды и сражаетесь с боссами-ангелами, которые мешают вам добраться до вершины.

Небольшой хак: @Dhmstark подумал наперед, добавив возможность быстро накрутить себе жизни. Чтобы сделать это, просто измените в файле data.js строки:

startingLife: 5,lifeIncrement: 5,

Blood and Volts (Ludum Dare 46)


Загрузите на Windows. Исходники (движок GameMaker)



Blood and Volts прекрасное название, авторы игры @dev-dwarf, @Nolnad и @LewmothMusic. Подавайте вольты на башни: они стреляют, пока вы вторгаетесь на маленькую планету, убивая туземцев.

Baby Monster Delivery (Ludum Dare 46)


Играйте на Windows и в сети. Исходники (Unity, C #)



Аистов здесь нет. Детей в Baby Monster Delivery приносят адские сковородки. Остерегайтесь ловушек и пола, пол это вообще лава.

Tomb of the Mummy RL (Ludum Dare 47)


Играйте в браузере, исходники (JavaScript)



Tomb of the Mummy rogue-подобная игра от @eldarbogdanov для Ludum Dare 47. Охотники за сокровищами разбудили вас ото сна и исследуют гробницу. Мумия должна делать то, что должна делать мумия

Death String (Ludum Dare 47)


Играйте на Windows, macOS, Linux и в вебе, исходники (Godot, GDScript)



Демоны вторглись в ваш розовый пиксельный мирок. Вы управляете роботом, который изгоняет демонов Шнурком Смерти.

Shield Bearer (GMTK Jam 2020)


Играйте на Windows, macOS, Linux ив вебе, исходники (Godot, GDScript).



Shield Bearer, автор @Geminimax. Вы играете за родителя, который защищает сына-авантюриста, когда он исследует опасные подземелья.

Крутой хак: может, кто-нибудь сможет повысить уровень этого дитяти в поисках своего пути?

Soul Harvester (Untitled Game Jam 8)


Играйте на Windows, macOS, Linux и в вебе. Исходники (Unity, C#)



В игре @JordyAaldering Soul Harvester вы играете за юную Смерть с косой, прыгая по случайно сгенерированным уровням и отправляя заблудшие души туда, откуда они пришли. Надеюсь, вы найдёте эти игры интересными. Желаю вам безопасного, счастливого и здорового Хеллоуина, если для вас это важно. До следующего раза! Если выживем


Хотите еще? Вот 13 веселых, дьявольских игр с прошлого года, которые можно форкнуть и развлечься.

img

Уважаемые читатели, а вы писали игры? Не стесняйтесь делиться ими в комментариях.

Если же хотите научиться создавать большие игры, то приглашаем на наш курс Разработчик игр на Unity и C#, а специальный промокод HABR добавит 10 % к скидке на баннере.

image



Рекомендуемые статьи


Подробнее..

Game-based learning VS геймификация 5 основных отличий

31.08.2020 10:17:14 | Автор: admin
Игровые механики давно используются в неигровых процессах: продажах, маркетинге, управлении персоналом и обучении. Геймификация зарекомендовала себя как действенный способ вовлечения в образовательный процесс и стала одним из главных трендов.

Однако все более заметным становится game-based learning тип игрового процесса, в результате которого пользователь получает знания или навыки. Исследователи говорят о нем как о самом быстрорастущем тренде в секторе образования по всему миру, в частности в школах, а общий объем рынка к 2025 году оценивают в $28,8 млрд.

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

Магическая математика







Математическая игра Учи.ру для школьников. Основная механика: чтобы колдовать в схватке с противником, нужно решать примеры. Дополняется многочисленными фичами в виде кастомизации и прокачки персонажей.

Minecraft: Education Edition





Обучающая версия Minecraft по химии. С помощью опытов игроки изучают, из каких веществ и химических соединений сделаны разные инструменты и как элементы взаимодействуют друг с другом.

Adventure Academy







Мультиплеерная локация в виде школы, где можно создавать клубы в домиках на деревьях и проходить обучающие мини-игры в автоматах. Заработанные поинты позволяют кастомизировать персонажа.

12 is a dosen





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

Еще несколько примеров:

Oregon Trail





Один из первых представителей game-based learning. Игра для средней школы посвящена важному событию из истории США освоению Дикого Запада. Пользователь ведет группу переселенцев в Орегон, распоряжается припасами, охотится на диких животных и принимает решения в трудных ситуациях.

VR-тренажеры и симуляторы





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

Empire of Code







В стратегии, обучающей программированию, игрок присоединяется к команде Python или JavaScript. Для нападения на противника используются стандартные алгоритмы домашнего лагеря. Совершенствование алгоритмов и создание бота помогут производить больше ресурсов и эффективнее атаковать соперников.

Screeps





ММО по программированию на JavaScript: игроки программируют логику юнитов для захвата ресурсов и обороны от соседей.

Mystic Math





Мистическая новелла Учи.ру об исчезновении электричества в городе, которое главный герой-старшеклассник расследует, решая математические головоломки. От выбора реплик зависят отношения с другими персонажами.

SimRefinery





Cимулятор нефтеперерабатывающего завода от создателей SimCity, разработанный в 1993 году по заказу энергетической компании Chevron. Сотрудники в игровой форме могли отрабатывать аварийные ситуации, изучать производственные и технологические процессы.

Space School







Game-based learning встречается даже на приставках NES (Fomicom), работающих только со специальным адаптером. В образовательной игре с научно-фантастическим сюжетом для учеников 46 классов человечество отправилось в открытый космос и вошло в контакт с инопланетянами. Оказалось, что вселенная находится под гнетом темного союза, а победить его можно, прокачав интеллект у детей. История помогает привлечь внимание к обучающей части в игре даже можно поговорить с одноклассниками-пришельцами и учителем.


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

Роль, которую играет пользователь


  • GBL: есть роль
  • Геймификация: нет роли

Роль в рамках игры или проектов на игровой основе это персонаж из особого мира со своей историей и миссией, на чье место становится пользователь. Иногда персонажа нет, но роль остается, как, например, в игре Civilization, где игрок управляет государством.

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

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

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

В любой игре на первом плане есть роль и миссия. Играешь в Super Mario ты сантехник и спасаешь принцессу, в Uncharted ты искатель сокровищ и пытаешься опередить соперников.

Сама по себе роль может быть неинтересной пользователю. Она даже может не нравиться, при этом игра будет захватывать. Роль не должна нравиться сама по себе, она должна биться с целью игры и сеттингом, быть органичной. Не многие хотели бы примерить роль террориста, при этом на Counter-Strike выросло уже несколько поколений.

Цель, к которой стремится пользователь


  • GBL: развлечься
  • Геймификация: научиться

Цель у игрока в образовательных game-based-проектах выиграть: завершить уровень, убить босса, дойти до конца. Достичь ее можно, придерживаясь внутриигровых правил, косвенно связанных с обучением.

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

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

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

Цель ученика геймифицированного курса другая научиться чему-то конкретному, например: программированию в классическом подходе, чтобы обрести профессию и стабильную зарплату, или математике, чтобы сдать экзамен. То есть пользователь такого проекта хочет получить новые знания, и PBL (points, badges, leaderboards), основа геймификации, помогает их освоить.

Мотивация пользователя и ее связь с возрастом


  • GBL: дети хотят больше играть и меньше учиться
  • Геймификация: взрослые тоже хотят меньше учиться, но осознают, что это необходимо

Мотивация детей отличается от мотивации взрослых. Например, в 5 классе учиться совсем не хочется: до экзаменов, поступления в вуз, продвижения по карьере еще далеко. Радость от познания нового исчерпана, в школе начинаются темы, которые непонятно как применить в жизни. Игры, сериалы и общение со сверстниками на этом этапе основные конкуренты образования.

Этот мотив эксплуатируют образовательные game-based-проекты: в первую очередь, захватывающая история и красочный контент приглашают ребенка к игре.

У взрослых все по-другому. Школьники с 9 класса, студенты, специалисты обычно знают, какие именно экзамены будут сдавать, что хотят получить с помощью новых знаний. Развлекаться они тоже не прочь, но хотят уже не смешивать обучение с развлечением, а как можно быстрее достичь конкретного результата. У взрослых другая система развлечений: в отличие от детей, которые на 100% зависят от родителей, они сами поставщики своего досуга.

Геймификация это защита от прокрастинации. Игровые механики в образовательных курсах остаются на втором плане. Они помогают решить проблему монотонности, получить порцию дофамина на длинной дистанции. Человек получает удовлетворение от результата, например, успешно сданного экзамена. Если он не скоро, а объем необходимой для усвоения информации слишком велик, на помощь приходят очки, ачивки и визуализация прогресса.

Геймификация работает только тогда, когда студенту уже интересен или важен предмет. Game-based learning может сделать изучение предмета интересным, даже если он изначально не вызывает теплых чувств. Например, в Minecraft Education дети, которые не любят уроки химии, ищут нужные элементы, чтобы сделать новое вещество, а вовсе не для того, чтобы выучить химию.

Вознаграждение в системе проекта


  • GBL: вознаграждение напрямую влияет на прохождение
  • Геймификация: вознаграждение влияет на мотивацию пользователя

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

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

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

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

В GBL ассортимент гораздо шире. За заработанные очки можно прокачать персонажа, улучшить его внешний вид, открыть новую локацию. Обычно хочется сделать сразу все, но приходится выбирать, что важнее именно сейчас.
Также один из основных мотивов GBL любопытство, универсальный источник дофамина. Что будет дальше? главный вопрос и двигатель игрового процесса.

Разный подход к контенту


  • GBL: основной игровой + дополнительный обучающий
  • Геймификация: основной обучающий + дополнительный игровой

В game-based learning первична игра. При этом игровой механики может не быть только роль и сюжет (как в текстовом квесте). В том же Go Practice, который лично я считаю GBL, механика не игровая, а основанная на ролевой модели и решении проблем продуктовой аналитики.

Как сделать сюжет и механику интересными всегда та еще задача. Это сложно, но открывает горизонт для творчества.

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

В game-based learning за счет прогресса развиваются сюжет и персонаж, а в геймификации прогресс завязан, в основном, на поинтах, ачивках и лидерборде.

***

Говоря коротко, если геймификация это упаковка для образовательного продукта, то game-based learning это и есть продукт, игра, в которую встроено обучение.

В последнее время game-based learning-проектов становится больше, появляются новые решения и идеи. Геймификация своего рода стандарт, который показал эффективность. Это как фича, которую многие хотят внедрить и которая быстро повышает метрики. Сегодня даже внутри банковских приложений есть геймификация. Оба подхода к созданию образовательных проектов могут быть полезны и результативны.
Подробнее..

Категории

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

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru