Я пишу сейчас свою стратегию и одной из фишек — создание доспеха/юнитов с своими уникальными параметрами.
И естественно чем выше параметр, тем дороже он будет стоить.
Я пришел в тупик, когда вопрос зашел за сам алгоритм повышения цены.
Первый раз взор пал на процентное повышение. Но я быстро от него отказался, т.к. у него есть большой недостаток.
Когда параметр поднимается на 1,2,3 уровня, цена почти не изменяется, но при изменении уровня на 1000 пунктов (да, такое тоже возможно), то цены вырастают с условных 1000 монет, до 1ккк и более, что очень не хорошо.
Второй вариант был использовать фиксированную цену за уровень. Но тут я наткнулся на неприятнейший баг.
К примеру у юнита есть параметр «Ловкость», который стоит 1200 монет и есть доспех, у которого параметр Ловкость стоит 1000 монет за уровень. Если игрок сольет -100 ловкости персонажа и добавит их в доспех, то он получит по 200 монет, на каждом уровне параметра.
Сделать везде одинаковую цену я не могу, т.к. сделать латный доспех с очень хорошей маневренностью почти нереально, по этому цена на параметр ловкости будет очень высока, а на кожаную броню тяжело добавить сопротивление ударам.
Попробуйте как-нибудь так.
Для каждого параметра в каждом доспехе вам нужно установить что-от вроде «редкости», или «ценности». Например, на тяжелом доспехе бонус к мане будет почти ничего не стоящим, а бонус, например, к хп, будет стоить дорого.
Дальше выберите какую-то функцию, по которой цена будет расти в зависимости от значения атрибута. Если у вас атрибут сначала растет медленно, а потом «ускоряется» (например нормальная броня на 5 уровне — 10, на 10м — 20, а на 15 — сразу 100), то вам наверное подойдет какая-нибудь логарифмическая функция. Если наоборот, сначала растет редко, а потом замедляется (например на 5 уровне — 10, на 10 — 20, на 15 — 27, на 20м — 30 и т.д.), то подойдет какая-нибудь показательная функция.
Ну а потом вы сможете подсчитать изменение цены для каждого атрибута в зависимости от этой функции, умножить на коэффициент «полезности» для атрибута, и получить цену.
Единое, что скорость работы алгоритма O(n)
Но, это не сильно критично, т.к. основная нагрузка падет на клиентскую сторону, а на серверной оно провериться ровно один раз, при создании.
Собственно, к чему я в конце концов пришел.
import math
price = 0.0
bonus = 1.0
lvlStart = 0
lvlEnd = 50
lvl = lvlEnd - lvlStart
i = 1
while i <= lvl:
price += float(priceItem * math.exp(float(i) / 1000.0))
i += 1
print int(price * bonus)