#python #list #discord.py
Вопрос:
Так что я работаю на питон РПГ игры, недавно и я столкнулся с проблемой, которая не может быть легко решена с моим нынешним питона навыки, чтобы дать некоторый фон, проблема я столкнулся-это с уровня функция в моей игре, который используется для генерации врагов, каждый врагов в моей игре, имеет такие атрибуты, как: здоровье, сила, магия, скорость, защиту и логики(защита от магии), и у них тоже класс, для примера скажем, что мы генерируем на уровне 75 ниндзя противника.
скорость роста класса ниндзя: Максимальное здоровье 60%, Сила 40%, Магия 15%, Скорость 60%, Защита 30%, Логика 20%
чтобы сгенерировать статистику врага: я бы сделал цикл 75 раз, потому что это уровень ниндзя, и каждый раз, когда я делаю цикл, я бы просматривал темпы роста и оценивал шансы на рост, если это возвращает значение true, то я добавляю 1 к этому показателю, например:
array indexs [MaxHP, Strength, Magic, Speed, Defense, Logic]
Level 1 iteration: [1, 1, 0, 0, 0, 1]
Level 2 iteration: [2, 1, 0, 1, 1, 1]
Level 3 iteration: [2, 2, 0, 2, 1, 1]
Level 4 iteration: [3, 2, 0, 3, 1, 1]
the algorithm would do this 75 times
как вы можете видеть, статистика постепенно начинает отражать темпы роста, так как ниндзя в конечном итоге получит лучшую статистику по максимальному здоровью, силе и скорости.
Теперь проблема в том, что этот алгоритм постоянно запускается в многопользовательской игре, на моем маленьком raspberry pi, все, о чем я спрашиваю, это о том, будет ли более эффективный способ генерировать врагов, потому что прямо сейчас, чтобы создать ниндзя 75-го уровня, мне нужно запустить rng 75*6 = 450 раз, что не очень эффективно с точки зрения эффективности
Вот код для алгоритма
def generate_enemy(name,level):
#used the 0 at the start as placement for the message id
weapon_type = random.choice(list(class_road_map.keys()))
num_classes = min(int(level/20) 1,len(class_road_map[weapon_type]))
classes = class_road_map[weapon_type][:num_classes]
for num in range(len(classes)):
classes[num] = random.choice(classes[num].split("-"))
weapon_thing = generate_class_weapon(classes[-1],level)
weapon_id = game.hash_string(weapon_thing)
current_level = 0
enemy_data = [0, name, weapon_id, classes[-1], level, 0, 0, 3, 1, 1, 1, 1, 1,generate_enemy_loot(level),""]
for class_name in classes:
growth_rates = db.get_class(class_name)[1].split("-")
for x in range(20):
if current_level == level:
break
current_level =1
for num in range(len(growth_rates)):
if rng(float(growth_rates[num])):
enemy_data[7 num] =1
enemy_data[6] = enemy_data[7]
return enemy_data
Если вы заинтересованы в проекте, пожалуйста, ознакомьтесь с репозиторием GitHub
https://github.com/Graves451/discord-based-rpg
Комментарии:
1. Я не понимаю, почему вы не можете просто пойти с чем-то вроде randInt(moblevel-10, moblevel) и просто пойти с этим? Какова цель роста, если конечный результат все равно будет близок к его уровню?
2. проблема в том, что randint генерирует случайное число, в то время как мне нужно, чтобы число оставалось несколько близким к темпу роста, умноженному на уровень, так что, например, показатель силы ниндзя 75-го уровня должен составлять около 40%, умноженное на 75, то есть около 30, не слишком отклоняясь.
3. О чем
0.4*75 randint(-5, 5)
? Таким образом, у вас будет равномерный разброс между 25 и 35. Вы можете изменитьrandint(-5, 5)
, чтобы быть тем, кем вам нравится. Требуется одинrandint
вызов для каждого атрибута.4. это может сработать, однако мне, вероятно, придется переработать его так, чтобы меньшие уровни имели меньший диапазон возможных значений
5. однако все те статистические данные, которые варьируются от (-5,5), по-прежнему имеют одинаковую вероятность, что мне не нравится, я думаю, что что-то более похожее на генератор взвешенных случайных чисел будет работать лучше, потому что разброс должен быть ближе к середине, а не все возможные значения с одинаковой вероятностью