Python Sikuli-如何在findAll比赛中循环

Python Sikuli-如何在findAll比赛中循环,python,automation,sikuli,Python,Automation,Sikuli,我正在为一个在线游戏开发一个机器人。登录时,我必须从多个服务器中进行选择。每台服务器在服务器名称旁边都有一个“在线”/“离线”标识符。即使有多台在线服务器,bot也只会选择其中一台,每次都是同一台。奇怪的是,另一个应该首先被找到,因此它应该是被点击的那个 我想调整我的代码,这样我就可以找到所有的“在线”实例并选择一个。如果该服务器无法连接,那么我希望它返回菜单并尝试下一个潜在的在线服务器。当服务器连接失败或服务器连接丢失时,会返回主菜单,弹出“服务器连接丢失”弹出窗口。下面是我正在使用的代码。其

我正在为一个在线游戏开发一个机器人。登录时,我必须从多个服务器中进行选择。每台服务器在服务器名称旁边都有一个“在线”/“离线”标识符。即使有多台在线服务器,bot也只会选择其中一台,每次都是同一台。奇怪的是,另一个应该首先被找到,因此它应该是被点击的那个

我想调整我的代码,这样我就可以找到所有的“在线”实例并选择一个。如果该服务器无法连接,那么我希望它返回菜单并尝试下一个潜在的在线服务器。当服务器连接失败或服务器连接丢失时,会返回主菜单,弹出“服务器连接丢失”弹出窗口。下面是我正在使用的代码。其逻辑基本上是检查服务器连接丢失或死亡等任何问题,并在实际尝试战斗之前修复这些问题

BotOn = True
FighterBot = False

def runHotkey(event):
    global BotOn
    BotOn = False
Env.addHotkey(Key.ESC, KeyModifier.SHIFT, runHotkey)

def BotFighter(event):
    global FighterBot
    FighterBot = True
Env.addHotkey(Key.PAGE_UP,0, BotFighter)

def BotFighterOff(event):
    global FighterBot
    FighterBot = False
Env.addHotkey(Key.PAGE_DOWN,0, BotFighterOff)

while BotOn == True:
    while FighterBot == True:
        if exists("LostServerConnection.png"):
            click("LostServerConnection.png")
            wait(.5)
        if exists("LoginFailed.png"):
            click("LoginFailed.png")
            wait(.5)
        if exists("Login.png"):
            click("Login.png")
            wait(.5)
        if exists("Play.png"):
            click("Play.png") 
            wait(.5)
        if exists("OnlineServer.png"):
            click("OnlineServer.png")
            wait(("AttackButton.png")or("LostServerConnection.png"),FOREVER)
            if exists("AttackButton.png"):
                #commands for moving to specific location
            elif exists("LostServerConnection.png"):
                click("LostServerConnection.png")
                wait(.5)
        if exists("Revive.png"):
            click("Revive.png")     
            waitVanish("Revive.png")  
            wait("AttackButton.png")
            #commands for moving to specific location
        else:
            #commands for fighting
很抱歉,它写得很粗糙。在我清理之前,我仍在学习并试图解决这个问题

我的理想结果是拥有一个功能,可以检查有多少服务器在线,为它们创建一个索引,并能够在尝试登录到实际工作的服务器时循环使用该索引

() 我尝试了Eugene S在这个链接中所说的,但是当我在他的代码的“图像”部分输入图像时,Sikuli在第一行出错:

Edit1:我重新阅读了一些遗漏的重要信息,并修复了代码。现在它不会出错,但是实际上它并没有点击任何东西。我确信我遗漏了一些东西,所以在此期间我将继续调查此事。 (谢谢尤金斯)

Edit2:我已将下面的代码更新为当前使用的代码。它似乎更接近我要找的东西。但现在它找到所有匹配项,然后单击每个匹配项,即使在加载第一个单击项时它消失了。我希望能够做到我在评论中添加的内容。 (谢谢尤金斯)


我不知道您的游戏逻辑,但如果您需要使用多种模式,您可以按如下方式进行操作:

找到它们并存储在某些列表中:

resultsList = findAll("YOUR_FILE_NAME.png")
然后对每个找到的模式做你需要的

for result in resultsList:
    result.highlight(1)
    #DO WHAT YOU NEED
或者,您可以使用列表中的第一项,并在每次需要下一项时将其删除:

NEXT_PATTERN = results.pop(0)
您必须考虑一个对您有意义的策略,并使用我提到的概念来实施它。我认为你应该把所有的主要任务分成几个部分,然后构建你的主要逻辑。例如,您可以实现如下功能:

def waitForGameToLoad():
    # Wait sufficienttime and verify that the game has been actually successfully started

def isGameLoaded():
    # Just and exmaple of another function that can be used internally inside waitForGameToLoad

def getNextAvailableServer():
    # Get next available server from a list that you have previously created
因此,对于exmaple,您可以以更容易理解的方式构建主逻辑块:

availableServersList = getAvailableServers() # getAvailableServers is a function that you will have to implement yourself

while True:
    connectServer(availableServersList)

    if connected():
        break
注意


我上面描述的只是关于如何实现主要逻辑的一般建议。你不需要直接遵循这一点。尝试创建对您有意义的函数,然后将它们一起使用以构建逻辑流。

您能否共享导致错误的代码和错误本身(在尝试查找多个匹配项时)?@EugeneS在第1行我有一个def returnImageCount(“OnlineServer-7.png”):它正在返回此错误[错误]脚本[Untitled]在第21列第1行出现错误时停止[error]SyntaxError('input\'没有可行的替代方案\'“OnlineServer-7.png”\'',)如果您将代码包含在问题中并格式化,则更容易理解代码。从我现在看到的情况来看,您似乎试图为函数定义提供一个实际的文件名。您不是这样做的。函数仅定义一段代码,并且可以有一个输入参数,在您的情况下,它是图像名称。然后,当您使用t时在他的函数中,您可以提供一个实际的图像名称。@EugeneS您是对的。我已经纠正了我的错误,但是我必须犯另一个错误,因为它没有单击任何一个实例。如何使用(buttonx.image)(buttony.image)实际查看该代码?我认为该示例并不完全符合您的情况。但是,了解该想法很有用。请查看我下面的答案,看看这是否能让它更清楚。我不知道for:但正在阅读它。我在理解result in中的“result”时遇到了问题:".for的
只是一个循环。在这一行中,您迭代了由
findAll
找到的一组模式。对于每个循环周期,您都会得到下一个可用模式。我又添加了一行
高亮显示的
示例。这可能有助于您更好地理解逻辑。好的,我可以让它只单击在show online,但前几天其中一台服务器显示为在线,连接失败。我不知道它在多长时间后重新加载主菜单并出现连接错误。因此,是否可以告诉它单击其中一台在线服务器,然后等待游戏加载或连接失败屏幕,如果连接失败,然后单击下一个打开实例行?现在只需找到所有实例,然后单击它们所在的位置,即使它从单击第一个服务器时消失。@MinisterOak您将不得不考虑一个对您有意义的策略。查看我的编辑。非常感谢您的帮助。这真的帮助了我。
def waitForGameToLoad():
    # Wait sufficienttime and verify that the game has been actually successfully started

def isGameLoaded():
    # Just and exmaple of another function that can be used internally inside waitForGameToLoad

def getNextAvailableServer():
    # Get next available server from a list that you have previously created
availableServersList = getAvailableServers() # getAvailableServers is a function that you will have to implement yourself

while True:
    connectServer(availableServersList)

    if connected():
        break