[Python] 자동화 프로그램(실전편)

이번 포스팅에서는 pyautogui 모듈을 이용해서

Cookie Breaker라는 게임의 매크로를 만들어 볼 겁니다.

이 게임은 마우스를 클릭할 때마다 쿠키에게 데미지를 줘서

점점 맷집이 쎄지는 쿠키들을 물리치는 것이 목적입니다.

클릭을 하는 곳에 화살이 날아오는 방식이 아니라 클릭하기만 하면 알아서 조준사격해주는 방식이네요.

그냥 클릭만 계속 하면 느리니 중간중간에 포탑을 설치해줘서

어느정도 자동 사냥을 할 수 있게 해주고 있습니다.

이것 말고도 업그레이드 기능을 통해서

쿠키 개수나 포의 화력을 업그레이드 할 수 있죠.

 

극후반으로 갈수록 클릭에 의한 데미지보다는

이러한 자동 사냥에 의한 데미지가 세질 것이기 때문에

클릭이 별로 필요 없어질 것이지만,

초반에는 열심히 클릭을 해서 돈을 벌어야 겠죠.

클릭을 위해서 바로 이렇게 코드를 짜면 좋지 않을까요?

import pyautogui as pag
while True:
	pag.click()

단 세줄만에 간단한 매크로가 완성되었습니다.

하지만 이 매크로는 매우 위험합니다.

코드를 수행하는 즉시 무한 클릭에 돌입하기 때문이죠.

사실 이보다 더 무서운것은 끌때 끄기가 어렵다는 점 때문입니다.

마우스를 끌고 중지 버튼 위에 올려 놓아야만 멈출 수 있죠.

이 세줄의 과정이

1) 코드 실행

2) 무한 클릭

3) 커널 중지

로 매우 단순했다면 이것을 좀더 복잡하지만 안전하게 만들어 볼 수 있습니다.

 

바로 이렇게요.

1) 코드 실행

2) 무반응 : 코드를 실행해도 마우스를 게임창에 갖다 놓기 전까지 아무 동작 없음

3) F3 누름 : 시작키로 인식하여 F3을 누른 뒤부터 무한 클릭 돌입

4) 무한 클릭

5) F4 누름 : 종료키로 인식하여 F4를 누른 뒤 무한 클릭 해제 코드 종료

6) 종료

이렇게 코딩하려면 기존의 세줄의 코딩에서 몇줄만 더 추가하면 됩니다.

키를 누르는 것을 인식하기 위해 keyboard 모듈을 import 해줘야 합니다.

※ keyboard 모듈이 없다면

pip install keyboard #로 설치
import pyautogui as pag
import keyboard
while True:
    if keyboard.is_pressed('F3'): # F3 누르면
        break # while문 탈출
while True:
    pag.click() # 무한 클릭
    if keyboard.is_pressed('F4'): # F4 누르면
        break # while문 탈출

코드 실행 후 첫번째 while문에 걸리기 때문에 무반응 상태로 만들 수 있죠.

그리고 if문을 써서 F3이 눌린 경우에만

이 while문을 빠져나갈 수 있도록 코딩을 해주면 됩니다.

두번째 while문에서 무한 클릭을 해주게끔 하면 되죠.

그리고 F4라 눌린게 감지되면 반복문을 빠져나와 코드가 종료되게 됩니다.

 

그런데 이 게임을 하다보면 클릭만 해서 되는게 아니라 중간중간에 포대를 설치를 해주는 작업이 필요합니다. 그럴땐 오토클릭 매크로를 중지한 상태로 작업을 해야겠죠.

이런 작업을 중간중간에 하고나면 다시 오토클릭 모드로 돌아가서 열심히 클릭해야합니다.

그래서 아까 매크로를 계속 쓴다 치면 코드를 실행하고 끄고를 반복해야 하기 때문에 번거로움이 다소 있습니다. 매크로를 아예 끄는 것이 아니라 오토클릭을 잠시 멈출수 있는 일시정지 버튼이 있다면 참 좋겠죠.

일시정지 기능을 바로 만들어 보겠습니다. 두번째 while문에서 코드를 약간 추가해 볼게요. F6를 누르면 대기상태로 만들어버리면 됩니다. 당연히 대기상태에서 빠져나올 수 있게 안에다가 F3을 감지한 경우 탈출할 수 있도록 코드를 작성하면 됩니다. 간혹 F6를 인식 못 하는 경우가 있는데 그럴땐 버튼을 꾹 누르고 있으면 됩니다. (인식할때까지)

import pyautogui as pag
import keyboard
while True:
    if keyboard.is_pressed('F3’): # F3 누르면
        break # while문 탈출
while True:
    if keyboard.is_pressed(‘F6’): # F6 누르면
        while True:
            if keyboard.is_pressed('F3’): # F3 누르면
                break # while문 탈출
    pag.click() # 무한 클릭
    if keyboard.is_pressed('F4’): # F4 누르면
        break # while문 탈출

 

이런식으로 편리하게 매크로를 사용할 수가 있네요.

하지만 이 매크로는 어떤 상태(자동클릭인지, 일시 정지인지, 꺼진건지)에 진입했는지 확인이 어렵습니다.

그래서 여기서 고급기능을 추가해서 넣으려고 합니다.

 

바로 Sound 기능이죠.

각 모드로 진입할 때 스피커로 소리를 내주게 할 겁니다.

 

Beep 함수를 써볼게요.

1) F3(시작, 재개)을 누를 때 '도미솔' 소리 나게 하기

from winsound import Beep
Beep(524,200) # 도
Beep(659,200) # 미
Beep(784,200) # 솔

2) F6(일시정지)을 누를 때 '솔파' 소리 나게 하기

Beep(784,200) # 솔
Beep(698,200) # 파
3) F4(종료)을 누를 때 '솔파미레도' 소리 나게 하기
Beep(659,200) # 미
Beep(587,200) # 레
Beep(524,200) # 도

각 모드에 진입하도록 이 코드를 다 집어 넣으면 아래와 같이 코드가 완성됩니다.

import pyautogui as pag
import keyboard
from winsound import Beep
while True:
    if keyboard.is_pressed('F3'):
        Beep(524,200)
        Beep(659,200)
        Beep(784,200)
        break
while True:
    if keyboard.is_pressed('F6'):
        Beep(784,200)
        Beep(698,200)
        while True:
            if keyboard.is_pressed('F3'):
                Beep(524,200)
                Beep(659,200)
                Beep(784,200)                
                break
    pag.click()
    if keyboard.is_pressed('F4'):
        Beep(784,200)
        Beep(698,200)
        Beep(659,200)
        Beep(587,200)
        Beep(524,200)        
        break