brunch

You can make anything
by writing

C.S.Lewis

by 첨물 Nov 05. 2017

스크래치로 미로 찾기 코딩

숨겨진 보물을 찾아라

11월이 되니 날씨가 꽤 쌀쌀해졌습니다.

이번 모임엔 새로운 손님을 초대해서 진행하였습니다. 전직 고등학교 과학 선생님인 정선생님과 현직 초등, 중등 코딩 교육을 하시는 황선생 님입니다.  전문가의 시선으로 우리 모임에서 논의되는 코딩 수준과 모임의 방향들에 대해 조언을 얻고자 초대했는데, 3시간이 어떻게 지났는지 모를 정도로 열띤 분위기 속에서 모임을 진행하였습니다.




첫 번째는 지난번 따식님이 주신 숙제 검사...

위와 같이 임의의 미로가 주어졌을 때, 시작점에서 출발하여 종이 있는 곳까지 찾아가는 것입니다.



먼저 숙제를 한 첨물님의 코딩 설명이 있었습니다.


1. 먼저 미로가 아래와 같이 주어져있고, 우리가 찾아야 할 종이 미로 속에 있습니다. 그러면 거북이 한 마리를 만들고 좌상단에서 시작해서 찾아가는 것으로 시작합니다.


2. 거북이는 좌우에 보라색, 파란색 다리를 만들고 이것이 검은색 벽을 닿은 상태로 움직이도록 합니다. 그리고 거북이 머리를 빨간색으로 하여 앞에 장애물이 있는지 확인하도록 했습니다. 즉 센서가 3개가 달려 있는 로봇이라고 생각하고 미로를 움직이도록 합니다.


3. 그러면 거북이 움직임을 어떻게 규칙을 만들면 될까요? 아래와 같은 순서도(Flow chart)를 만들어 보았습니다.


 1) 거북이가 종에 닿을 때까지 반복문을 돌리면서 거북이를 진행시킨다.


 2) 좌 센서/우 센서/앞 센서가 모두 벽을 닿으면 180도 회전해서 1블록만큼 전진한다.

 3) 좌 센서/우 센서만 벽을 닿고 앞 센서는 벽을 닿지 않으면 1블록만큼 전진


 4) 좌 센서만 닿고, 우 센서가 닿지 않으면

    4-1) 앞 센서가 닿지 않으면 랜덤 하게 우회전 또는 직진하도록 한다.

    4-2) 앞 센서가 닿으면 우회전한다.

 5) 우 센서만 닿고, 좌 센서가 닿지 않으면

    5-1) 앞 센서가 닿지 않으면 랜덤 하게 좌회전 또는 우회전하도록 한다.

    5-2) 앞 센서가 닿으면 좌회전한다.


 6) 처음 있는 위치에 오면 180도 회전에서 1블록 전진한다.


4. 위 2~5번의 규칙을 함수로 만들어서 해당 조건에서 불러내서 사용했습니다.


5. 그런데 위와 같은 규칙으로 할 경우, 운이 좋으면 바로 종이 있는 위치로 거북이가 가지만, 운이 나쁠 경우, 왔던 길을 계속 반복해서 다니기 때문에 상당히 오랜 시간이 걸리는 단점이 있습니다. 그래서 어떻게 하면 왔던 길을 다시 가지 않을 수 있을까를 고민했습니다.

문제는 4-1) 번과 5-1) 번 규칙에서 랜덤 하게 선택하는데, 만약 내가 그 위치에 다시 한번 왔을 때 이전에 했던 결정과 다른 결정을 하도록 하면 반복된 길을 가는 것을 막지 않을까?

그래서 다음과 같이 왔던 좌표(x, y)와 방향을 trace라는 list에 저장해 두고, 거북이가 그 위치에 오면 '결정' 변수를 이전 선택과 다른 값으로 바꾸도록 했습니다.


5-1) trace list 만들기


5-2) trace 모음 list에 trace들을 저장하기


5-3) 거북이의 위치, 방향이 이전에 왔었는가를 판단하기


5-4) 이전에 왔었던 곳이면, 좌회전 또는 직진을 결정했던 '결정' 변수를 바꾸어서 결정하기

    (왼쪽 그림이 좌회전 또는 직진을 결정하는 것, 오른쪽 그림이 우회전 또는 직진을 결정하는 것)



다소 복잡하지만 이렇게 만들 경우, 선택의 기로에서 이전에 선택했던 값이 아닌 다른 값을 선택하도록 하여, 반복하여 왔다 갔다 하는 것을 막을 수 있도록 했습니다. (여기서 K1, K2는 얼마나 자주 이 결정을 했는가를 셈)





마지막으로  미로를 어떻게 만들었는지에 대해 따식님의 설명이 있었습니다.


1. 스크래치를 이용하여 임의의 미로를 만들기 위해서 3개의 스프라이트를 만듭니다. 격자구조와 세로 막대와 가로 막대.

먼저 격자구조를 8x8로 도장 찍기를 합니다.



그리고 가로 막대와 세로 막대가 있어야 할 위치를 리스트에 넣어두고, 이를 통해 미로의 형상을 만듭니다. 이때 사각형 박스를 옮겨가면서 버튼을 누를 때마다 W, S, A, D 버튼을 누르면 상, 하, 좌, 우 벽이 만들어지도록 합니다.


문제는 이렇게 해서 만들어진 미로 정보를 어떻게 저장하는가입니다. 그래서 동그란 공 하나가 가로 격자와 세로 격자를 지나가게 하면서 그 위치에 있으면 1, 없으면 0 의 값을 갖도록 하여 각 줄 별로 리스트로 만듭니다. 

이렇게 만들어진 리스트는 내보내기로 하여 txt 파일로 저장이 되고, 위 미로 파일에서 불러 읽을 경우, 똑같은 모습의 미로가 그려지도록 했습니다.




다소 난이도가 높아지는 가운데, 열띤 토론이 있었고, 실제 미로를 만들어서 거북이 로봇으로 길을 찾아가도록 할 경우, 미로 길의 폭이 넓어지거나 좁아지면 어떻게 구현할 수 있을지 토론해 보았습니다. 


다음 숙제는 첨물님이 낸 '하노이의 탑'을 스크래치나 마이크로비트로 작성하는 것입니다.

따식님이 최근에 3D 프린터를 장만하셔서 손수 만들어 가지고 오셨습니다.

다음 모임 때는 한층 업그레이드된 코딩 모임이 될 것이라 기대하며...



매거진의 이전글 사다리 타기 코딩
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari