minhui study

게임 메크로 python (1to50 ) 본문

Python/SWING study

게임 메크로 python (1to50 )

minhui 2020. 6. 2. 00:20

게임 메크로 제작하기

https://zzzscore.com/1to50/ 

 

순발력 테스트! 추억의 1부터50까지

손은 눈보다 빠르다! 추억의 1부터50까지

zzzscore.com

1부터 50까지 순서대로 클릭하는 게임(위의 URL)에 대한 메크로를 제작해보자

 

사전 준비

1. selenium 설치

먼저 selenium을 설치해야 한다.

Scipts가 있는 곳으로 간 다음 pip install selenium 명령어를 통해 설치한다.

다음과 같이 입력했을 때 오류가 나지 않으면 설치가 잘 된거다.

 

selenium이란?

여러 언어에서 웹드라이버를 통해 웹 자동화 테스트 혹은 웹 자동화를 도와주는 라이브러리이다.

 

 

 

 

 

 

2. 자신의 버전 확인 후 그에 맞는 크롬 드라이버 설치

먼저 현재 자신이 쓰고 있는 크롬의 버전을 확인한다. [...] - 도움말 - Chrome 정보

그리고 아래 사이트로 가서 자신의 버전에 맞는 크롬 드라이버를 설치한다. 

 

https://sites.google.com/a/chromium.org/chromedriver/downloads 

 

Downloads - ChromeDriver - WebDriver for Chrome

WebDriver for Chrome

sites.google.com

 

 

조금 다른 2개의 코드를 짰는데 처음에 짠 코드를 살펴보자

from selenium import webdriver
driver=webdriver.Chrome('/chromedriver.exe') # 크롬 드라이버가 있는 경로
driver.get('https://zzzscore.com/1to50/') # 접속할 게임의 URL입력

number=1 # 현재 클릭해야 할 숫자

while number <= 50:   # 숫자 50까지 다 클릭할 때까지 반복한다.
    for i in range(1, 26): # 게임에서 클릭하는 숫자버튼이 총 25개 
        btn = driver.find_element_by_xpath('//*[@id="grid"]/div['+str(i)+']') # 클릭하는 숫자버튼 25개 각각의 X좌표
        if btn.text == str(number): # 만약 숫자버튼의 숫자가 현재 클릭해야 할 숫자가 같다면
            btn.click() # 숫자 버튼을 클릭한다.
            print("number "+str(number)+" clicked!")
            number += 1 # 다음으로 클릭해야할 숫자

 

게임 사이트의 코드를 살펴보자

 

보면 첫번째 숫자버튼의 text "2"는 span 태그가 아닌 div 태그에 포함되어 있다. 

그러므로 Xpath를 복사할 때 span이 아닌 div태그의 Xpath를 복사해야 한다.

 

25개의 숫자버튼의 Xpath를 확인해보니 1번째부터 25번째까지 Xpath는 다음과 같다.

 

//*[@id="grid"]/div[1] ~ //*[@id="grid"]/div[25]

 

 

 

 

line 7 : 50까지 숫자를 다 클릭해야 하므로 50을 클릭할 때까지 while문을 못 빠져나가게 한다.

line 8 : 게임화면에서 숫자버튼이 총 25개이므로 현재 클릭해야 할 숫자를 찾기 위해 for문을 이용하여 버튼 하나씩 현재 클릭하여 할 숫자와 같은 숫자를 찾아나간다.

line 9 : 각 숫자의 Xpath를 가져오기 위한 코드로 위의 25개 숫자버튼의 Xpath를 보면 알 수 있듯이 Xpath안에 숫자만 1씩 증가하므로 Xpath안에 숫자 부분만 str(i)로 표현하여 25개 숫자버튼의 Xpath을 나타낸다.

line 10 ~ 12: 만약 현재 클릭해야 할 숫자와 같은 숫자버튼을 찾으면 숫자 버튼을 클릭하고 클릭했다는 것을 알리기 위해 number n clicked!를 출력한다.

line 13 : 다음으로 클릭해야 할 숫자로 변수를 초기화시켜준다.

 

 

코드를 실행시켜보면 다음과 같이 게임이 잘 실행되고 총 19.402초가 걸린다.

 

 

 

 

여기서 시간을 좀 더 단축할 수 있는 방법이 없을까 생각을 해보았다. 

현재 이 코드에서는 항상 현재 클릭해야할 숫자를 찾기 위해 숫자 버튼이 없어져도 항상 25번을 돌기 때문에 그만큼 불필요한 연산이 발생한다. 그러므로 그 불필요한 연산을 줄이면 시간을 더 단축할 수 있을 것이다. 

26번째부터는 버튼이 하나씩 없어지는데 그에 따라 남아있는 숫자 버튼 개수만큼만 for문을 돌며 현재 클릭해야할 버튼을 찾는다면 불필요한 연산을 줄일 수 있을 것이다. 코드는 다음과 같다.

from selenium import webdriver
driver=webdriver.Chrome('/chromedriver.exe')
driver.get('https://zzzscore.com/1to50/')

num = 1
while num <= 50:
    btns = driver.find_elements_by_xpath('//*[@id="grid"]/div[*]')
    for btn in btns:
        if btn.text == str(num):
            btn.click()
            print("number "+str(num)+" clicked!")
            num += 1

무엇이 달라졌을까??

 

숫자 하나를 찾을 때마다 항상 25개의 Xpath의 숫자들와 비교해야 한다.

하지만 우리가 클릭하는 버튼의 Xpath는 //*[@id="grid"]/div[1] ~ //*[@id="grid"]/div[25]이므로 [str(i)]대신 [*]를 넣어 현재 존재하는 숫자 버튼들만 가져와 for문을 돌린다.

즉, 만약 26을 클릭해야 하는 시점부터 숫자버튼이 하나씩 줄어드는데 이때 남아있는 숫자 버튼 갯수만큼만 for문을 돌며 현재 클릭해야 하는 숫자와 같은 버튼을 찾는다.

 

결과는 다음과 같다.

 

 첫번째 코드로 실행했을 때보다 거의 절반정도 시간이 준 것을 볼 수 있다. 

 

 

 

 

https://github.com/jeongminhui99/mini/blob/master/GameMacro.py

 

jeongminhui99/mini

Contribute to jeongminhui99/mini development by creating an account on GitHub.

github.com

 

'Python > SWING study' 카테고리의 다른 글

웹 크롤링2(python)  (0) 2020.05.26
웹 클롤링(python)  (0) 2020.05.21
UP & DOWN GAME 2 (Python)  (0) 2020.04.15
Up&Down Game (python)  (0) 2020.04.07
Python 문자열 함수와 리스트 함수  (1) 2020.04.07
Comments