返回

解决《军团要塞 2》游戏模式自动化 Python 脚本中的无限循环问题

python

自动化《军团要塞 2》游戏模式的 Python 脚本:解决无限循环问题

前言

身为经验丰富的程序员和技术作家,我曾多次遇到这样一个问题:编写一个 Python 脚本来自动化一款游戏中特定模式,但脚本无法循环执行所有步骤并重新开始该过程。经过一番探索,我找到了解决此问题的有效方法,在此分享给大家。

循环中缺少重新启动机制

脚本中每个循环单独运行,没有机制重新启动循环。要解决此问题,需要将所有循环封装在一个主循环中,并在循环中添加一个条件来检查循环是否已完成。

while True:
    # 循环代码
    if 循环完成:
        break

修改后的代码

from pyautogui import *
import pyautogui
import time
import keyboard
import pyscreeze

pyscreeze.USE_IMAGE_NOT_FOUND_EXCEPTION = False

# Region
regiao_inc = (522, 611, 656,724)
region_dif = (908,657, 1005,735)
region_map = (0,0, 1365,767)
region_mapdif = (381,223, 511,353)
region_modedif = (846,255, 985,399)
region_ok = (612,114, 753,245)
region_house = (1081,399, 1156,500)
region_sniper = (1041,368, 1107,442)
region_alch = (1102,351, 1167,427)
region_start = (1278,700, 1336,749)
region_cliq = (649,85, 709,154)
region_reload = (470,563, 550,643)

# Values
inc_pos = None
dificulty_select = None
map_selector = None
map_dif = None
mode_dif = None
okvar = None
house = None
sniper = None
alchemist = None
startthis = None
cliq = None
reload = None

# 主循环
while True:
    # 点击开始按钮
    while inc_pos is None:
        inc_pos = pyautogui.locateOnScreen('imagens/inc.png', region=(regiao_inc), confidence=0.7)     
        if inc_pos is not None:
            pyautogui.moveTo(600,665)  
            pyautogui.click() 
            time.sleep(0.2)
            break 
        else:
            continue
                    
    # Selelect dificulty of maps
    while dificulty_select is None:
        dificulty_select = pyautogui.locateOnScreen('imagens/mapinf.png', region=(region_map), confidence=0.7)
        if dificulty_select is not None:
            pyautogui.moveTo(989,406)
            time.sleep(0.2)
            break
        else:
            pyautogui.moveTo(950,703)
            pyautogui.click()
            time.sleep(0.2)
            continue

    # Map selector
    while map_selector is None:
        map_selector = pyautogui.locateOnScreen('imagens/mapinf.png', region=(region_map), confidence=0.7)
        if map_selector is not None:
            pyautogui.moveTo(989,406)
            pyautogui.click()
            time.sleep(0.2)
            break
        else:
            continue

    # Select map dificulty 
    while map_dif is None:
        map_dif = pyautogui.locateOnScreen('imagens/mapdif.png', region=(region_mapdif), confidence=0.7)
        if map_dif is not None:
            pyautogui.moveTo(450,295)
            pyautogui.click()
            time.sleep(0.2)
            break
        else:
            continue

    # Select dificult mode of the map
    while mode_dif is None:
        mode_dif = pyautogui.locateOnScreen('imagens/modedif.png', region=(region_modedif), confidence=0.7)
        if map_dif is not None:
            pyautogui.moveTo(914,327)
            pyautogui.click()
            time.sleep(0.2)
            break
        else:
            continue
                
    # Click OK button
    while okvar is None:
        time.sleep(1.0)
        okvar = pyautogui.locateOnScreen('imagens/okball.png', region=(region_ok), confidence=0.9)
        if okvar is not None:
            pyautogui.moveTo(685,541)
            pyautogui.click()
            time.sleep(0.4)
            break
        else:
            continue

    # Put house and upgrade it
    while house is None:
        keyboard.press_and_release('k')
        pyautogui.moveTo(1125,475)
        time.sleep(1.0)
        pyautogui.click()
        time.sleep(0.5)
        pyautogui.click()
        time.sleep(0.5)
        house = pyautogui.locateOnScreen('imagens/house.png', region=(region_house), confidence=0.7) 
        if house is not None:
            pyautogui.moveTo(1125,475)  
            time.sleep(0.5)
            keyboard.press_and_release(';')
            time.sleep(0.2)
            keyboard.press_and_release(';')
            time.sleep(0.2)
            keyboard.press_and_release(',')
            time.sleep(0.2)
            keyboard.press_and_release(',')
            time.sleep(0.2)
            keyboard.press_and_release('esc')
            time.sleep(0.2)
            break
        else:
            continue

    # Put sniper
    while sniper is None:
        keyboard.press_and_release('z')
        pyautogui.moveTo(1082,430)
        time.sleep(1.0)
        pyautogui.click()
        time.sleep(0.5)
        pyautogui.click()
        time.sleep(1.0)
        sniper = pyautogui.locateOnScreen('imagens/sniper.png', region=(region_sniper), confidence=0.7) 
        if sniper is not None:
            pyautogui.moveTo(1082,430)  
            time.sleep(0.5)
            keyboard.press_and_release(';')
            time.sleep(0.2)
            keyboard.press_and_release(';')
            time.sleep(0.2)
            keyboard.press_and_release(';')
            time.sleep(0.2)
            keyboard.press_and_release(';')
            time.sleep(0.2)
            keyboard.press_and_release('.')
            time.sleep(0.2)
            keyboard.press_and_release('.')
            time.sleep(0.2)
            keyboard.press_and_release('esc')
            time.sleep(0.2)
            break
        else:
            continue     

    # Put alchemist
    while alchemist is None:
        keyboard.press_and_release('f')
        pyautogui.moveTo(1134,419)
        time.sleep(1.0)
        pyautogui.click()
        time.sleep(0.5)
        pyautogui.click()
        time.sleep(1.0)
        alchemist = pyautogui.locateOnScreen('imagens/alch.png', region=(region_alch), confidence=0.7) 
        if alchemist is not None:
            pyautogui.moveTo(1134,419)  
            time.sleep(0.5)
            keyboard.press_and_release(',')
            time.sleep(0.2)
            keyboard.press_and_release(',')
            time.sleep(0.2)
            keyboard.press_and_release(',')
            time.sleep(0.2)
            keyboard.press_and_release(',')
            time.sleep(0.2)
            keyboard.press_and_release('.')
            time.sleep(0.2)
            keyboard.press