일전에 pyautogui 모듈만 이용해서 매 30초마다 자동으로 [Replay]버튼을 클릭하는 파이썬 프로그램을 만들어서 자동전투가 되도록 해놨다. 간단하지만 단점은 전투가 언제 끝나는지 상관없이 정해놓은 시간마다 자동으로 클릭하다 보니 이따금씩 건너뛰기도 하였다. 따라서 던전에서는 못쓰고 캠페인에서만 사용했다. 이번에는 추가로 pytesseract를 사용해 보았다. pytesseract는 이미지에서 텍스트를 추출하는 데 사용한다. 이 모듈을 사용해서 스크린 화면에서 게임이 종료되는 시점을 인식하도록 만들어 볼 계획이다.
파이썬 pyautogui 초간단 매크로 : 레이드 그림자의 전설 자동 전투
레이드 그림자의 전설은 하루에 자동전투 50회를 제공하는데 턱없이 부족하다. 그래서 보통 RSL Helper라는 프로그램을 컴퓨터에 깔아서 컴퓨터로 자동전투를 한다. 파이썬 코딩 연습할 겸 초간단
fromscratch2024.tistory.com
모듈 설치하기
pyautogui, pytesseract 모듈은 파이썬에서 제공하는 Default option이 아니기 때문에 추가로 설치해줘야 한다. 윈도우 아래 검색창에 cmd를 치고 Enter, 창이 뜨면 아래와 같이 차례로 설치를 해준다.
pip install pyautogui
pip install pytesseract
추출해야 하는 텍스트 영역 지정하기
추출해야 할 텍스트는 ‘Replay’라는 글자이다. 정확도를 높이기 위해 Replay 글자 영역만 인식하도록 하는 것이 좋다.
우선 이 영역의 좌표(x 시작, y 시작, 가로, 세로)를 알아야 한다. 특정 위치의 좌표를 알고 싶다면 pyautogui 모듈의 position 메서드를 사용하면 알 수 있다. 다음과 같이 코드를 짜고 마우스를 특정 영역에 위치시킨 다음에 좌표를 알아낸다.
a, b의 좌표를 알아보자. 마우스를 a 위치, b 위치에 갖다 놓고 py.positon()을 실행한다.
a,b의 좌표를 알아보자. 마우스를 a, b 위치에 갖다 놓고 코드를 각각 실행하면 Xa, Ya, Xb, Yb 좌표를 알수 있고 (Xb-Xa), (Yb-Ya) 빼기를 하면 이 영역의 가로, 세로 높이가 나온다. 이것은 컴퓨터가 Replay라는 이미지를 text로 인식하기 위해 필요하다.
region=(1224,1406,149,62)
[Start], [Replay] 버튼 좌표 지정하기
처음 캠페인이나 던전 창을 열었을 때 [Start] 버튼의 위치와 전투가 끝나고 나서 [Replay] 버튼의 위치가 다르다. 마찬가지로 각각의 버튼의 위치를 파악한다. 마우스를 자동으로 버튼까지 끌고가서 클릭하게 만들어야 한다. 여기서 주의할 점은 마우스가 Replay라는 글자를 가리면 글자인식이 어려워지므로 Replay 영역을 벗어난 부분을 클릭하도록 해야 한다.
화면의 [Replay]버튼 인식하여 자동으로 클릭하기
[Start] 버튼을 클릭하는 코드를 짜준다.
pyautogui.click(2205, 1388) # 시작 버튼 자동 클릭
print(1) # 1(첫번째 전투)을 출력
time.sleep(5) # 5초 쉬었다가 다음 코드로 넘어감
while을 사용하여 원하는 만큼 자동전투 횟수를 지정해 준다.
count 초기값은 0이고 자동전투할 횟수(replays)를 지정해 준다.. 만약 count가 replays횟수보다 작을 경우, Replay라는 글자가 써진 화면 영역을 캡처해서 이미지를 문자(string)로 바꿔준다.
count = 0
replays = 원하는 횟수 # 추후에 유일하게 계속 바꿔줄 값이다.
while count < replays: # count 값이 replays 값보다 적을 경우 다음 코드를 반복 실행
screenshot = pyautogui.screenshot(region=(1234,1420,140,62)) # 해당 region 스크린샷
text = pytesseract.image_to_string(screenshot) # 이미지에서 text 추출
조건문 if를 사용하여 추출한 문자(string)에 Replay라는 글자가 있다면 버튼을 자동으로 클릭하도록 한다.
전투가 끝나면 [Replay]라는 버튼이 활성화될 것이다. 그럼 텍스트를 인식해서 [Replay]를 자동으로 누를 것이다.
if 'Replay' in text: # ‘Replay’라는 문자가 text에 있다면
pyautogui.click(1512,1370) # Replay(1512, 1370) 좌표를 클릭
print(count+2) # count+2를 출력함(중간에 몇 번 반복했는지 파악하기 위함)
count = count + 1 # count에 1을 더해줌
time.sleep(10) # 10초 대기
만일 스크린샷 이미지에서 ‘Replay’를 발견하지 못했다면 3초 대기하다가 다시 찾기
else: # ‘Replay’ 없다면
time.sleep(3) # 3초 대기후 다시 찾기
전체 코드는 다음과 같다.
replays = 2 로 적어놓으면 [Replay] 버튼을 2번 클릭한다는 것이다. 초기에 [Start] 버튼 누른 것까지 합하면 총 3번의 전투를 진행한 것이다.
이렇게 코드를 짜면 전투가 끝나기가 무섭게 다시 시작한다. 더 효율적인 코드가 있을지 계속 고민해 봐야겠다.