我正在尝试用Python制作一个骰子滚筒。 代码是:
class die:
def __init__(self, num:int, die:int | str, mod:int=0, keep:int=None):
keep = keep if keep != None else num
if keep > num: keep = num
self.num, self.die, self.mod, self.keep = num, die, mod, keep
def __repr__(self) -> str:
mod = f"+{self.mod}" if self.mod > 0 else f"-{abs(self.mod)}" if self.mod < 0 else ''
keep = f"{f"{self.keep}kh" if self.keep > 0 else f"{abs(self.keep)}kl" if self.keep < 0 else ''}"
return f"{keep}{self.num}d{self.die}{mod}"
def roll(self) -> int:
log = []
die = range(0, self.num)
for _ in die:
log += [rand.randint(0, (10 if self.die == '%' else int(self.die)) * (10 if self.die == '%' else 1))]
if self.keep > 0:
log = [log] + [heapq.nlargest(self.keep, log)]
elif self.keep < 0:
log = [log] + [heapq.nsmallest(abs(self.keep), log)]
final = sum(log[1], self.mod)
return final
#Sorry if my code is hard to read.
我想添加传递骰子表达式的功能(例如:
4d6+3
)以及单独的选项。如果只提供一个参数,有什么方法可以传递一个单独的参数。例如:
def __init__(self, num:int, die:int | str, mod:int=0, keep:int=None OR expression:str)
__init__
就这样就好了。将字符串解析为合适的参数的工作应该由 class 方法来处理。
类似的东西
class die:
def __init__(self, num:int, die:int | str, mod:int=0, keep:int=None):
...
@classmethod
def from_description(cls, descr: str) -> die:
num, die, mod = re.match("\d+d\d+\+\d+").groups()
return cls(num, die, mod)
d = die.from_description("4d6+3")