1 回答

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個贊
閱讀了D&D Character 練習(xí)描述后,這里根本沒有具體說明。您對必須依靠這里的測試來為您提供規(guī)范感到不安是對的,這應(yīng)該在您的作業(yè)中更清楚地描述。
測試當(dāng)然期望有一個Character().ability()方法,并驗(yàn)證該方法返回一個 3-18 范圍內(nèi)的整數(shù),包括 3-18。因此,在描述告訴您如何計(jì)算能力以及測試正在尋找什么的內(nèi)容之間閱讀,您只需將您的roll_ability()函數(shù)移動到您的Character類并重命名它ability():
class Character:
def __init__(self):
for ability in ABILITIES:
setattr(self, ability, self.ability())
self.hitpoints = 10 + modifier(self.constitution)
def ability(self, dice=4, sides=6):
rolls = []
for die in range(dice):
rolls.append(random.randint(1, sides))
rolls.remove(min(rolls))
return sum(rolls)
您自己的實(shí)現(xiàn)已經(jīng)產(chǎn)生了 3 到 18 之間的數(shù)字(包括 3 個最高骰子的總和),因此應(yīng)該毫無問題地通過測試。我已經(jīng)確認(rèn)上述實(shí)現(xiàn)(加上你的modifier()函數(shù))確實(shí)通過了給定的單元測試。
從設(shè)計(jì)的角度來看,您在這里使用單獨(dú)的功能是正確的。ability()不依賴于任何Character狀態(tài),也不是字符實(shí)例預(yù)期執(zhí)行的功能。與其把它變成一個方法(帶有一個無用的self參數(shù)),你可以在這里妥協(xié)并把它變成一個@staticmethod:
class Character:
def __init__(self):
for ability in ABILITIES:
setattr(self, ability, self.ability())
self.hitpoints = 10 + modifier(self.constitution)
@staticmethod
def ability(dice=4, sides=6):
rolls = []
for die in range(dice):
rolls.append(random.randint(1, sides))
rolls.remove(min(rolls))
return sum(rolls)
至于ability()函數(shù)實(shí)現(xiàn),您可能想在這里查看干凈有效地從 4 個骰子中選出前 3 個的heapq.nlargest()函數(shù):
from heapq import nlargest
class Character:
# ...
@staticmethod
def ability(dice=4, sides=6):
rolls = (random.randint(1, sides) for _ in range(dice))
return sum(nlargest(dice - 1, rolls))
我只是根據(jù) YAGNIdice將andsides參數(shù)放在此處,或者至少將幻數(shù)移動到頂部的大寫全局名稱中。46
添加回答
舉報(bào)