我有一个射箭目标有5个环(或4个环和一个中心圆)。我必须给每个戒指一个分数。得分是(对于外到内的环):1-2-5-10-25
在我听到具体分数之前,我做了这个功能,为每个戒指分配分数:
def points(cDistance):
for i in range(5):
if i <= cDistance < i+1:
return 10-2*i
注意:cDistance是鼠标单击到目标中心的距离。每个环和中间圆的半径为1。 编辑: 此处返回的分数不是此作业的正确分数。
我已经知道戒指的分数乘以2再乘以2.5。我不知道如何整齐地把它放在一个for循环中。我可以为每个戒指制作一个if语句,但我认为这看起来很难看,我应该能够缩短它。提前谢谢。
答案 0 :(得分:0)
在这种情况下,if-elif -...- else链没有什么特别的错误,特别是如果你想处理箭头落在目标之外的情况(可能是其他部分)。
否则,索引数组如:
score = [1, 2, 5, 10, 25][math.floor(cDistance)]
将其包裹在try
- except IndexError
中以处理更远距离的案件。如果你想一直走,你可以先确保cDistance始终为0或更大:
scores = [1, 2, 5, 10, 25]
dist = max(0, cDistance)
dist = math.floor(dist)
try:
score = scores[dist]
except IndexError:
score = 0
或者您可以使用dict(dict可以使用整数键,因此它与数组几乎相同,只是您可以使用get()
使用默认值来表示错误的距离):
scores = {0: 1, 1: 2, 2: 5, 3: 10, 4: 25}
dist = max(0, cDistance)
dist = math.floor(dist)
score = scores.get(dist, 0)
注意:对于正值,int(dist)
会产生与math.floor(dist)
完全相同的值(和类型)。
答案 1 :(得分:0)
这是正常工作的功能:
Observable<string>
如果cDistance小于1,则函数返回25,如果cDistance小于2,则返回10等。
我必须添加if语句,否则如果我在目标之外单击,我会收到错误。现在,当在目标外部点击时,它会返回def points(cDistance):
if cDistance <= 5:
return [25, 10, 5, 2, 1][math.floor(cDistance)]
。谢谢大家的帮助!