터북이성 LEGO 블럭코딩

LEGO 블럭과 같은 코딩 명령어로 접근하는 터틀크래프트 블럭코딩

레고 LEGO 장난감의 블럭으로 여러 모양을 만들며 놀아본 경험이 있을 것이다. 스크래치 언어의 시작인 MIT 패펄트 교수의 LOGO 거북명령은 실제로 레고회사로 부터 연구지원을 받았으며, 코딩을 위한 거북명령 구성의 도구를 레고블럭과 같은 구성을 위한 도구와 연계시키었다. 레고 블럭과 같은 구성의 도구를 학습자에게 주고, 그 구성의 도구로 Learning by Making (Design) 학습을 유도하는 구성주의 (constructionism) 이론이 여기에서 탄생하였다. MIT 거북명령 LOGO와 스크래치 언어 모두는 거북이와 고양이의 가자와 돌자 행동 명령에 기반을 둔다. 터틀크래프트에서도 마찬가지로 가자와 돌자 그리고 위와 아래로 3차원 행동을 하는 명령과 현재의 위치와 방향을 기억하는 도돌이표 (원래 위치로 되돌아가게 하는 표시) 명령을 하나의 문자에 대응시켜 거북문자 코딩으로 접근한다. 

위에서, 소문자 s와 t는 각각 앞으로 (step) 및 뒤로 가며 블럭을 만든다.  u 와 d는 각각 위로 (up) 아래로 (down) 가며 블럭을 만든다, 대문자 L과 R은 각각 왼쪽 (Left) 오른쪽 (Right) 방향으로 90도 돈다. 마지막으로, [ 은 현재의 위치와 방향을 기억시키고, ] 기호는 기억된 위치와 방향으로 되돌아간다. 헨젤과 그레텔 동화에 나오는 돌멩이나 음악의 도돌이표를 생각하면 이해하기 쉽다. 먼저 [beginxyz] 단추를 눌러 3차원 마인크래프트와 같은 환경을 만든다. 이 후, [실행] 단추를 눌러보자. 

A = ' s[u] s ' // 앞으로 가고, 위에 블럭, 앞으로 .... 저장시킴 doit( s[u]s s[u]s s[u]s s[u]s ) // 앞으로 가고, 위에 블럭, 앞으로 ..... 4번 반복 doit( L ) // 왼쪽으로 90도 회전하여 방향을 바꾼다 doit( AAAA L 4A L 4A L ) // A를 네번하고 L 하고 ...... 반복한다

초등 창의코딩은, 디즈니랜드를 닮은 터북이 성을 만드는 창의적 활동을 통해 수학과 코딩을 융합시키는 컴퓨팅 사고력 역량을 키우고, 또한 중등 창의코딩은 자유학년제 정신에 따라 인공지능 미래사회를 대비하며 꿈과 끼를 키우는 코딩수학을 목표로 한다. MIT 거북수학과 컴퓨팅 사고력 등은 내용은 다른 게시판 글을 참고하고, 여기서는 터북이 (TurBOOKi) 성을 만드는 핵심 아이디어를 레고 (LEGO) 블럭으로 설명한다. 앞에서 문자 s, t, u, d, L, R 과 도돌이표 기호 [ ]  을 소개하였다. 이제 다음과 같은 모양의 레고 블럭과 그 블럭의 이름을 각각 S, Z, X, Y 라고 부르자. 폭이 넓고 모양이 있는 이런 블럭들을 연결시켜 터북이 성을 만들어보자.  

위에서, S는 거북이가 앞으로 가면서, 왼쪽과 오른쪽에 각각 성벽과 길을 만들되, 하나는 낮게 또 하나는 높게 위의 그림과 같이 만든다. Z는 높은 성벽과 길을 한개만 만든다. 성벽의 길은 폭이 3이고, 성벽까지 넣으면 폭이 5가 된다. 이렇게 성벽을 만들면서 왼쪽 오른쪽으로 회전을 하려면 성벽의 폭을 고려해야 한다. 왼쪽으로 회전하는 대문자 X는, 왼쪽으로 가는 통로는 비워두고, 가로 세로가 4인 모퉁이를 만든다. 대문자 Y는 오른쪽으로 가는 통로를 만들 때 쓴다. 이제 아래와 같이 만리장성과 같은 성벽을 만드는 코드를 만든 후, 먼저 [beginxyz] 눌러 3차원 세상을 만든 후, 이어서 [실행] 단추를 눌러보자.

doitsxyz // 대문자 SXYZ 거북문자 사용 goto(1,3,1) // (1,3,1) 로 이동, 동쪽방향 doit( SX SY SSX 4SX ) doit( 5SZ 5SX 4SX SSY SX S uu ZZZ s ) goto( 0,2,6, 3 ) // 마지막 3은 3직각방향 doit( s ; 0 ) // 0 번 블록으로 s 만듦 beginxyz ; item=6 // 6번 블럭, 좌표평면

위의 코드에서, doit 은 거북에게 명령을 하는 신호이며, 소문자 s는 앞으로 가면서, u는 올라가면서, d는 내려가면서 블럭을 각각 하나씩 만든다. goto 는 주어진 좌표와 방향으로 터북이를 보낸다. 좌표 뒤에 방향을 나타내는 숫자가 없으면 0 직각 방향 즉 동쪽을 향하게 된다. 만일 2라는 숫자가 있다면, 2 직각 방향 (180도) 인 서쪽을 향하게 된다. 0번 블럭은 빈 공간을 만드는데, 디폴트는 7번 블럭이다. 디폴트 블럭을 바꾸려면 item 이란 변수를 사용한다. beginxyz 아래에는 조건제시법 코드를, 그 위에는 원소나열법 코드를 각각 적은 후, [beginxyz] 단추로 조건제시법 코드를 작동시키고, 이어서 [실행] 단추로 원소나열법 코드를 작동시켜 작품을 완성한다.

 

3차원 입체를 정직구원체 집합으로 접근하는 터틀크래프트 블럭코딩

앞에서 소개한 doit 기반의 거북명령은 블럭을 하나하나 만들며 터북이 성을 만든다. 이제 터북이 성에 디즈니랜드에서 보는 그런 탑을 올려보자. 터틀크래프트에서 초등학교 수학에도 나오는 기둥이나 뿔 그리고 구의 모양을 활용할 때, 집합 명령을 사용하여 조건제시법 코딩으로 만든다 (doit 기반의 명령은 원소나열법 코딩). 아래와 같이, 터틀크래프트의 정직구원 명령은 집합의 어떤 조건에 맞는 블럭을 모두 모아서 만든 입체를 만든다. 정과 직은 각각 정사각형과 직사각형의 앞 글자이다. beginxyz 아래ㅔ 쓰이는 다음과 같은 정직구원 명령을 예를 살펴보자.

정직구원 명령은 모두 중심의 위치와 반지름 개념으로 입체를 만든다. 기둥과 뿔 등의 입체는 맨 아래의 부분이 있고 그 부분의 중심이 있다. 직사각형에서는 중심에서 오른쪽으로의 가로 길이외 위로의 세로 길이를 각각의 반지름으로 본다. 예를 들어, 집합 { 정( 5, 5, 1, 4 ) && z<5 }  명령은 맨 아랫 부분이 1층에 있고 그 부분의 중심좌표가 1층의 (5,5) 이다. 이제 여기를 시작점으로 한층 한층 5층 아래까지 올라가면서 각 층에서 중심이 (5,5) 이고 반지름 (즉 중심에서의 가로 세로의 길이) 이 1인 정사각기둥을 만든다. 여기서  && z<5  명령은 5층 아래라는 조건을 쓴 것이다. && 기호는 and (또한 이것도 만족하라는 논리) 표시이고,  z 좌표는 위로 올라가는 각 층의 값으로 z<5 라는 뜻은 4층 까지라는 것이다. 이제 아래의 [beginxyz] 단추를 눌러 정직구원으로 입체를 만들어보자.

A='ss[u]' goto(0,0,5) 반복 4 { doit( 5A L ; 9 ) } beginxyz ; 집합 { 정(5,5,1,4) && z<5 } 집합 { 직(5,5,5,2,3) && z<10 ; 16 } 집합 { 정(5,5,10,14-z) ; 18 } 집합 { 원(-5,5,1,1) && z<5 ; 12 } 집합 { 구(-5,5,8,4) ; 13 }

위의 명령에서, 집합 { 정(5,5,10,14-z) ; 18 } 명령은 18번 블럭 (앵그리버드 블럭) 으로 사각뿔을 만드는 명령이다. 구체적으로, 맨 아래의 중심 좌표가 10층의 (5,5) 이며, 여기서 부터 중심을 따라 위호 한 층씩 올라가면서 반지름 (가로,세로) 을 14-z 로 하는 정사각형을 만들어 쌓으라는 것이다. 10층에서는 z=10 이기에, 중심이 (5,5,10) 이고 반지름이 4인 정사각형이 만들어지고, 11 층에서는 z=11 이기에 반지름이 14-z 에 의해 3, ..., 14층에서는 중심이 (5,5,14) 이고 반지름이 0 (중심점만 나타남), 15층 이상에서는 반지름 14-z 가 음수가 되기에 더 이상 사각형이 만들어지지 않는다 (음수인 반지름은 없기에). 따라서 올라가면서 점점 작아지는 정사각형이 쌓이기에 피라미드 모양의 사각뿔이 탑의 지붕으로 만들어진다. beginxyz 위의 반복 4 { doit( 5A L ; 9 ) } 명령은 9번 블럭 (바위모양 블럭) 으로, 문자 A에 저장된 명령을 5번 실행하고 이어서 L 하는 것을 총 5번 반복 (repeat) 하라는 반복 알고리즘이다. 이 것으로 탑의 베란다가 만들어진다. 다음은 성벽과 탑을 doit 거북명령과 정직구원 집합 명령을 융합하여 만든 것이다. [beginxyz] 단추를 누르면 beginxyz 아래의 코드에 의해 먼저 탑이 만들어지고, [실행] 단추를 누르면 beginxyz 위에 쓰인 코드로 성벽이 만들어진다.

doitsxyz // 대문자 S,X,Y,Z 레고 블럭을 씀 goto(1,3,1) // 거북이 위치 (1,3,1) doit( SX SY SSX 4SX ) doit( 5SZ 5SX 4SX SSY SX ) doit( Suu ZZZ s ) goto(0,2,6,3) // 거북이 위치시키기 doit(s;0) // 벽을 없애고 그 자리에 !! beginxyz; // 중앙에 있는 사각탑 집합 { 정(0,8,5,3) && z<13 } 집합 { 정(0,8,13,1) && z<20 } 집합 { 정(0,8,20,23-z); 16 } 집합 { 정(0,8,13,3) && z<15;0 } 집합 { 정(0,8,13,4) && z<15;9 } //왼쪽에 있는 원형 탑 (대칭위치) 집합 { 원(-12,8,5,3) && z<8 } 집합 { 원(-12,8,8,1) && z<13 } 집합 { 원(-12,8,13,16-z) ;8} // 오른쪽에 있는 원형탑 (대칭위치) 집합 { 원(12,8,5,3) && z<8 } 집합 { 원(12,8,8,1) && z<13 } 집합 { 원(12,8,13,16-z) ;8} //성벽으로 가는 계단 (창의코딩) 집합 { 정(0,z+13,0,1) && z<4 }

 

LEGO 블럭 코딩명령 및 doit 명령으로 접근하는 터틀크래프트 창의코딩

아래를 실행시키면 나오는 터북이 성에 창의적으로 다양한 탑과 나무를 만들어 보자 (또한 터북이성을 자신이 다른 모양으로 디자인해보자). 이렇게 코딩으로 만든 것으로 아래와 같이 VR 놀이도 하고, 3D 프린터로 뽑아서 스노우볼 같은 것도 만들어보자.

doitsxyz // 대문자 레고블럭 SXYZ 사용 goto(-4,3,1) // 아래는 { 와 } 를 2번 반복 (성 모양 대칭) 반복 2 { doit( Suu ZZZ sddt S X ) doit( SY SSX 5SX SSY S X ) } goto(0,2,6,3) // (0,2,6) 위치 3직각 270 방향으로 doit // 벽을 없애고 그 자리에 거북이 위치함 doit( s ; 0 ) beginxyz;

정직구원 LEGO 블럭코딩을 통해 로마의 콜로세움이나 판테온 신전, 혹은 파리의 개선문과 에펠탑 등의 건축물을 만들어보자. 정직구원과 같이 레고 블럭을 만드는 집합 명령과, 한개 한개 블럭을 만들어 이어가는 doit 거북명령을 융합시킨 창의적인 코딩을 통해 자신의 끼와 꿈을 창의코딩을 통해 만들며 체험해보자 !! 예를 들어, 아래를 실행시키면 아테네에 있는 파르테논 신전과 원형극장 모양의 건축물을 정직구원 LEGO 블럭으로 만들 수 있다. beginxyz 바로 아래에 쓰여지는 if(z<0 || z>33) return 0  과 같은 명령은 블럭을 만들지 않는 위치를 빨리 거북에게 알려주어 실행 속도를 높이려고 쓴 것이다. beginxyz 조건제시법은 약 280만개의 좌표에 블럭을 지정하여 만들기에 빨리 실행시키는 코딩 방법이 중요하다. 

 

// doit 원소나열법 거북명령이 없기에 // 초기 위치 (0,1,1) 에 0도 방향으로 거북 !! beginxyz if(z<0 || z>33) return 0 // 지하세계 (z<0) 와 33층 위는 빈 공간 // 바로 아래는 신전 밑부분에 9번 암석 집합 { 직(0,25,0,16,21) && z==0 ; 9 } // 각각 z==0 층 z==1층에 직사각형 만듦 집합 { 직(0,25,1,15,20) && z==1 ; 9 } // 아래는 신전의 기둥, 기둥의 위치만 // 다른 같은 스타일 명령 (반복 알고리즘) 집합 { 원(-10,15,2,2) && z<20; 40 } 집합 { 원(-10,25,2,2) && z<20; 40 } 집합 { 원(-10,35,2,2) && z<20; 40 } 집합 { 원(10,15,2,2) && z<20; 40 } 집합 { 원(10,25,2,2) && z<20; 40 } 집합 { 원(10,35,2,2) && z<20; 40 } 집합 { 직(0,25,19,33-z,16) ; 16 } // 원형 극장 안쪽을 0 으로 비우고, 벽을 // 16 번으로 (순차구조: 순서 바꾸면 ?) 집합 { 원(0,5,1,45+z) && z<8 && y>0; 0 } 집합 { 원(0,5,1,55) && z<8 && y>0; 16 }