본문 바로가기
프로그래밍/파이썬

크롬 공룡게임 장애물 속도 파악하기(python)

by 조이써니 2020. 9. 5.
반응형

환경 설정

사이트에 들어가면 게임을 실행할 수 있습니다. 게임 창을 왼쪽에 붙여 분할해서 진행하시면 됩니다.

https://elgoog.im/t-rex/

 

T-Rex Run! - Chrome Dinosaur Game

Chrome Dino (also known as T-Rex Game, or the NO INTERNET GAME) is one of the hidden Google games which originally can only be activated when you are offline with Chrome browser. Today this game can be played unblocked.

elgoog.im

코드

import numpy as np
import cv2
import mss
import time

window_loc = [250, 420, 800, 470]
camera_loc_1 = (650, 420)
camera_loc_2 = (450, 420)
window = {"top": window_loc[1], "left": window_loc[0], "width": window_loc[2] - window_loc[0], "height": window_loc[3] - window_loc[1]}
mss = mss.mss()
detect_in_1 = 0
detect_in_2 = 0
detect_number_1 = 0
detect_number_2 = 0
detect_object_time_1 = []
detect_object_time_2 = []
time_interval = 0


while True:

    test_img = np.array(mss.grab(window))
    gray_img = cv2.cvtColor(test_img, cv2.COLOR_RGB2GRAY)

    camera_image_1 = gray_img[:, camera_loc_1[0] - window_loc[0]:camera_loc_1[0] - window_loc[0] + 50]
    camera_image_2 = gray_img[:, camera_loc_2[0] - window_loc[0]:camera_loc_2[0] - window_loc[0] + 50]

    detection_value_1 = 2500 - np.sum(camera_image_1) / 255
    detection_value_2 = 2500 - np.sum(camera_image_2) / 255


    if detection_value_1 > 180 and detect_in_1 == 0:
        detect_number_1 += 1
        print('1번 카메라 %d번째 장애물 포착' % detect_number_1)
        detect_in_1 = 1
        detect_object_time_1.append(time.time())

    if detection_value_1 < 180 and detect_in_1 == 1:
        detect_in_1 = 0

    if detection_value_2 > 180 and detect_in_2 == 0:
        detect_number_2 += 1
        detect_in_2 = 1
        detect_object_time_2.append(time.time())
        time_interval = detect_object_time_2[0] - detect_object_time_1[0]
        print('2번 카메라 %d번째 장애물 포착, 속도 = ' % detect_number_2, time_interval)
        detect_object_time_1.pop(0)
        detect_object_time_2.pop(0)

    if detection_value_2 < 180 and detect_in_2 == 1:
        detect_in_2 = 0


    cv2.rectangle(test_img, (camera_loc_1[0] - window_loc[0], camera_loc_1[1] - window_loc[1]),
                  (camera_loc_1[0] - window_loc[0] + 50, camera_loc_1[1] - window_loc[1] + 50), (0, 0, 255), 1)
    cv2.rectangle(test_img, (camera_loc_2[0] - window_loc[0], camera_loc_2[1] - window_loc[1]),
                  (camera_loc_2[0] - window_loc[0] + 50, camera_loc_2[1] - window_loc[1] + 50), (0, 0, 255), 1)

    cv2.imshow('window', test_img)
    cv2.waitKey(1)

코드 설명

1. 장애물 포착 : 각 카메라의 영역에 값을 받아와 장애물(검은 픽셀)이 일정 값(여기서는 180)보다 많으면 카메라가 장애물을 인식합니다. 인식한 순간에 시간을 detect_object_time_1,2 리스트에 담아 둡니다.

 

2. 장애물 속도 측정 : detect_object_time_1,2에 담겨있는 시간차로 속도를 측정합니다. 속도를 측정하고 난 후 pop함수를 이용해 detect_object_time_1,2 리스트에서 삭제해줍니다. 속도를 측정하는 이유는 2번 카메라가 장애물을 인식하는 순간 속도측정이 되므로 공룡의 최적 점프 시간을 알 수 있습니다. 

 

실행결과

 정상적으로 장애물 포착과 속도 측정이 됩니다. 속도 측정은 2번 카메라에서 포착된 즉시 1번 카메라 포착 시간을 빼주어야 하기 때문에 2번 카메라가 포착하면 속도 측정이 완료됩니다. 4번째 장애물과 5번째 장애물은 붙어 나와 2번 카메라에 닿기 전에 1번 카메라에 두 장애물이 측정된 것입니다. 리스트를 활용했기 때문에 2번 카메라에 4,5번째 장애물이 연달아 나와도 순차적으로 계산이 됩니다.

 

한계점

- 아직 짧은 점프는 구현하지 못했습니다.

 

개발 방향

- 시간 측정 후 최적의 점프 시간을 손으로 구할 수 있지만, 제가 공부하고 있는 강화학습을 사용해 최적의 점프 시간을 구하는 것이 목적입니다.

- 장애물 간의 거리를 측정해 짧은 점프와 긴 점프를 구현해야 합니다. 나중에 강화학습에 적용할 때 상태 값을 어떻게 집어넣어야 할지 고민 좀 해야겠습니다.

 

느낀 점

제가 너무 얕봤나 봅니다. 처음에는 재밌지만 오류가 발생했을 때 흥미를 잃고 다른 것을 하고 싶었습니다. 하지만 가장 단순한 것도 못하면 나중에 큰 것을 못한다는 생각이 들었습니다. 크롬 공룡 게임 강화 학습 적용을 반드시 하겠습니다.

 

참고자료 : https://sites.google.com/view/dailycoding00/main/chrome_dino?authuser=0

반응형

댓글