미국 공학박사의 코딩 연구소

간단한 로봇 게임 만들기

간단한 로봇 게임을 만들어 볼까해요. 키보드의 특정키를 누르면, 원하는 대로 로봇을 움직일 수 있는 게임이예요.
로봇에게 명령을 내리기 위해서 While 루프를 공부하고, 무한루프를 구현해 볼거랍니다.


강의들은 모두 무료입니다. 단, 저작권은 키클 코딩랩 에 있으며, 무단 복제 및 배포를 엄금합니다.
이를 어길 시, 본 사이트의 서버가 미국에 있으므로, 미국법에 의해 처벌될 수도 있습니다.




키보드 입력을 위한 함수 작성

세상에는 많은 게임들이 있고, 대부분의 게임들에서 발견되는 공통적인 것이 하나 있지요? 바로, 우리가 키보드로 명령을 내리면, 로봇이나 비행기 등 화면 속의 어떤 물체가 움직인다는 것이지요.
우리도 그렇게 명령을 내리고, 또 로봇이 명령에 따라 움직이는 간단한 게임을 만들어 볼까해요.
키보드로 명령을 내리면, figure에 있는 로봇이 명령을 받은대로 움직일 거랍니다.

자, 원하는 폴더에 새로운 Python파일을 만들고, "lec9_keyboard_game.py"라고 파일 이름을 지어 보지요.
먼저 사용할 라이브러리들부터 선언하고, 키보드에서 무슨키가 눌렸는지 리턴해 주는 함수 작성할 거랍니다.
아래 줄1~2와 같이 Matplotlib의 pyplot객체와 Numpy를 각각 plt와 np라는 별명으로 import해보세요.
그리고, 줄3에서 sys, termios, tty라는 세가지의 새로운 라이브러리를 import하는데요. 이것들은 키보드에서 어떤 키가 눌렸는지 알기 위한 함수를 코딩할 때, 사용할 거랍니다.

위 줄5~줄10까지가 바로 무슨키가 눌렸는지 알아내서 리턴하는 함수예요.
그런데, 이 함수를 설명하기에는 우리가 지금까지 공부한 내용들 외에 알아야 할 것들이 너무 많고, 이번 강의의 초점은 While 루프(Loop)이기 때문에 일단 넘어가는 것으로 할게요.
지난 강의 주식 분석의 기본인 이동 평균선 만들기에서 공부했듯이, 함수를 작성하기 위해 def키워드를 썼고, 줄10에서 무슨키인지 리턴하고 있다는 것만 확인하세요.
그리고, 그냥 위 코드를 따라서 작성해 보세요.




While 루프 공부하기

이제, 아래와 같이 조금 더 코딩을 해보지요.
줄12에서는 지난 강의처럼 구분선을 넣었는데요. 그 이유가 기억이 안난다면, 여기로~!

줄14~줄20은 강의 무작위 방향으로 로봇 움직이기에서 이미 해봤던 코드예요.
줄14에서는 로봇의 시작 위치 좌표를 (0, 0)으로 정하는것이구요. 줄 15에서는 로봇의 이동방향을 (x, y)좌표를 이용해서 정하고 있는 것이지요. 즉, 오른쪽([1, 0]), 위쪽([0, 1]), 왼쪽([-1, 0]), 아래쪽([0, -1]), 네 방향의 이동방향을 정하는 것이지요. 조금 더 자세한 설명이 필요하면, 여기로 오세요.
우리의 키보드 명령에 따라 움직이는 로봇을 figure에서 보여줄거라 했지요?
그래서, 줄17과 줄18에서 x축과 y축의 범위를 정하고 있구요.
줄20에서는 figure를 생성하고 있답니다.

이제, 우리가 내리는 키보드 명령을 항상 확인하기 위해서 "무한루프"라는 것을 코딩할 거예요. 로봇은 우리가 언제 키보드로 명령을 내릴지 모르겠죠? 그래서, 로봇 입장에서는 단 한순간도 빼놓지 않고, 내려온 키보드 명령이 없나 확인을 해야 한답니다. 그리고, 그것은 무한루프를 통해서 가능하게 되는 것이지요.
무한루프를 구현하기 위해서 우리는 While 루프(Loop)를 사용할 거예요.

[문법] While Loop

무한루프가 무엇인지, while 문으로 어떻게 구현할 수 있는지 이해가 되었나요?
그렇다면, 영원히 돌게 되어 있는 무한루프. 이 무한루프를 빠져나오는 법은 무엇일까요?
바로 break를 사용하면 된답니다.

[문법] break




무한루프로 키보드 명령 받기

이제 무한루프를 이용하여 어떤 키보드 명령이 내려지는지 항상 감시하는 코딩해 볼게요.
먼저, 아래 줄22~줄28에 코드들이 추가되었어요.

줄22에서는 무한루프를 만들고 있지요. 조건이 True(참)이기 때문에, 이제 이 루프는 별도의 탈출 코드가 있지 않는 한, 영원히 반복해서 돌게 될거랍니다.
줄23~줄28은 강의 무작위 방향으로 로봇 움직이기에서 로봇을 동영상으로 보여주기 위해 이미 작성해봤던 코드예요.
즉, 줄23에서는 figure를 깨끗이 지우고 있구요.
줄24에서는 로봇의 가장 최근 위치를 파랑색 마커로 보여주지요.
줄25에서는 로봇이 지금까지 지나온 경로를 파란선으로 보여주고 있구요.
줄26~줄27은 그래프의 축 범위를 정하고, 줄28에서는 0.01초 동안 잠시 멈추고 있지요.

그럼, 이제 아래 줄30~줄41처럼 키보드 명령을 처리하는 코딩을 해보지요.
명령을 먼저 정하지요. 즉, 'i'를 누르면 위로, 'j'를 누르면 왼쪽으로, 'k'를 누르면 아래쪽으로, 'l'을 누르면 오른쪽으로 가라는 명령인 것으로 정할게요. 그리고, 'q'를 누르면, 게임을 끝내라는 명령인 것으로 할게요.

줄30에서는 명령(이동방향)의 종류를 저장하는 변수 idx_move를 0으로 초기화 하고 있어요.
줄31에서 키보드 명령을 받고 있는데요. 앞서 줄5~줄10에서 작성한 getKey()함수를 이용하고 있지요. 변수 key에는 키보드에서 눌린 키가 무엇인지 저장이 된답니다. 즉, 'i'를 누르면 key는 'i'를 저장하고 있게 되지요.
줄32~줄33에서는 변수 key가 가지고 있는 값이 문자 'l'과 같다면, 첫번째 이동방향인 오른쪽을 명령받은 것으로 인식하는 것이죠.
줄34~줄35는 위쪽('i'키), 줄36~줄37은 왼쪽('j'키), 줄38~줄39는 아래쪽('k'키) 이동 명령을 인식하는 것이랍니다.
줄40~줄41은 변수 key가 'q'를 가지고 있을 때, 무한루프를 탈출하기 위해 break를 코딩하고 있답니다.
한가지 중요한 점 언급할게요. If문의 조건에서 문자를 표시할 때, 'a'나 'e'처럼 홑따옴표(')를 사용했다는 것이예요. 보통 수를 표시할 때는 그냥, 3이나 14 등과 같이 숫자만 표시했는데, 문자는 다르다는 점 잊지 마세요!

이제 마무리 코딩을 해 볼까요?
아래 줄43~줄54에 추가 코드들이 있는데요. 역시나 강의 무작위 방향으로 로봇 움직이기에서 로봇을 동영상으로 보여주기 위해 이미 작성해봤던 코드들이지요?
이렇게 코딩을 공부해 가다 보면, 이미 작성해 봤던 코드나 기법들을 재사용할 수 있는 경우가 많답니다. 게임으로 생각하면, 자신만의 코딩 아이템들을 획득해 가는 것이고, 나중에 필요할 때마다 그 아이템들을 꺼내어 사용하는 것이죠.

줄43에서는 x좌표를 명령된 방향으로 이동하는 코드예요. coord[-1, 0]은 가장 마지막 혹은 최근/현재 로봇의 x좌표를 의미해요. 왜냐하면, 줄54에서 설명하겠지만, 로봇이 지나간 위치 좌표를 coord의 새로운 행으로 추가할 것이거든요. 인덱스 번호에서 -1은 가장 마지막 요소를 의미하지요? move[idx_move, 0]은 move 행렬에서 idx_move를 인덱스 번호로 갖는 행의 첫 번째 열에 있는 값을 의미하구요. coord[-1, 0]에 move[idx_move, 0]를 더하면, 현재 로봇의 위치를 선택된 방향의 x좌표를 이동하는 것이 되지요. (조금 더 자세한 설명이 필요하면, 무작위 방향으로 로봇 움직이기에 가보세요.)
줄44는 줄43과 똑같은데, x좌표가 아닌 y좌표를 대상으로 한 것이죠. 그래서, coord[-1, 1]과 move[idx_move, 1]에서 인덱스 번호 0대신 1을 사용한 것이랍니다.
줄45~줄52에서는, 이동한 로봇의 위치가 앞서 정해 놓은 x축과 y축의 범위를 벗어날 경우, 최소값 혹은 최대값으로 교체하고 있어요. 이렇게 하는 이유는, 로봇이 정해 놓은 범위를 벗어나서 우리가 figure상에서 못보게 되는 것을 방지 하기 위함이예요.
줄54에서는 Numpy의 append()함수를 사용해서, 새로운 로봇의 위치 좌표를 coord에 새로운 행으로 추가하는 코드예요.

이제 Python파일을 저장하고, 터미널에서 "python3 lec9_keyboard_game.py"로 실행해 보세요. 실행하는 방법에 대해서 복습이 필요하면 여기로 가보세요.
실행하면, 아래와 같이 실행 명령을 타이핑했던 터미널 창 위에 figure창이 생성되지요?
이렇게 제일 위에 놓여진 창을 활성화(activated)되었다고 하는데요. Figure창이 활성화되면, 키보드 명령을 내릴 수가 없답니다. 그래서 터미널 창을 다시 활성화 상태로 바꿔야 하는데요. 아래 보이는 화살표 표시 처럼, 터미널 창을 마우스 왼쪽버튼 클릭하면 활성화 상태가 된답니다.

그리고, 'i', 'j', 'k', 'l' 키들을 누르면, figure 창에 움직이는 로봇이 보일 거예요. 로봇 게임을 멈추고 싶다면, 'q'를 눌러서 무한루프 탈출해야 하는 것 잊지 마세요!

이번 강의에서 공부한 while 문을 이용한 무한루프는 실제로 많은 경우에 사용된답니다.
우리가 만들어 본 것처럼, 게임에서도 사용되구요. 실제 대학이나 연구소에서 로봇 연구/개발 시, 로봇이 사람의 명령을 기다리게 할 때에도 사용한답니다. 물론, 저도 로봇에게 명령을 내리는 프로그램을 작성할 때, 무한루프를 사용하고 있지요.

강의에서 작성된 소스 코드 (source code)를 다운받으려면, 다음 링크를 클릭하세요: 소스 코드 다운로드
혹시, 이해가 잘 안되는 부분에 대한 질문이 있거나 다루어 줬으면 하는 주제가 있으면, 화면 오르쪽 하단에 "질문하기" 버튼을 이용해 주세요.






발자취

2019-09-11 "키클 코딩랩 - 미국 공학박사 아빠의 코딩 연구소"로 이름 변경
2019-06-28 코딩 교실 공개
2019-03-18 코딩 교실 제작 시작

바로가기
Python 배움터
C/C++ 배움터
About
Contact
Privacy Policy
강의목록
질문하기
처음으로