반응형
안녕하세요,
파이썬을 사용하여 메이플 랜드 게임에서 체력과 마력을 자동으로 회복하는 물약 사용 기능을 만들어보았습니다.
제가 파이썬을 처음 사용해보기도 하고 요즘 시작하는 게임이기 때문에 연습하기에 괜찮은 것 같아서 만들게 되었습니다.
게임이나 업무 자동화에 대한 기본적인 이해를 돕기 위한 좋은 예제가 될 수 있습니다.
다만, OCR(광학 문자 인식) 부분이 제대로 인식이 되지 않아서, 이에 대한 예외 처리를 어떻게 할까 하다가 시간이 좀 걸리긴했네요 ㅜㅜ
필요한 파이썬 모듈
- pytesseract: OCR을 위한 라이브러리입니다.
- PIL (Python Imaging Library): 이미지 처리를 위한 라이브러리입니다.
- pyautogui: GUI 자동화를 위한 라이브러리입니다.
- time: 지연 시간을 관리하기 위한 모듈입니다.
- re (Regular Expression): 문자열 처리를 위한 모듈입니다.
자동 물약 사용 로직
- 이 스크립트는 게임 화면에서 체력과 마력 바의 수치를 OCR을 통해 읽어들입니다.
- 체력이나 마력이 30% 미만으로 떨어졌을 때, 지정된 키를 눌러 물약을 사용하도록 설정했습니다.
- OCR에서 마력 수치를 정확히 인식하지 못하는 경우에 대한 예외 처리를 추가하였습니다.
소스코드
import pytesseract
from PIL import Image
import pyautogui
import time
import re
import pyautogui
# Tesseract-OCR 설치 경로 설정
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
while True:
# 체력 게이지가 있는 화면 영역 캡처
hpscreenshot = pyautogui.screenshot(region=(401, 978, 150, 21))
mpscreenshot = pyautogui.screenshot(region=(611, 979, 150, 20))
# 이미지에서 텍스트 추출
hp_text = pytesseract.image_to_string(hpscreenshot, config='--psm 6')
mp_text = pytesseract.image_to_string(mpscreenshot, config='--psm 6')
# 정규 표현식 수정: 다양한 오류를 포함
# 여는 괄호 대신 |, [, { 또는 공백이 인식될 수 있음
# 닫는 괄호 대신 |, ], } 또는 공백이 인식될 수 있음
# '/' 문자도 공백으로 처리될 수 있음
hpmatch = re.search(r'[|\[\({\s]?\s*(\d+)\s*[/\s]?\s*(\d+)[|\]\)}\s]?', hp_text)
mpmatch = re.search(r'[|\[\({\s]?\s*(\d+)\s*[/\s]?\s*(\d+)[|\]\)}\s]?', mp_text)
if hpmatch:
# 공백으로 분할하여 현재 HP와 최대 HP 추출
current_hp, max_hp = map(int, hpmatch.groups())
# 체력의 비율을 백분율로 계산
hp_percentage = (current_hp / max_hp) * 100
# 결과 출력
hpresult = f"{current_hp}/{max_hp} ({hp_percentage:.2f}%)"
print("HP:", hpresult)
# HP가 30% 미만이면 END 버튼 누르기
if hp_percentage < 30:
pyautogui.press('del')
else:
print("HP 값을 찾을 수 없음:", hp_text)
if mpmatch:
# 공백으로 분할하여 현재 HP와 최대 HP 추출
current_mp, max_mp = map(int, mpmatch.groups())
# 체력의 비율을 백분율로 계산
mp_percentage = (current_mp / max_mp) * 100
# 결과 출력
mpresult = f"{current_mp}/{max_mp} ({mp_percentage:.2f}%)"
print("MP:", mpresult)
# MP가 30% 미만이면 PageDown 버튼 누르기
if mp_percentage < 30:
if mp_percentage < 20 and str(max_mp)[0] == '4':
print("예외")
else:
pyautogui.press('end')
else:
print("MP 값을 찾을 수 없음:", mp_text)
time.sleep(1) # 1초마다 반복
터미널에서 현재 HP와 MP가 실시간으로 (1초마다) 출력합니다.
주의 사항
- 이 스크립트는 학습 목적으로만 사용하시길 바랍니다. 게임의 공정한 플레이 환경을 위반하지 않도록 주의해주세요.
- 게임 자동화 스크립트의 사용은 해당 게임의 이용 약관에 위배될 수 있으며, 계정 정지 등의 위험이 있습니다.
(이 부분은 주의해주시고, 저와 같이 연습용 혹은 참고용으로만 사용해주시기 바랍니다.) - 스크립트 실행 중에는 컴퓨터의 제어가 스크립트에 의해 이루어지므로, 주의해서 사용해야 합니다.
마치며
별건 아니지만 앞으로 업무에서도 업무 자동화 연습하는데에 연습이 되었던 것 같습니다.
물론 저 간단한 것도 부족한 부분이 많습니다.
무엇보다 중복된 코드를 어떻게 간결하게 할지 고민도 해봤는데, 아직 그정도 레벨까지는 아닌 것 같습니다.
메이플랜드를 제가 얼마나 할진 모르겠지만, 추억의 게임이니 잘되었으면 합니다 !!
반응형
'IT 전산 > 개발' 카테고리의 다른 글
[PowerApps] 파워앱스에서 파워오토메이션으로 값(변수) 전달하기 (0) | 2024.04.04 |
---|---|
[파워앱스/PowerApps] 쉐어포인트 리스트로 DB 만들기 (0) | 2024.04.03 |
윈도우에서 Tesseract OCR 설치 및 파이썬에서 활용하는 방법 (0) | 2024.01.16 |
파이썬에서 keyboard와 mouse 모듈 설치하기 (0) | 2024.01.16 |
파이썬에서 pyautogui 모듈 설치하기 (0) | 2024.01.16 |