파이썬(Python)

윈도우환경에서 key를 받아들이는 모듈이 달라 termios 에러날 때 FrozenLake-v3 에러없이 실행하기!

알통몬_ 2018. 6. 11. 16:08
반응형


공감 및 댓글은 포스팅 하는데

 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 

도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 

만들어 나가겠습니다^^

 


지난 포스팅에서 OPENAI GYM 이용 시에 윈도우와 맥에서 키를 받아들이는 게 다르다는 포스팅을 했었는데요.

2018/06/07 - [파이썬(Python)] - Windows 에서 OpenAI GYM 사용 시 import termios 에러 해결 방법

맥환경에서는 termios 라는 걸 사용하고

윈도우환경에서는 msvcrt 라는 걸 사용했었는데요.

mvscrt 사용해서 게임 실행!


import gym.spaces
from gym.envs.registration import register
import msvcrt


class _Getch:
def __call__(self):
keyy = msvcrt.getch()
return msvcrt.getch()


inkey = _Getch()

LEFT =
0
DOWN = 1
RIGHT = 2
UP = 3

arrow_keys = { '\x1b[A': UP, '\x1b[B': DOWN, '\x1b[C': RIGHT, '\x1b[D': LEFT }

register(
id='FrozenLake-v3',
entry_point='gym.envs.toy_text:FrozenLakeEnv',
kwargs={'map_name': '4x4', 'is_slippery': False}
)

env = gym.make(
'FrozenLake-v3')
env.render()

while True:
key = inkey()
if key not in arrow_keys.keys():
print(arrow_keys[key])
print("Game aborted!")
break

action = arrow_keys[key]
state
, reward, done, info = env.step(action)
env.render()
print("State: ", state, "Action: ", action, "Reward: ", reward, "Info: ", info)

if done:
print("Finished with reward", reward)
break


위처럼하면 arrow_keys 부분에서 에러가 발생합니다. 

\x1b[A 이런 식으로는 윈도우에서 읽어올 수가 없더라구요.

그래서 여러 블로그를 참고해보니

각 화살표를 아래처럼 읽어옵니다.

arrow_keys = {
b'H': UP,
b'P': DOWN,
b'M': RIGHT,
b'K': LEFT
}

이렇게 해줘야 방향키가 제대로 동작합니다.


그리고 위 코드를 보시면 _Getch 클래스에서 def __call__ 함수에서

getch() 함수를 2번 호출하는데요.

그 이유는 방향키를 눌렀을 때 224 xx, 224 xx 이런식으로 읽어와서

앞에 있는 224를 거르고 뒤에 xx 만 불러오기 위함입니다.

class _Getch:
def __call__(self):
return msvcrt.getch()

이렇게만 선언하고 위 프로그램을 실행하면 에러가 발생하는 걸 확인하실 수 있습니다.


이상입니다.


반응형