본문 바로가기
Programming/LOGO

LOGO : 변수(Variables) - 10 - ColorBox 120

by The Programmer 2024. 4. 28.

1. Introduction

 

변수와 반복문을 이용해서 컬러박스 120개를 그려봅시다. 한 줄에 12개씩 나누어서 그리는 방법을 알아보겠습니다. 면색에 대해서는 지난 시간에 알아보았으며, 이번 예제에서는 선색에 대해서 알아보겠습니다.

 

이 예제에서는 다음 사항들에 주목해야 합니다.

 

1) 펜컬러 설정하기 : 예) setPenColor [ 0 0 0 ]

2) random 255

3) random값으로 컬러값 설정하기

4) repCount

5) MODULO 연산

6) LIST와 LIST 변수 만들기

7) if

8) 함수 파라미터 사용하기 : 예) box1 20

9) 변수 만들기 : 예) make "side 20

 

 

2. Code

 

to box1 :side
    repeat 4 [ fd :side rt 90 ]
end

to cBLACK
    output [ 0 0 0 ]
end

to cWHITE
    output [ 255 255 255 ]
end

to gotoNextLine
    pu lt 90 fd ((:side+:space)*12) rt 90 back (:side+:space) pd
end

to main
    setup
    repeat 120 [
        ;; setLineColor1   ;; 지우지 말고 주석처리 권장. setLineColor2와 스위치 온/오프 방식 사용!
        setLineColor2
        box1 :side
        move1 :jump
        make "modValue (modulo repCount 12)
        print :modValue
        if (:modValue = 0) [ gotoNextLine ]
    ]
    ht    
end

to move1 :jump
    pu rt 90 fd :jump lt 90 pd
end

to setLineColor1
    setpc [ 0 0 0 ]
end

to setLineColor2
    make "cR random 255
    make "cG random 255
    make "cB random 255
    make "myList (List :cR :cG :cB)
    setpc :myList
end

to setup
    make "side 20
    make "space 5
    make "jump (:side + :space)

    setPC [ 0 0 0 ]
    setFloodColor cWHITE Fill

    Window Home CS PPT PD ST
    pu lt 90 fd 400 rt 90 fd 250 pd
end

 

 

3. Result

 

[ 그림 10 - 1. MonoColorBox ]

 

 

[ 그림 10 - 2. RandomColorBox ]

 

 

4.  Notes

 

이 예제에서는 다음 사항들에 주목해야 합니다. ^.^;

 

1) 펜컬러 설정하기 : 예) setPenColor [ 0 0 0 ]

 

2) random 255

 

3) random값으로 컬러값 설정하기

 

4) repCount

 

5) MODULO 연산

 

6) LIST와 LIST 변수 만들기

 

7) if

 

8) 함수 파라미터 사용하기 : 예) box1 20

 

9) 변수 만들기 : 예) make "side 20

 

10) output 사용법 : 예) 

 

to cRed

    output [ 255 0 0 ]

end

 

 

◈ Note 1. 주석 처리

위 코드 내부 주석 처리된 부분은 지우지 말고 주석처리할 것 권장. setLineColor2 앞에 세미콜론 ';'을 붙이고 setLineColor1에 있는 세미콜론은 지워서 저장 후 실행하면 간단하게 컬러와 흑백을 전환할 수 있습니다. 주석 처리를 온/오프 스위치 비슷하게 사용하는 셈입니다. 주석 처리할 때 세미콜론(;)은 하나만 사용해도 됩니다. ;; 제 경우는 그냥 버릇이나 습관으로 어떤 학습 자료를 보다가 그것을 그냥 따라한 것일 뿐입니다. ^.^;

 

        ;; setLineColor1   ;; 지우지 말고 주석처리 권장. setLineColor2와 스위치 온/오프 방식 사용! 주석 처리가 여기에 있다가...
        setLineColor2

 

코드를 지우지 않고 주석 대상만 바꾸기 : 

 

       setLineColor1
       ;; setLineColor2     ;; 지우지 말고 주석처리 권장. setLineColor2와 스위치 온/오프 방식 사용! 주석 처리가 여기로! ^.^;

 

 

◈ Note 2. Modulo 연산

 

Modulo 연산은 나눗셈의 나머지를 계산하는 연산입니다. 일반 수학에서 5 나누기 3의 나머지를 구하는 수식을 FMSLogo 표현식으로는 다음과 같이 나타냅니다. 띄어쓰기만 잘 지키면 됩니다.

 

Modulo 5 3

 

괄호로 묶어서 변수 만들기에 사용할 수도 있습니다.

 

make "modValue (modulo repCount 12)

 

: repCount값을 12로 나누고 그 나머지를 구합니다. 이 나머지값을 변수 modValue에 저장합니다. repCount 변수는 LOGO 특수변수로 앞에 변수라는 사실을 나타내는 콜론(:) 기호를 붙이지 않습니다.

 

 

◈ Note 3. List와 List 변수 만들기

 

다음 함수를 통해서 살펴보겠습니다.

 

to setLineColor2
    make "cR random 255
    make "cG random 255
    make "cB random 255
    make "myList (List :cR :cG :cB)
    setpc :myList
end

 

make "cR random 255

: 변수 cR에 random 255의 결과값을 저장합니다. random 255는 0을 포함해서 0부터 254까지의 범위에서 아무 숫자나 골라냅니다. 255는 포함되지 않습니다.

 

make "myList (List :cR :cG :cB)

: LIST를 만들 때는 'LIST'라는 단어를 사용합니다. 작은 따옴표는 제외.

 

List :cR :cG :cB  ;; 제시된 변수 3개를 리스트로 만듭니다. 아무 숫자나 컴퓨터가 골라주므로 예를 들어 3, 200, 241을 골랐다고 가정하면 리스트 만들기의 결과는 [ 3 200 241 ]이 됩니다. FMSLogo에서는 리스트를 나타낼 때 대괄호([ ])를 사용합니다.

 

List :cR :cG :cB ---> [ 3 200 241 ]

 

(List :cR :cG :cB)  ;; 괄호로 묶어서 하나의 덩어리처럼 만듭니다.

 

make "myList (List :cR :cG :cB)  ;; 괄호로 묶인 덩어리를 변수 myList에 저장합니다. 이때, myList 변수는 리스트형 변수가 됩니다.

 

내장 함수인 setPenColor 함수나 setFloodColor 함수는 모두 리스트LIST를 파라미터로 가집니다. 

 

setPenColor [ 0 0 255 ]

setFloodColor [ 255 0 128 ]

 

파라미터 [ 0 0 255 ] 혹은 [ 255 0 128 ] 대신에 위에서 만든 리스트형 변수를 사용할 수 있습니다. 

 

setPC :myList

setFC :myList

 

 

◈ Note 4. 덧셈과 곱/나눗셈, 서로 먼저 계산하기. 왜?

 

to gotoNextLine
    pu lt 90 fd ((:side+:space)*12) rt 90 back (:side+:space) pd
end

 

덧셈/뺄셈과 곱셈/나눗셈이 하나의 수식에 같이 포함되어 있다면 먼저 계산하는 방식에 따라 그 결과값이 달라질 수 있습니다. 프로그래밍 세계에서는 대부분 괄호로 묶으면 괄호 부분을 먼저 계산합니다.

 

다음 수식을 검토해보세요.

 

1 + 2 * 3   = 

;; 별표*는 곱셈을 뜻합니다. 9 혹은 7

 

4 - 2 / 2 = 

;; 슬래시는 나눗셈을 뜻합니다. 따라서 1 혹은 3

 

일반 수학이라면 어느 쪽이 정답일까요? 정해진 계산 규칙이 있을까요? 흐음... 이런 부분과 관련된 일반 수학 규칙을 <연산의 우선순위> 문제라고 합니다. ^.^;

 

대부분의 컴퓨터 프로그래밍 세계에서는 계산의 혼란을 막고 오류를 방지하기 위해서 먼저 계산할 내용을 명확하게 밝히기 위해서 괄호로 묶을 수 있습니다. 괄호가 있으면 괄호 부분을 무조건 먼저 계산해야 합니다.

 

(1 + 2) * 3   =  

4 - (2 / 2) = 

 

괄호가 있으면 다른 답은 허용될 수 없습니다. ^.^;

 

(tbc...)

 

 

5. Ref.

 

1) FMSLogo 내장 도움말.

 

 

6. Files

 

Ch_03_Variable_Ex_010_ColorBox_120_v1_.lgo
0.00MB

 

 

Happy Programming!

^.^;