为射箭目标python3中的环指定值

时间:2017-11-20 21:09:55

标签: algorithm python-3.x

我有一个射箭目标有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语句,但我认为这看起来很难看,我应该能够缩短它。提前谢谢。

2 个答案:

答案 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)] 。谢谢大家的帮助!