Этот пост был написан в ответ на предложение Бренда Ромеро и Яна Шрайбера о том, чтобы разработчики поделились своими любимым методами работы в Excel.
Я выполнил достаточно много проектов по экономике игр, используя Excel. На сегодняшний день при конфигурации и настройке экономики игр чаще всего мне нужно создать определенный столбец данных, чтобы каждое значение ячейки автоматически рассчитывалось на основе формулы с одной или несколькими переменными (например, расчет стоимости каждого оружия на основе того, какой ущерб оно наносит и какое пространство занимает в инвентаре игрока).
Как правило, переменные, которые есть в формулах – это различные параметры одного объекта, каждый из которых занимает свою строку в таблице, а значения для других свойств этого объекта расположены в других колонках определенной строки.
А сейчас я расскажу, какие же методы работы с Excel я использую для того, чтобы организовать экономику игры, а также обеспечить простое внесение изменений и обновлений в таблицу.
Колонки с цветовыми маркерами
В своих электронных таблицах, в основном, я использую три категории колонок. Верхнюю строку каждой колонки я помечаю цветами, с помощью которых мне становится понятно, нужно ли значения в этом столбце редактировать напрямую, либо эти значения рассчитываются по формуле. Я использую следующие цветовые маркеры:
1. Зеленый – значения в этих столбцах редактируются вручную. Кроме того, такие значения требуют более частых изменений.
2. Желтый – в этих колонках значения рассчитываются на основе вычислений значений определенной области (обычно значений из колонки слева), и изменение этих значений затрагивает определенный диапазон ячеек. Формулы в этих колонках требуют корректировок, однако изменения в них вносятся реже, чем в ячейки «зеленых» колонок.
3. Белый – значения в этих колонках рассчитываются по формулам, которые не требуют каких-то серьезных изменений, так как результаты вычислений напрямую зависят от значений «желтых» колонок, связанных контрольных переменных (например, диапазон «минимум-максимум») или факторов значимости (можно найти в общей таблице переменных). Таким образом, формулы в этих колонках требуют изменений в самых крайних случаях.
Диапазоны нормированных значений
Для столбцов, где содержатся данные, которые могут подвергаться изменениям, а также влиять на значения в других столбцах, я добавляю новые записи в свою общую таблицу переменных, чтобы знать минимальное и максимальное значение в этом столбце. Затем я добавляю новый столбец для хранения нормированных значений для каждой соответствующей ячейки в исходном столбце.
Например, скажем, столбец D – зеленый в таблице Оружие, и в нем содержится информация о том, какую степень повреждения наносит каждое оружие. После заполнения этих значений вручную я бы добавил новую переменную в свою таблицу переменных под названием «WeaponDamageMax» и установил бы ее значение как «=МАКС (Оружие [D:D])», а также еще одну переменную «WeaponDamageMin», которая рассчитывается по формуле «= МИН (Оружие [D:D]).
Затем бы я создал новый столбец в таблице Оружие, столбец Е, для хранения нормированных значений повреждений с формулой «= (D1 — WeaponDamageMin) / (WeaponDamageMax — WeaponDamageMin)».
Формулы распределения
Как я уже говорил, я использую желтый цвет для маркировки колонок, в которых формулы используют нормированные исходные данные, а также выполняют некоторые математические операции для того, чтобы менять распределение значений в рамках нормированного диапазона. Это делается для того, чтобы получить больший контроль над распределением значений, а также является способом разрушения кластеров значений, которые иногда появляются.
Например, если разработчик добавляет новое, мощнейшее оружие, которое наносит ущерб в 5 000 000, а остальные значения ущерба оружия в колонке D находятся в диапазоне 1-200, одно такое большое значение исказит другие значения с более низкими показателями в диапазоне 0-1, когда они будут распределяться с помощью WeaponDamageMax, для того, чтобы получить нормированные значения ущерба в колонке Е. В некоторых случаях это желательно, но бывает, что вы хотите разбить эти кластеры данных и распространить их более равномерно по всему диапазону.
Вот где пригодится формула распределения. Нормированные значения можно легко преобразовать для получения желаемого значения распространения, применив кривую распределения к существующим данным. В этом случае мы создадим новый «желтый» столбец, колонку F, для хранения измененных значений из колонки D.
Хотя этот метод очень мощный и гибкий, все-таки визуализировать и генерировать кривые гораздо легче с помощью сторонних инструментов. Эти задачи могут выполняться и в Excel, но лично я предпочитаю использовать следующие инструменты для визуализации и изменений моих формул распределения:
Визуализация – графический калькулятор:
1. Увеличьте оси до диапазона 0-1
2. Скопируйте формулу из столбца, где настраиваются кривые, в поле «у1=»
3. Замените букву колонки с нормированными значениями на «x»
4. Нажмите кнопку «График» для того, чтобы увидеть кривую перехода
Изменения – генератор функции плавности
1. Изменяйте контрольные точки кривой до тех пор, пока она не станет выглядеть так, как вам нужно
2. Из поля «function» скопируйте часть после «b+c*» в последней строке функции (часть в скобках)
3. Вставьте скопированную формулу в столбец, где настраивается кривая
4. Замените название «t» на букву столбца с нормированными значениями (nvcID), название «ts» на «nvcID^2», а «tc» — на «nvcID^3».
В случае с нормированными значениями ущерба от оружия в колонке Е мы можем попытаться растянуть кластер значений в нижнюю часть нашего диапазона, используя исходную формулу столбца F в виде «= (-6,885 * (Е1 ^ 3) * (Е1 ^ 2) + 19,885 * (Е1 ^ 2) * (Е1 ^ 2) + -18,395 * (Е1 ^ 3) + 3,825 * (E1 ^ 2) + 2,57 * E1),».
Эта формула была изначально получена с помощью генератора функции плавности, о котором я говорил выше, и может быть изменена при необходимости регулировки распределения. Опять же, мы применим эту формулу к остальным строкам в колонке F, используя типичный метод перетаскивания ячейки с формулой вниз по остальным ячейкам в колонке, чтобы изменять Е1 для каждой строки.
Вне зависимости от того, какую формулу распределения вы используете, убедитесь, что полученные значения остаются в пределах 0-1.
Просто… возьми, что тебе нужно и оставь немного денег…
Контрольные переменные диапазона
Для значений, которые будут автоматически рассчитываться по формуле (в данном примере – это цена каждого оружия), я считаю, что будет полезно иметь возможность контролировать минимальные и максимальные значения этого параметра, чтобы удерживать их в пределах установленного диапазона. Для этого я добавляю регулируемые минимальные/максимальные переменные, которые соответствуют каждой «белой» колонке (где расчеты производятся по формуле), которые заполняются автоматически рассчитанными значениями.
В случае с ценой оружия я бы добавил две новые переменные в общую таблицу переменных: WeaponCostMin и WeaponCostMax. Их можно изменить вручную в любое время – например, если WeaponCostMax – 90000, но игрок может собрать максиму 50000 монет, вы можете легко опустить верхний предел диапазона, установив значение WeaponCostMax в 50000, для того, чтобы гарантировать, что в игре рано или поздно, но можно приобрести все оружие.
Средневзвешенные факторы
Значения свойств, рассчитываемые по формуле, можно высчитать с использованием одного или нескольких исходных значений, которые я называю «факторы». С их помощью можно получить окончательное сгенерированное значение. Например, при расчете стоимости оружия, такими факторами являются:
Объем ущерба, который наносит оружие (больше ущерб = выше цена)
Количество места, которое требуется в инвентаре (больше места = ниже цена).
На данном этапе мы считаем, что каждый фактор уже нормализован и регулируется с помощью функции распределения (т.е. в колонке D внесены исходные значения ущерба от оружия, в колонке Е – нормированные значения ущерба от оружия, а в колонке F – окончательные значения ущерба от оружия, отрегулированные по распределению, которые и будут использоваться в нашей формуле определения стоимости).
Давайте предположим, что окончательные значения ущерба от оружия содержатся в «желтой» колонке F, а окончательные значения количества места, которое требуется в инвентаре для конкретного оружия – в «желтой» колонке U. Мы хотим составить формулу для «белой» колонки С, где будет храниться автоматически рассчитанная цена для каждого оружия. Одна из самых простых формул для столбца С, в которой учтутся наши желания и требования – это нахождение среднего арифметического этих двух коэффициентов путем:
«= WeaponCostMin + ((WeaponCostMax — WeaponCostMin) * ((F1 + (1,0 — У1)) / 2.0))».
Обратите внимание, что и в этом случае снова нужно будет перетащить формулу вниз для того, чтобы применить ее для всех остальных ячеек в столбце С.
Итак, это покажет себестоимость каждого оружия в пределах указанного диапазона на основе уровня ущерба и требований к месту в инвентаре для этого оружия. Тем не менее, это также означает, что оба этих фактора в равной степени влияют на определение конечной стоимости, что не всегда желательно при наличии нескольких факторов.
Быстрым, простым и гибким решением в такой ситуации представляется преобразование формулы в средневзвешенное значение и добавление вручную конфигурируемого коэффициента значимости для каждого фактора в общую таблицу переменных. Это позволит регулировать значимость каждого отдельного фактора по своему усмотрению.
В этом случае мы добавим две новые переменные в общую таблицу переменных: WeaponCost_DamageFactorWeight и WeaponCost_SpaceFactorWeight. Эти значения – всего лишь относительные целые «веса», поэтому если я хочу, чтобы при расчете стоимости оружия его ущерб значил больше, чем требования к месту в инвентаре для этого оружия, можно установить следующие значения: WeaponCost_DamageFactorWeight — «= 5» и WeaponCost_SpaceFactorWeight – «= 1».
В конце концов, наша формула в колонке С для расчета стоимости оружия с помощью средневзвешенного значения будет выглядеть так:
«= WeaponCostMin + ((WeaponCostMax — WeaponCostMin) * (((F1 * WeaponCost_DamageFactorWeight) + ((1.0 — U1) * WeaponCost_SpaceFactorWeight)) / (WeaponCost_DamageFactorWeight + WeaponCost_SpaceFactorWeight)))»
Обратите внимание, что такая формула работает только в случае, если исходные значения для ущерба и пространства в инвентаре находятся в пределах 0-1. И это еще одна причина для того, чтобы нормализовать исходные данные до выполнения различных дополнительных операций с ними.
Выводы
Метод, изложенный выше, ни в коем случае не является совершенным, но я все равно рассказал о нем в надежде, что хоть какой-то из его элементов будет кому-то полезен. И хотя эти методы очень легкие, всегда есть возможность сделать вычисления еще более простыми, и я бы хотел увидеть предложения от других разработчиков на предмет того, как можно упростить процесс вычислений.
Например, я обнаружил, что процесс регулировки кривых распределения может стать камнем преткновения для разработчиков, которые пытаются применить такие методы на практике, не имея должного опыта работы с балансировкой и настройкой игр. Если вы, работая с кривыми, найдете, что вычисления очень громоздкие, вы можете изучить альтернативные методики: например, метод линейных сегментных кривых. Чтобы узнать о примерах использования линейных сегментных кривых для балансировки и настройки игры ознакомьтесь с подробным анализом формул временной монетизации на примере Clash of Clans, который написал Вольфганг Гребнер.
Спасибо, что читаете наши материалы! Подписывайтесь на наш блог и следите за новым интересными статьями и переводами.
Я выполнил достаточно много проектов по экономике игр, используя Excel. На сегодняшний день при конфигурации и настройке экономики игр чаще всего мне нужно создать определенный столбец данных, чтобы каждое значение ячейки автоматически рассчитывалось на основе формулы с одной или несколькими переменными (например, расчет стоимости каждого оружия на основе того, какой ущерб оно наносит и какое пространство занимает в инвентаре игрока).
Как правило, переменные, которые есть в формулах – это различные параметры одного объекта, каждый из которых занимает свою строку в таблице, а значения для других свойств этого объекта расположены в других колонках определенной строки.
А сейчас я расскажу, какие же методы работы с Excel я использую для того, чтобы организовать экономику игры, а также обеспечить простое внесение изменений и обновлений в таблицу.
Колонки с цветовыми маркерами
В своих электронных таблицах, в основном, я использую три категории колонок. Верхнюю строку каждой колонки я помечаю цветами, с помощью которых мне становится понятно, нужно ли значения в этом столбце редактировать напрямую, либо эти значения рассчитываются по формуле. Я использую следующие цветовые маркеры:
1. Зеленый – значения в этих столбцах редактируются вручную. Кроме того, такие значения требуют более частых изменений.
2. Желтый – в этих колонках значения рассчитываются на основе вычислений значений определенной области (обычно значений из колонки слева), и изменение этих значений затрагивает определенный диапазон ячеек. Формулы в этих колонках требуют корректировок, однако изменения в них вносятся реже, чем в ячейки «зеленых» колонок.
3. Белый – значения в этих колонках рассчитываются по формулам, которые не требуют каких-то серьезных изменений, так как результаты вычислений напрямую зависят от значений «желтых» колонок, связанных контрольных переменных (например, диапазон «минимум-максимум») или факторов значимости (можно найти в общей таблице переменных). Таким образом, формулы в этих колонках требуют изменений в самых крайних случаях.
Диапазоны нормированных значений
Для столбцов, где содержатся данные, которые могут подвергаться изменениям, а также влиять на значения в других столбцах, я добавляю новые записи в свою общую таблицу переменных, чтобы знать минимальное и максимальное значение в этом столбце. Затем я добавляю новый столбец для хранения нормированных значений для каждой соответствующей ячейки в исходном столбце.
Например, скажем, столбец D – зеленый в таблице Оружие, и в нем содержится информация о том, какую степень повреждения наносит каждое оружие. После заполнения этих значений вручную я бы добавил новую переменную в свою таблицу переменных под названием «WeaponDamageMax» и установил бы ее значение как «=МАКС (Оружие [D:D])», а также еще одну переменную «WeaponDamageMin», которая рассчитывается по формуле «= МИН (Оружие [D:D]).
Затем бы я создал новый столбец в таблице Оружие, столбец Е, для хранения нормированных значений повреждений с формулой «= (D1 — WeaponDamageMin) / (WeaponDamageMax — WeaponDamageMin)».
Формулы распределения
Как я уже говорил, я использую желтый цвет для маркировки колонок, в которых формулы используют нормированные исходные данные, а также выполняют некоторые математические операции для того, чтобы менять распределение значений в рамках нормированного диапазона. Это делается для того, чтобы получить больший контроль над распределением значений, а также является способом разрушения кластеров значений, которые иногда появляются.
Например, если разработчик добавляет новое, мощнейшее оружие, которое наносит ущерб в 5 000 000, а остальные значения ущерба оружия в колонке D находятся в диапазоне 1-200, одно такое большое значение исказит другие значения с более низкими показателями в диапазоне 0-1, когда они будут распределяться с помощью WeaponDamageMax, для того, чтобы получить нормированные значения ущерба в колонке Е. В некоторых случаях это желательно, но бывает, что вы хотите разбить эти кластеры данных и распространить их более равномерно по всему диапазону.
Вот где пригодится формула распределения. Нормированные значения можно легко преобразовать для получения желаемого значения распространения, применив кривую распределения к существующим данным. В этом случае мы создадим новый «желтый» столбец, колонку F, для хранения измененных значений из колонки D.
Хотя этот метод очень мощный и гибкий, все-таки визуализировать и генерировать кривые гораздо легче с помощью сторонних инструментов. Эти задачи могут выполняться и в Excel, но лично я предпочитаю использовать следующие инструменты для визуализации и изменений моих формул распределения:
Визуализация – графический калькулятор:
1. Увеличьте оси до диапазона 0-1
2. Скопируйте формулу из столбца, где настраиваются кривые, в поле «у1=»
3. Замените букву колонки с нормированными значениями на «x»
4. Нажмите кнопку «График» для того, чтобы увидеть кривую перехода
Изменения – генератор функции плавности
1. Изменяйте контрольные точки кривой до тех пор, пока она не станет выглядеть так, как вам нужно
2. Из поля «function» скопируйте часть после «b+c*» в последней строке функции (часть в скобках)
3. Вставьте скопированную формулу в столбец, где настраивается кривая
4. Замените название «t» на букву столбца с нормированными значениями (nvcID), название «ts» на «nvcID^2», а «tc» — на «nvcID^3».
В случае с нормированными значениями ущерба от оружия в колонке Е мы можем попытаться растянуть кластер значений в нижнюю часть нашего диапазона, используя исходную формулу столбца F в виде «= (-6,885 * (Е1 ^ 3) * (Е1 ^ 2) + 19,885 * (Е1 ^ 2) * (Е1 ^ 2) + -18,395 * (Е1 ^ 3) + 3,825 * (E1 ^ 2) + 2,57 * E1),».
Эта формула была изначально получена с помощью генератора функции плавности, о котором я говорил выше, и может быть изменена при необходимости регулировки распределения. Опять же, мы применим эту формулу к остальным строкам в колонке F, используя типичный метод перетаскивания ячейки с формулой вниз по остальным ячейкам в колонке, чтобы изменять Е1 для каждой строки.
Вне зависимости от того, какую формулу распределения вы используете, убедитесь, что полученные значения остаются в пределах 0-1.
Просто… возьми, что тебе нужно и оставь немного денег…
Контрольные переменные диапазона
Для значений, которые будут автоматически рассчитываться по формуле (в данном примере – это цена каждого оружия), я считаю, что будет полезно иметь возможность контролировать минимальные и максимальные значения этого параметра, чтобы удерживать их в пределах установленного диапазона. Для этого я добавляю регулируемые минимальные/максимальные переменные, которые соответствуют каждой «белой» колонке (где расчеты производятся по формуле), которые заполняются автоматически рассчитанными значениями.
В случае с ценой оружия я бы добавил две новые переменные в общую таблицу переменных: WeaponCostMin и WeaponCostMax. Их можно изменить вручную в любое время – например, если WeaponCostMax – 90000, но игрок может собрать максиму 50000 монет, вы можете легко опустить верхний предел диапазона, установив значение WeaponCostMax в 50000, для того, чтобы гарантировать, что в игре рано или поздно, но можно приобрести все оружие.
Средневзвешенные факторы
Значения свойств, рассчитываемые по формуле, можно высчитать с использованием одного или нескольких исходных значений, которые я называю «факторы». С их помощью можно получить окончательное сгенерированное значение. Например, при расчете стоимости оружия, такими факторами являются:
Объем ущерба, который наносит оружие (больше ущерб = выше цена)
Количество места, которое требуется в инвентаре (больше места = ниже цена).
На данном этапе мы считаем, что каждый фактор уже нормализован и регулируется с помощью функции распределения (т.е. в колонке D внесены исходные значения ущерба от оружия, в колонке Е – нормированные значения ущерба от оружия, а в колонке F – окончательные значения ущерба от оружия, отрегулированные по распределению, которые и будут использоваться в нашей формуле определения стоимости).
Давайте предположим, что окончательные значения ущерба от оружия содержатся в «желтой» колонке F, а окончательные значения количества места, которое требуется в инвентаре для конкретного оружия – в «желтой» колонке U. Мы хотим составить формулу для «белой» колонки С, где будет храниться автоматически рассчитанная цена для каждого оружия. Одна из самых простых формул для столбца С, в которой учтутся наши желания и требования – это нахождение среднего арифметического этих двух коэффициентов путем:
«= WeaponCostMin + ((WeaponCostMax — WeaponCostMin) * ((F1 + (1,0 — У1)) / 2.0))».
Обратите внимание, что и в этом случае снова нужно будет перетащить формулу вниз для того, чтобы применить ее для всех остальных ячеек в столбце С.
Итак, это покажет себестоимость каждого оружия в пределах указанного диапазона на основе уровня ущерба и требований к месту в инвентаре для этого оружия. Тем не менее, это также означает, что оба этих фактора в равной степени влияют на определение конечной стоимости, что не всегда желательно при наличии нескольких факторов.
Быстрым, простым и гибким решением в такой ситуации представляется преобразование формулы в средневзвешенное значение и добавление вручную конфигурируемого коэффициента значимости для каждого фактора в общую таблицу переменных. Это позволит регулировать значимость каждого отдельного фактора по своему усмотрению.
В этом случае мы добавим две новые переменные в общую таблицу переменных: WeaponCost_DamageFactorWeight и WeaponCost_SpaceFactorWeight. Эти значения – всего лишь относительные целые «веса», поэтому если я хочу, чтобы при расчете стоимости оружия его ущерб значил больше, чем требования к месту в инвентаре для этого оружия, можно установить следующие значения: WeaponCost_DamageFactorWeight — «= 5» и WeaponCost_SpaceFactorWeight – «= 1».
В конце концов, наша формула в колонке С для расчета стоимости оружия с помощью средневзвешенного значения будет выглядеть так:
«= WeaponCostMin + ((WeaponCostMax — WeaponCostMin) * (((F1 * WeaponCost_DamageFactorWeight) + ((1.0 — U1) * WeaponCost_SpaceFactorWeight)) / (WeaponCost_DamageFactorWeight + WeaponCost_SpaceFactorWeight)))»
Обратите внимание, что такая формула работает только в случае, если исходные значения для ущерба и пространства в инвентаре находятся в пределах 0-1. И это еще одна причина для того, чтобы нормализовать исходные данные до выполнения различных дополнительных операций с ними.
Выводы
Метод, изложенный выше, ни в коем случае не является совершенным, но я все равно рассказал о нем в надежде, что хоть какой-то из его элементов будет кому-то полезен. И хотя эти методы очень легкие, всегда есть возможность сделать вычисления еще более простыми, и я бы хотел увидеть предложения от других разработчиков на предмет того, как можно упростить процесс вычислений.
Например, я обнаружил, что процесс регулировки кривых распределения может стать камнем преткновения для разработчиков, которые пытаются применить такие методы на практике, не имея должного опыта работы с балансировкой и настройкой игр. Если вы, работая с кривыми, найдете, что вычисления очень громоздкие, вы можете изучить альтернативные методики: например, метод линейных сегментных кривых. Чтобы узнать о примерах использования линейных сегментных кривых для балансировки и настройки игры ознакомьтесь с подробным анализом формул временной монетизации на примере Clash of Clans, который написал Вольфганг Гребнер.
Спасибо, что читаете наши материалы! Подписывайтесь на наш блог и следите за новым интересными статьями и переводами.
Комментарии (3)
Mefistofe1
10.06.2015 18:00+1Забавно. Столкнувшись с похожей задачей(по балансу заработка игрока в игровой валюте и трат на игровые же предметы) пришел к похожему же решению. Включая цветовые маркеры. Спасибо за идею отдельной страницы контролирующих параметров и максимумов/минимумов.
Очень удобно кстати использовать Google Tables. Почти тот же Excel, только в профиль, + можно сразу заинтересованным лицам расшаривать результаты сведения и общие цифры.
cybter
Спасибо, за перевод! Не хватает по геймдизайну подобных статей в рунете.
m14 Автор
Спасибо за благодарность. Согласен, что у нас такого чтива от спецов из индустрии мало, но тенденции позитивные. Помимо Хабра есть еще AppTractor который с каждым днем все больше углубляется в корень в своей аналитике, пусть и не повсеместно и не так глубоко, но тренд хороший.