返回
解决《军团要塞 2》游戏模式自动化 Python 脚本中的无限循环问题
python
2024-03-21 07:06:40
自动化《军团要塞 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