1 回答

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個(gè)贊
閱讀了D&D Character 練習(xí)描述后,這里根本沒(méi)有具體說(shuō)明。您對(duì)必須依靠這里的測(cè)試來(lái)為您提供規(guī)范感到不安是對(duì)的,這應(yīng)該在您的作業(yè)中更清楚地描述。
測(cè)試當(dāng)然期望有一個(gè)Character().ability()方法,并驗(yàn)證該方法返回一個(gè) 3-18 范圍內(nèi)的整數(shù),包括 3-18。因此,在描述告訴您如何計(jì)算能力以及測(cè)試正在尋找什么的內(nèi)容之間閱讀,您只需將您的roll_ability()函數(shù)移動(dòng)到您的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 個(gè)最高骰子的總和),因此應(yīng)該毫無(wú)問(wèn)題地通過(guò)測(cè)試。我已經(jīng)確認(rèn)上述實(shí)現(xiàn)(加上你的modifier()函數(shù))確實(shí)通過(guò)了給定的單元測(cè)試。
從設(shè)計(jì)的角度來(lái)看,您在這里使用單獨(dú)的功能是正確的。ability()不依賴于任何Character狀態(tài),也不是字符實(shí)例預(yù)期執(zhí)行的功能。與其把它變成一個(gè)方法(帶有一個(gè)無(wú)用的self參數(shù)),你可以在這里妥協(xié)并把它變成一個(gè)@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 個(gè)骰子中選出前 3 個(gè)的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ù)移動(dòng)到頂部的大寫全局名稱中。46
添加回答
舉報(bào)