【问题标题】:assign values to rings in archery targets python3为射箭目标python3中的环赋值
【发布时间】:2017-11-21 06:19:39
【问题描述】:

我有一个带有 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 语句,但我认为这看起来很难看,我应该能够让它更短。提前致谢。

【问题讨论】:

  • 顺便说一下,我认为您的分数计算不正确,但这是另一个问题。
  • 您可以使用math module 函数ceilfloor 使事情变得更简单:如果使用正确,则不需要迭代和if 语句。
  • 并且使用带有分数的数组,您可以简单地对其进行索引:[1, 2, 5, 10, 25][math.floor(cDistance)](忽略在环的边界处发生的事情,或者在目标之外发生的情况)。
  • 我的分数计算确实不正确,因为这是我要解决的问题。我会稍微修改一下我的问题以明确这一点

标签: algorithm python-3.x


【解决方案1】:

在这种情况下,使用 if-elif-...-else 链并没有什么特别的错误,特别是如果您想处理箭头落在目标之外的情况(可能是 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) 完全相同。

【讨论】:

    【解决方案2】:

    这是正常工作的功能:

    def points(cDistance):
        if cDistance <= 5:
            return [25, 10, 5, 2, 1][math.floor(cDistance)]
    

    如果 cDistance 小于 1,则函数返回 25,如果 cDistance 小于 2,则返回 10,以此类推。

    我必须添加 if 语句,否则如果我在目标之外单击会出错。现在,在目标外部单击时,它会返回None。谢谢大家的帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-21
      • 2021-11-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多