본문 바로가기
IT 전산/개발

파이썬으로 메이플 랜드 게임의 자동 물약 사용 기능 만들기

by 멍뭉부 2024. 1. 16.
728x90

안녕하세요,

파이썬을 사용하여 메이플 랜드 게임에서 체력과 마력을 자동으로 회복하는 물약 사용 기능을 만들어보았습니다.

제가 파이썬을 처음 사용해보기도 하고 요즘 시작하는 게임이기 때문에 연습하기에 괜찮은 것 같아서 만들게 되었습니다.

게임이나 업무 자동화에 대한 기본적인 이해를 돕기 위한 좋은 예제가 될 수 있습니다.

다만, 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초마다) 출력합니다.

 

주의 사항

  • 이 스크립트는 학습 목적으로만 사용하시길 바랍니다. 게임의 공정한 플레이 환경을 위반하지 않도록 주의해주세요.
  • 게임 자동화 스크립트의 사용은 해당 게임의 이용 약관에 위배될 수 있으며, 계정 정지 등의 위험이 있습니다.
    (이 부분은 주의해주시고, 저와 같이 연습용 혹은 참고용으로만 사용해주시기 바랍니다.)
  • 스크립트 실행 중에는 컴퓨터의 제어가 스크립트에 의해 이루어지므로, 주의해서 사용해야 합니다.

마치며

별건 아니지만 앞으로 업무에서도 업무 자동화 연습하는데에 연습이 되었던 것 같습니다.
물론 저 간단한 것도 부족한 부분이 많습니다.

무엇보다 중복된 코드를 어떻게 간결하게 할지 고민도 해봤는데, 아직 그정도 레벨까지는 아닌 것 같습니다.

메이플랜드를 제가 얼마나 할진 모르겠지만, 추억의 게임이니 잘되었으면 합니다 !! 

728x90