Я работаю над алгоритмом автоматического создания персональных листов для ролевой игры. В игре у вас есть атрибуты, на которые вы добавляете очки, чтобы увеличить их. Однако при определенном значении требуется 2 балла, чтобы увеличить значение фактического атрибута на 1. Вы начинаете с определенного количества точек, и каждый атрибут имеет значение по умолчанию
У меня есть программа, которая случайным образом назначает точки, однако я зациклен на том, как я затем изменяю эти значения (которые находятся в словаре) округлять, когда это необходимо.
Например, если я наложу 3 очка в "силе", это нормально, я получаю значение "сила" 3 (включая базу 1). Однако, если я ставлю 4 очка, я все равно должен иметь значение 4. Для получения значения 5. он должен взять 5 очков (плюс основание 1). Затем он получает еще 2 балла, чтобы получить значение 6, 3 балла, чтобы получить значение 7 и 3 точки, чтобы получить значение 8.
Код, который я использую для назначения attitutes, выглядит следующим образом:
attributes = {}
row1 = ['strength', 'intelligence', 'charisma']
row2 = ['stamina', 'willpower']
row3 = ['dexterity', 'wits', 'luck']
def assignRow(row, p): # p is the number of points you have to assign to each row
rowValues = {}
for i in range(0, len(row)-1):
val = randint(0, p)
rowValues[row[i]] = val + 1
p -= val
rowValues[row[-1]] = p + 1
return attributes.update(rowValues)
assignRow(row1, 7)
assignRow(row2, 5)
assignRow(row3, 3)
Я хочу просто простую функцию, которая принимает словарные атрибуты в качестве параметра и преобразует количество точек, каждый атрибут которых должен иметь соответствующее значение, которое оно должно быть.
то есть. "strength": 4
остается как "strength": 4
, но "wits": 6"
переходит на "wits": 5"
, а "intelligence: 9
переходит на "intelligence: 7"
.
Я немного новичок в использовании словарей, и поэтому я обычно подхожу к этому:
def convert(list):
for i in range(len(list)):
if list[i] <= 4:
list[i] = list[i]
if list[i] in (5, 6):
list[i] -= 1
if list[i] in (7, 8):
list[i] -= 2
if list[i] in (9, 10):
list[i] = 6
if list[i] in (11, 12, 13):
list[i] = 7
else:
list[i] = 8
Неэффективен или симпатичен, но все еще является решением. Однако вы не можете просто перебирать индексы в словаре, поэтому я не совсем уверен, как это сделать.
Было бы оценено общее объяснение или функция.