brunch

You can make anything
by writing

C.S.Lewis

by 첨물 Oct 15. 2017

사다리 타기 코딩

메모리에 저장해서 갈 것인가 아니면 센서로 찾아갈 것인가?

10월 아빠들의 코딩 모임을 동탄 토즈에서 진행했다.

4명의 아빠들... 토요일 아침에 이렇게 건전한 목적으로 아빠들이 모여 코딩 관련 열띤 토론의 모습을 생각하면 모임이 끝난 후 왠지 스스로 대견하다 생각하며 씨익 웃게 만든다.


이번 숙제는 스크래치로 사다리 타기 프로그램 만들기

1. 랜덤 하게 사다리를 긋기

2. 화살표가 길 따라가기

따식님이 위 동영상을 카톡으로 던져주고 각자 해 오라는 것이다.

숙제 검사 결과 숙제를 내 준 사람과 첨물님만 해 옴 -.-



그럼 어떻게 코딩을 했는지 살펴보았다.

먼저 첨물님. 두 가지 방식으로 진행했다.


1. 화살표가 가야 할 길을 미리 알고 따라 가는 경우,

2. 화살표가 사다리를 만났을 때, 조건문을 써서 알아서 찾아가는 경우,



우선 첨물님은 사다리를 랜덤 하게 만들지는 않고, 도장 찍기로 가로선과 세로선을 특정 위치에 만들었다.

그리고 난 후, 1~4번 세로선 각각에서 화살표가 가는 길을 리스트에 넣었다.

넣을 때, 화살표가 직진은 0, 좌회전은 +1, 우회전은 -1을 넣었다. 총 10번의 움직임에 끝까지 도달하도록 했기 때문에 10개의 숫자가 하나의 리스트에 들어가게 되는 것이다.

위와 같이 세팅을 하면, 1~4번 세로선 위치에서 화살표가 출발할 때, 화살표가 가야 하는 정보가 모두 리스트에 들어가 있으므로 B라는 변수(어디로 가야 하는지 정하는 변수)에 0, +1, -1이 들어가 있는지 보고, 각각 동작을 취하면 된다. 그걸 하나의 세로선에서 10회 반복하면 가장 아래 위치까지 도달하게 된다.



그러나 아쉬움이 남았다. 이렇게 화살표가 모두 가야 할 곳을 알고 있도록 코딩을 해 놓으면 사다리가 달라졌을 때, 매번 위치 정보를 넣어주어야 한다. 만약 길 따라가는 로봇으로 임의의 사다리 지도 위에서 따라가게 만들어야 하고, 사다리 정보를 모른다면 어떻게 해야 할 것인가?

그래서 코딩을 수정했다. 사다리의 교차점에서 화살표가 판단해가면서 가도록...

그러기 위해서 화살표에 센서를 달았다. 노란색과 녹색. 그리고 노란색 센서가 15도 좌회전해서 파란색 사다리 가로선을 만나면 좌회전, 녹색 센서가 우회전에서 파란색 사다리를 만나면 우회전을, 이도 저도 아니면 직진으로 가도록 했다. 즉 위에서 B값을 A라는 리스트에서 고르는 것이 아니라, 화살표가 움직이면서 좌우로 약간씩 회전해가면서 스스로 판단해서 0, +1, -1을 정하는 방법이다.


사실 이러한 방법은 레고의 마인드스톰에서 길 따라가는 코드에서 참고하였다. 마인드스톰에는 빛 센서가 있어서 좌우로 약간씩 회전하면서 검은색이 아니면 다시 제자리로 오도록 하는 알고리듬으로 검은색 라인을 따라가도록 한다. 이 원리를 스크래치 사다리 타기에 그대로 이용하는데, 단지 가로선을 만났을 때, 어디로 회전해야 할지를 두 개의 센서를 달아서 판단한 것이다. 레고의 마인드스톰처럼 하나의 센서로 줄이는 방법도 더 해 볼 예정이다.



첨물님의 설명 후에 사다리의 가로선이 세로선과 같은 검은색이면 어떻게 하느냐와 화살표에 좌우 날개에 큼직하게 붙이지 않고 보이지 않게 할 수는 없느냐 하는 의견이 있었다.

그리고 본격적으로 숙제를 내준 따식님의 코드 설명이 있었다.


1. 사다리 랜덤으로 그리기

  - 펜 내리기와 펜 올리기 : 마치 펜을 기계에 붙여서 내리면 그어지고 올리면 그리지 않는 기능

  - 세로선은 반복문을 사용하여 5개를 그리도록 한다.

  - 가로선 긋기 : 두 개의 세로선 사이의 가로선을 긋는데, 20 등분하여 랜덤 변수를 사용하여 리스트에 각각에 0, 1을 넣어 긋기와 긋지 않는 조건을 넣어둔다. 그렇게 총 4회를 진행하여 가로선 전부의 조건표를 또 다른 리스트에 넣는다.

위에서 ladder 리스트 변수는 20개의 가로선 유무를 정하는 숫자가 들어가는 것이고, 이것을 4회 진행했을 때, 각각을 number of line이라는 리스트에 붙여 넣어서 구별해 놓는 것이다.

그런데 여기서 고려해야 할 점이 있다. 어떤 위치에서 가로선이 왼편에 있으면, 오른편에는 가로선이 없어야 사다리 게임이 된다. 위 number of line에서 1번행과 2번행에 20개의 숫자가 들어가는데, 왼쪽부터 0, 1이 들어가는데, 같은 위치에 1이 들어가 있으면 안된다는 것이다. 이걸 어떻게 만들 수 있을까?

2번행에 20개 방에 0, 1을 랜덤 하게 넣을 때, 1번행에 해당 위치에 0이 있을 때에만 랜덤수를 넣고, 1이 있을 경우엔 0을 넣도록 한다. 0번행은 모두 0이 들어가 있으므로 1번행은 20개의 방에 0, 1을 랜덤 하게 넣어둔다. 그리고 그 20개 세트를 또 다른 number of line에 모아둔다.

그리고나서 2번행의 20개의 방에 0, 1을 넣을 때엔 ladder라는 리스트(이것은 1번행의 정보를 담고 있다.)에서 각각의 방에 0이 있을 경우에만 0 또는 1을 넣고, 1이 있을 때는 무조건 0으로 넣는다. 그래야 연속적으로 가로선이 그려지지 않는다. 좀 복잡하지만 이렇게 랜덤 사다리 긋기를 코드를 만들었다.



2. 화살표 움직이기

   number of list에 각각의 가로선 정보가 리스트에 들어가 있다.

  그러나 직진, 우회전, 좌회전으로 들어가 있지 않고, 가로선이 있느냐와 없느냐로 구성되어 있다.

  그러면 어떻게 화살표는 왼쪽과 오른쪽을 알아낼 수 있을까?

 여기서 변수 3개를 만들자

1) Player 변수 : 세로선의 어디서부터 시작하는가에 대한 것, 첫 번째 세로선에서 시작하면 Player=1

2) ladder No 변수 : 화살표가 5개의 세로선 중 어느 선에 있느냐에 대한 수, 화살표가 움직이면서 계속 바뀜

3) N 변수 : 세로선의 길이를 12 등분하고, 한 단위씩 움직일 때마다 1씩 증가, 12등분 중 하나에 가로선이 있음


그럼 화살표가 움직이는 걸 해 보자. 아래와 같이 사다리가 있다고 가정하자.

Player=2에서 화살표는 시작한다고 할 때,  ladder No=Player=2의 첫 번째 줄(N=1)에 가로선이 있는지 확인한다. number of list의 두 번째에서 첫 번째 글자를 확인하니 0

그리고 그 왼쪽 ladder의 수도 확인, 즉 ladder No=1 의 첫 번째(N=1)의 number of list 의 첫째 글자도 0

그러면 Player 변수는 변함이 없고, 직진한다.(Player=2)


N=2으로 바뀐다. 다시 ladder no=1에 가로선이 있는지 확인한다. 1이 있다. 그러면 Player 변수는 1을 더하고 오른쪽으로 이동한다. (Player=3)


N=3으로 바뀐다. 이번엔 ladder no=3에 가로선이 있는지 확인한다. 없다. 그리고 왼쪽을 본다. ladder no=2의 세 번째 수가 1이다. 그러면 Player는 1을 빼고 왼쪽으로 이동한다.(Player=2)


N=4으로 바뀐다. 이번엔 ladder no=2에 가로선이 있는지 확인한다. 없다. 그리고 왼쪽을 본다. ladder no=1의 네 번째 수가 1이다. 그러면 Player는 1을 빼고 왼쪽으로 이동한다.(Player=1)


N=5으로 바뀐다. 이번엔 ladder no=1에 가로선이 있는지 확인한다. 있다. 그러면 그러면 Player는 1을 더하고 오른쪽으로 이동한다.(Player=2)

이런 식으로 화살표가 이동해간다.

코딩 내용은 아래와 같다.


다소 복잡하지만 매우 고급 기술을 써서 화살표 움직임을 구현한 것에 다들 놀라워 했다.

다만 이 방법또한 화살표의 움직임에 대한 정보가 미리 메모리에 저장되어 있고, 화살표는 이것에 따라 움직여가는 원리이다.


다들 이런 걸 고민하고 있다는 것에 나름 자부심을 가지고 한단계 더 나아가는 문제를 만들어서 다음에 보기로 했다.

다음 주제는 '미로 찾기'

기대가 된다. '아빠들의 코딩 모임'의 미래가 ^^

마이크로비트로 만든 사다리타기도 ...

매거진의 이전글 한글로 마이크로비트 코딩하기
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari