[英]how to select best combination of different lines
前段時間,我開始玩我年輕時的老式 RPG。
您必須制作一組 4 個角色,每個角色在技能列表中的值從 0(無法學習該技能)到 5(掌握該技能)。
例如,它看起來有點像這樣:
Shield Sword Magic
Knight 5 5 0
Ranger 2 3 3
Sorcerer 0 0 5
當然還有更多的技能和更多的課程。
所以我想制作一個可以測試所有職業組合的腳本,並在最后給我最能掌握技能的 4 個角色。
但是我不需要 2 種技能才能被 2 個不同的角色最大化,例如,如果巫師可以在魔法中獲得 5,我不一定需要另一個可以做到這一點的角色。
我的想法是進行一些 for 循環,它將比較所有 4 個英雄組合的所選技能列中的所有值,然后繼續進行下一個,等等......
但我不知道從哪里開始以及如何做。 有任何想法嗎?
祝大家有個愉快的一天
我的評論的示例實現,不需要 Pandas。
import itertools
from collections import Counter
class_infos = {
"knight": {"shield": 5, "sword": 5},
"ranger": {"shield": 2, "sword": 3, "magic": 3},
"sorcerer": {"magic": 5},
"street_urchin": {"shield": 1, "sword": 1, "magic": 1},
}
def score_party(party_classes):
skill_totals = Counter()
skill_occurrences = Counter()
for char_cls in party_classes:
char_skills = class_infos[char_cls]
skill_totals.update(char_skills) # Sum up skill points
# Sum up occurrences of skills in the party composition.
skill_occurrences.update({skill for skill, value in char_skills.items() if value})
total_skill = sum(skill_totals.values())
# Figure out how many skills are non-unique.
skills_with_overlap = {skill for (skill, chars) in skill_occurrences.items() if chars > 1}
# TODO: adjust this divisor – right now it just looks at the number of skills
# that overlap between characters, and quite heavily penalizes them.
divisor = 1 + len(skills_with_overlap)
return total_skill / divisor
def main():
num_party_members = 2
party_scores = {
frozenset(party): score_party(party)
for party in itertools.combinations(class_infos, num_party_members)
}
for party, score in sorted(party_scores.items(), key=lambda x: x[1], reverse=True):
print(sorted(party), score)
if __name__ == "__main__":
main()
輸出(對於這些示例數字和 2 方)
['knight', 'sorcerer'] 15.0
['ranger', 'sorcerer'] 6.5
['knight', 'ranger'] 6.0
['knight', 'street_urchin'] 4.33
['sorcerer', 'street_urchin'] 4.0
['ranger', 'street_urchin'] 2.75
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.