if if语句使用dict选择正确的值

时间:2015-09-15 15:47:16

标签: python python-3.x

我正在研究Teamspeak 3机器人。

首先我只是想说我对Python很新,所以可能有一个简单的解决方案,我不知道,但我无法弄清楚如何做到这一点。

我所做的是创建一个每20秒运行一次的脚本。它将使用所有在线连接的客户端创建一个循环,如果它们不在AFK通道而不是工作人员,则在数据库中的总时间在线表中添加20秒。这是我迄今为止创造的,它的确有效。

使用此bot的计划是将一个新的服务器组分配给teamspeak客户端,如果它已在线达到服务器组所需的时间。

我在这里创建了三个例子:

serverGroups = {
    "Rookie": ("9", "3600"),
    "Member": ("10", "43200"),
    "Veteran": ("11", "172800")
}

在Rookie组中,名称是Rookie,服务器组ID是9,你需要达到的总时间(以秒为单位)是3600。

我有所有需要信息的变量,例如用户当前服务器组ID和在线总时间。

所以基本上我无法弄清楚如何做的是编写代码来检查用户是否已达到新服务器组所需的时间,以及是否应该将用户分配给新的服务器组。

请注意,每次运行时我都无法更改服务器组,因为用户将在其客户端上听到它,因此如果已达到时间且用户不是他已到达的用户组,我只能分配新组。后来我会在我使用的dict中添加更多组,这就是我在这里问的原因,因为我一直在尝试并尝试以一种简单的方式做到这一点,我不需要进入代码并添加很多行每次我添加一个新的服务器组。

我试图从中返回的是,是否应该更改服务器组以及更改服务器组。

如果我解释得不好请告诉我,我会尝试以更好的方式对其进行改写。

谢谢。

1 个答案:

答案 0 :(得分:1)

如果没有关于如何存储玩家信息的细节的详细信息,那么给出一个很好的例子有点困难,但是这样的事情可能就是你要找的东西

def upgradeUserRank(playerScore):
    # :param playerscore: whatever variable
    # which contains the players newest time
    # after adding the 20 seconds
    #
    # returns the new player rank if they should
    # be upgraded, else None
    serverGroups = {
        "Rookie": ("9", "3600"),
        "Member": ("10", "43200"),
        "Veteran": ("11", "172800")
    }

    # invert the dictionary because we want to reference by times
    # scoreDict = {serverGroups[i][1]:i for i in serverGroups.keys()}
    scoreDict = {j[1]:i for i, j in serverGroups.items()}

    # iterate through the required times from greatest to least
    # so you don't return the lower ranks
    for i in sorted(scoreDict, key=lambda x:int(x), reverse=True):
        # Check if they've entered the new rank in the last 20 seconds
        # Otherwise, you'd suggest they should be updated
        # every 20s interval you check after the pass the
        # threshold
        if 0<=playerScore-int(i)<20:
            return scoreDict[i]