개발 과정
파이썬을 입문한 지 얼마 안 된 초보입니다. 최근에는 강화 학습에 빠져 이것저것 해보면서 공부하고 있습니다. 유튜브와 블로그를 보면서 공룡 게임에 여러 방법으로 자동화하는 것을 보았습니다. 공룡 게임에 강화 학습을 적용해 보면 어떨까 싶어 만들어 보았습니다. 1단계로 장애물 위치 파악입니다.
환경 설정
사이트에 들어가면 바로 실행할 수 있습니다. 이 코드에 적용하려면 창을 왼쪽 위에 붙이고 반으로 나눠주면 됩니다. Trex_game에 이미지도 첨부해 놓아서 그대로 사용하시면 됩니다.
코드
import numpy as np
import cv2
import keyboard
import mss
template_list = []
'''for i in range(10):
template_list.append(str(i))'''
template_list.extend(str(i) for i in range(10))
template_list.extend(['bird1', 'bird2', 'cactus1', 'cactus2', 'return'])
template = []
template_hight = []
template_width = []
res = []
threshold = 0.90
loc = []
window = {"top": 320, "left": 160, "width": 800-160, "height": 480-320}
mss = mss.mss()
for i, template_name in enumerate(template_list):
template.insert(i, cv2.imread('images/%s.png' % template_name, 0))
template_hight.insert(i, template[i].shape[0])
template_width.insert(i, template[i].shape[1])
while True:
test_img = np.array(mss.grab(window))
test_img = cv2.cvtColor(test_img, cv2.COLOR_RGB2BGR)
gray_test_img = cv2.cvtColor(test_img, cv2.COLOR_RGB2GRAY)
for i, template_name in enumerate(template_list):
res.insert(i, cv2.matchTemplate(gray_test_img, template[i], cv2.TM_CCOEFF_NORMED))
loc.insert(i, np.where(res[i] >= threshold))
for pt in zip(*loc[i][::-1]):
cv2.rectangle(test_img, pt, (pt[0] + template_width[i], pt[1] + template_hight[i]), (0, 0, 255), 2)
if pt[0] < 155 :
keyboard.press('space')
#keyboard.release('space')
if loc[14]:
empty_check = np.array(loc[14])
if empty_check.size != 0:
keyboard.press('space')
keyboard.release('space')
cv2.imshow('window', test_img)
cv2.waitKey(1)
코드 설명
opencv의 template matching을 사용했습니다. cv2.matchTemplate은 모니터 속 화면과 매칭될 사진이 얼마나 비슷한지 출력합니다. np.where(res[i] >= threshold)에서 일정 threshold값 이상인 곳을 찾아냅니다. 찾아낸 곳의 위치는 장애물의 위치로 파악하고 일정 위치 이하로 오면 공룡이 점프를 해 장애물을 피하는 방법입니다. 각자 조절할 값은 threshold와 pt[0]입니다. threshold값을 내리면 매칭이 여러 군데에 잡일수 있고, 너무 올리면 민감하게 반응해 잡히지 않을 수 있습니다. pt[0]는 점프 타이밍 입니다. 작게 설정하면 코앞에서 점프를 하고 높게 설정하면 장애물 멀리서 점프를 합니다. 추가적으로 게임이 끝나면 다시 게임 시작 버튼을 누르도록 했습니다.
https://opencv-python.readthedocs.io/en/latest/doc/24.imageTemplateMatch/imageTemplateMatch.html
한계점
- 속도가 빨라지면 죽습니다. 장애물의 속도는 파악할 수 없습니다. 처음 느리게 달릴때는 바로 앞에서 점프해도 되지만 속도가 붙기 시작하면 장애물이 오는걸 예측해서 한 발짝 먼저 뛰어야 합니다.
- 장애물이 붙어오면 죽습니다. 이 게임에서는 긴 점프와 짧은 점프가 있지만 여기서 긴 점프만 구현했습니다.
개선 방향
- 다른 방식의 장애물 위치 파악방법
- 짧은 점프와 긴 점프 두가지 구현
- 오른쪽 위에 점수판을 인식해 점프를 뛰었을 때 보상으로 점수를 주려 했으나, 그것 보단 점프했을 때 죽지 않으면 일정 보상을 주도록 변경
도움이 된 블로그 : https://diy-project.tistory.com/125
'프로그래밍 > 파이썬' 카테고리의 다른 글
파이참에 anaconda 가상환경 연결 방법 (0) | 2021.06.26 |
---|---|
주피터 노트북 크롬 자동 실행 (2) | 2021.06.24 |
conda 가상환경에 주피터 노트북 설치하기 (0) | 2021.06.22 |
while문 시간 측정(python) (0) | 2020.09.06 |
크롬 공룡게임 장애물 속도 파악하기(python) (0) | 2020.09.05 |
댓글