ロールプレイングゲームのキャラクターシートを自動的に作成するアルゴリズムに取り組んでいます。ゲームでは、ポイントを増やしてポイントを増やす属性があります。ただし、特定の値では、実際の属性の値を1増やすのに2ポイントかかります。特定のポイント数から開始し、各属性のデフォルト値は1です。
ポイントをランダムに割り当てるプログラムがありますが、必要に応じて切り捨てるためにこれらの値(辞書にある)を変更する方法がわかりません。
たとえば、「strength」に3ポイントを入力すると、それで問題ありません。「strength」の値は3になります(ベース1を含む)。ただし、4ポイントを入力した場合でも、値は4になります。値5を取得するには、5ポイント(およびベース1)が必要です。次に、値を取得するには、さらに2ポイントかかります。 6、3ポイントで7の値を取得し、3ポイントで8の値を取得します。
現在、属性を割り当てるために使用しているコードは次のようになります。
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
効率的でもきれいでもありませんが、それでも解決策です。ただし、辞書内のインデックスをループすることはできないため、このような処理を行う方法が完全にはわかりません。
一般的な説明や機能をいただければ幸いです。
思われる二分はかなりよくスーツニーズアルゴ- 「投資」へのポイントは常にソートされ、定義されています。参照点を使用して配列を作成すると、if
sの束がなくても問題ありません。
>>> from bisect import bisect
>>> points_to_invest = [1, 2, 3, 4, 6, 8, 10, 13]
>>> bisect(points_to_invest, 1)
1
>>> bisect(points_to_invest, 4)
4
>>> bisect(points_to_invest, 5)
4
>>> bisect(points_to_invest, 6)
5
このアプローチにより、将来の保守性が大幅に向上します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加