python 有没有一种方法可以找出或语句中为真的特定语句?

jfgube3f  于 2023-10-14  发布在  Python
关注(0)|答案(1)|浏览(110)

我在www.example.com上为aim trainer测试创建了一个机器人humanbenchmark.com,我正在努力提高它的速度。目前,我已经定义了一个函数,可以对屏幕进行截图,然后扫描目标图像并单击。然而,为了有效地确定目标的位置,我需要检查三个不同像素的颜色,看看它们是否与背景颜色不同。当这样做时,我有3个不同的if语句,我想知道是否可以将if语句合并合并为1个if语句和2个or语句。可能有一个更有效的方法来完成这一切,但这是我能想到的最好的方法。代码有点难以阅读,因为我试图定义函数的一般用途,而不仅仅是这个特定的用途,但它并不可怕。

def scan(colors, width, height, start_x=66, start_y=231, stop_x=1900, stop_y=838):
    im = auto.screenshot('C:\\Windows\\Temp\\screenshot.png')
    coordinates = []
    additive = round((height / 2), 0)
    x_range = stop_x - start_x
    y_range = stop_y - start_y
    for x in range(0, math.ceil((x_range / width))):
        for y in range(0, math.ceil((y_range / height))):
            pixel_1 = im.getpixel((((width * x) + start_x), (start_y + (height * y))))
            pixel_2 = im.getpixel((((width * x) + start_x), (start_y + (height * (y + 1)))))
            pixel_3 = im.getpixel((((width * x) + start_x), (additive + start_y + (height * y))))
            for i in range(0, len(colors)):
                if pixel_1 == colors[i]:
                    location_x = (width * x) + start_x
                    location_y = (height * y) + start_y
                    coordinates.append(location_x)
                    coordinates.append(location_y)
                    break
                if pixel_2 == colors[i]:
                    location_x = (width * x) + start_x
                    location_y = (height * (y + 1)) + start_y
                    coordinates.append(location_x)
                    coordinates.append(location_y)
                    break
                if pixel_3 == colors[i]:
                    location_x = (width * x) + start_x
                    location_y = (height * y) + start_y + additive
                    coordinates.append(location_x)
                    coordinates.append(location_y)
                    break
    return coordinates[0], coordinates[1]

这是我想要的能力

def scan(colors, width, height, start_x=66, start_y=231, stop_x=1900, stop_y=838):
    im = auto.screenshot('C:\\Windows\\Temp\\screenshot.png')
    coordinates = []
    additive = round((height / 2), 0)
    x_range = stop_x - start_x
    y_range = stop_y - start_y
    for x in range(0, math.ceil((x_range / width))):
        for y in range(0, math.ceil((y_range / height))):
            pixel_1 = im.getpixel((((width * x) + start_x), (start_y + (height * y))))
            pixel_2 = im.getpixel((((width * x) + start_x), (start_y + (height * (y + 1)))))
            pixel_3 = im.getpixel((((width * x) + start_x), (additive + start_y + (height * y))))
            for i in range(0, len(colors)):
                if pixel_1 == colors[i] or pixel_2 == colors[i] or pixel_3 == colors[i]:
...
    return coordinates[0], coordinates[1]

有几个边缘情况下,这个程序不工作,但他们是罕见的足够,这是不值得的效率损失,以占他们。
我试着把它作为一个if语句,但我无法找到一种方法来判断哪个语句是正确的。我试着把它减少到只检查一个或两个像素,但这导致了太多的情况下,它没有检测到目标和程序中断。我希望能加快程序的速度,因为目前每个函数的调用需要200毫秒。

dxxyhpgq

dxxyhpgq1#

您可以在测试时使用walrus运算符来分配变量

pixel = None
if (pixel_1 == colors[i] and (pixel := 1)) or (pixel_2 == colors[i] and (pixel := 2))  or (pixel_3 == colors[i] and (pixel := 3)):
    location_x = (width * x) + start_x
    if pixel == 1:
        location_y = (height * y) + start_y
    elif pixel == 2:
        location_y = (height * (y + 1)) + start_y
    else:
        location_y = (height * y) + start_y + additive
    coordinates.append(location_x)
    coordinates.append(location_y)
    break

相关问题