'전체 글'에 해당되는 글 29건

  1. 2018.05.16 [엑셀 VBA #20] 엑셀 메크로를 사용해 사다리타기 만들기 #2





정말 오랜만에..... 올리는 사다리타기 만들기 2편입니다.


벌써 반년이 지났네요.. 허미.. ^^;


각설하고, 시작할게요~!



이 포스팅의 제목은 '엑셀 메크로를 사용해 사다리타기 만들기' 이지만..


사실 컴퓨터 언어를 코딩하는데 에 있어 필요한 로직 구상법에 대해 알아보는 포스팅에 가깝습니다.


예전에도 언급한 적이 있는 것 같지만, 엑셀 vba와 같은 정말 기초적인 언어도 여타 언어들과 별반 다르지 않습니다.


로직을 구상하고, 로직을 현실화 시키는 수단인 것은 엑셀 vba나 java나 매한가지입니다.



파일을 받고, 실행시킨 후 따라와주세요~!

지난 게시글에 있는 사다리타기 파일에서 조금 수정되었습니다.


----


1. 그림을 그려보자


먼저 1차원적인 접근부터 시작합니다.


사다리타기에 필요한 요소가 무엇이 있는지, 머리속으로 그림을 그려봅시다.


① 몇 명의 인원이 참여하는지 선택하는 버튼

② 시작 버튼

③ 사다리 위쪽, 참여자 이름이 들어가야 할 공간

④ 사다리 그 자체

⑤ 사다리 아래쪽, 사다리 선택 결과가 들어가야 할 공간




제가 그린 그림은 위와 같습니다.


정답은 없습니다.






2. 기능을 구상하자


사다리타기를 구현하는 데에 필요한 기능을 만들어야 합니다.


쉬운 것부터 차례대로 진행해보겠습니다.


① 1인용 ~7인용 버튼을 누르면 각각 버튼 내용에 맞게 사다리 세로 짝대기가 그려진다. (기존에 있던 내용은 사라진다)

② 시작 버튼을 누르면 랜덤하게 가로 짝대기 (사다리 손으로 잡고 올라가는 부분) 이 그려지며

③ 사다리에 색깔이 입혀지며 자동으로 내려간다.

④ 마지막 결과를 팝업창에 출력한다.


물론 정답은 없습니다.


사다리 만드는 버튼과 사다리 실행 버튼을 따로 만들어도 문제 없고, 결과를 팝업창에 출력하는 대신 아래쪽 칸에 출력시키는 방법도 있습니다.






3. 로직을 구성하자


구상한 기능에 필요한 로직을 구성해야 합니다.


이게 무엇이냐 함은..


컴퓨터도 사람과 비슷합니다.


생각함에 있어 순서가 필요합니다.


자, 사다리타기를 종이에다 대충 그려보고, 손가락으로 짚으며 사다리타기를 진행해보세요.


이때 머리 속에서 이루어지는 사고의 과정을 컴퓨터에게도 동일하게 알려줘야 합니다.


⑴ 사다리를 만들 때 

 

※먼저 세로줄을 인원 수에 맞게 만든다. 


 ① 첫 번째 세로 줄과 두 번째 세로 줄 사이 상단 어딘가에 첫 번째 가로줄을 그린다. 

 ② 우측 칸으로 이동해서 가로줄을 그린다.

 ③ ② 반복

 조건: 가로줄 두개가 연결되어있으면 안된다. (사진 아래쪽 가로줄은 잘못된 예시)

 ④ 우측 끝까지 이동한 경우 한칸 아래로 이동, 및 좌측 첫째 칸을 선택

 ⑤ ③④ 반복

 ⑤ 사다리 세로줄이 더 내려갈 곳이 없을 때 사다리 만들기를 중단한다. (단, 맨 아래칸은 가로줄 생성이 되면 안된다.)

 조건 : 사다리 가로줄은 랜덤으로 듬성듬성 생성해야 한다.

상단: 두 가로줄이 엇갈려있다 OK

하단: 두 가로줄이 연결되있다 NO


위의 로직을 잘 따라갔다면..

 



이렇게 사다리가 완성됩니다.






4. 코딩


이제 코딩이 시작됩니다.


3번에서 구상한 로직들을, 컴퓨터가 알아먹는 말으로 바꿔줘야 합니다.


아래 예시에서는 이해를 위해 변수 선언은 하지 않겠습니다.


※세로줄 만들기


Public Int_PQuantity As Integer '<- Int_PQunantity (플레이하는 인원 수) 변수를 Public으로 선언합니다. 다른 함수에서도 해당 변수를 사용할 수 있습니다.




Sub p_1()

Range("C14:O46").Interior.ColorIndex = xlNone

Range("C15:C46").Interior.Color = black

MsgBox "혼자서는 할 수 없습니다."

End Sub

Sub p_2()

Range("C14:O46").Interior.ColorIndex = xlNone

Range("C15:C46").Interior.Color = black

Range("E15:E46").Interior.Color = black

Int_PQuantity = 2

End Sub

Sub p_3()

Range("C14:O46").Interior.ColorIndex = xlNone

Range("C15:C46").Interior.Color = black

Range("E15:E46").Interior.Color = black

Range("G15:G46").Interior.Color = black

Int_PQuantity = 3

End Sub

Sub p_4()

Range("C14:O46").Interior.ColorIndex = xlNone

Range("C15:C46").Interior.Color = black

Range("E15:E46").Interior.Color = black

Range("G15:G46").Interior.Color = black

Range("I15:I46").Interior.Color = black

Int_PQuantity = 4

End Sub

Sub p_5()

Range("C14:O46").Interior.ColorIndex = xlNone

Range("C15:C46").Interior.Color = black

Range("E15:E46").Interior.Color = black

Range("G15:G46").Interior.Color = black

Range("I15:I46").Interior.Color = black

Range("K15:K46").Interior.Color = black

Int_PQuantity = 5

End Sub

Sub p_6()

Range("C14:O46").Interior.ColorIndex = xlNone

Range("C15:C46").Interior.Color = black

Range("E15:E46").Interior.Color = black

Range("G15:G46").Interior.Color = black

Range("I15:I46").Interior.Color = black

Range("K15:K46").Interior.Color = black

Range("M15:M46").Interior.Color = black

Int_PQuantity = 6

End Sub

Sub p_7()

Range("C14:O46").Interior.ColorIndex = xlNone

Range("C15:C46").Interior.Color = black

Range("E15:E46").Interior.Color = black

Range("G15:G46").Interior.Color = black

Range("I15:I46").Interior.Color = black

Range("K15:K46").Interior.Color = black

Range("M15:M46").Interior.Color = black

Range("O15:O46").Interior.Color = black

Int_PQuantity = 7

End Sub




p_1 ~ p_7 은 1인용~ 7인용 버튼에 해당되는 코드입니다.

Range("x:x").Interior.Color 를 이용해 쉽게 세로줄을 구현할 수 있습니다.

결과는 아래와 같습니다.




 ① 첫 번째 세로 줄과 두 번째 세로 줄 사이 상단 어딘가에 첫 번째 가로줄을 그린다. 

 ② 우측 칸으로 이동해서 가로줄을 그린다.

 ③ ② 반복

 조건: 가로줄 두개가 연결되어있으면 안된다. 

 ④ 우측 끝까지 이동한 경우 한칸 아래로 이동, 및 좌측 첫째 칸을 선택

 ⑤ ③④ 반복

 ⑤ 사다리 세로줄이 더 내려갈 곳이 없을 때 사다리 만들기를 중단한다. (단, 맨 아래칸은 가로줄 생성이 되면 안된다.)

 조건 : 사다리 가로줄은 랜덤으로 듬성듬성 생성해야 한다.



p = 16  

q = 4



Do


    '


    '사다리 가로 선 개수를 조절하기 위한 변수 lotto를 만듭니다. 

    lotto = Int(Rnd * 10) + 1

    

    


    If lotto < 6 Then         'ⓐ


    '여기서 lotto < 6 이 의미하는 것은, 50%의 확률로 가로선이 그어진다는 것입니다. (가로줄 듬성듬성 생성)

    '숫자값을 바꿔서 어떠한 변화가 나타나는지 확인해보세요.


        '바로 위 셀의 색깔이 검정색이 아니라면 (위 아래 가로줄이 겹쳐서 생기는 것을 방지)

        If Not Sheet1.Cells(p, q).Offset(-1, 0).Interior.Color = black Then        'ⓑ

            '좌측 두 번째 셀의 색깔이 검정색이 아니라면 (한 라인에 여러 개 선이 생기는 것을 방지)

            If Not Sheet1.Cells(p, q).Offset(0, -2).Interior.Color = black Then

                '우측 두 번째 셀의 색깔이 검정색이 아니라면 (한 라인에 여러 개 선이 생기는 것을 방지)

                If Not Sheet1.Cells(p, q).Offset(0, 2).Interior.Color = black Then

                    '바로 아래 셀의 색깔이 검정색이 아니라면 (위 아래 가로줄이 겹쳐서 생기는 것을 방지)

                    If Not Sheet1.Cells(p, q).Offset(1, 0).Interior.Color = black Then

                        '해당 셀의 색깔을 검정색으로 바꾼다 (가로선을 생성)

                        Sheet1.Cells(p, q).Interior.Color = black

                    End If

                End If

            End If

         End If

    

    

    End If

    q = q + 2  

    

    If q > Int_PQuantity * 2 Then  'ⓒ

    p = p + 1 'ⓓ

    q = 4 'ⓔ

    End If


 

Loop While p < 46 'ⓓ


lotto=Int(Rnd * 10) + 1 를 통해 lotto의 값을 랜덤하게 추출했습니다.

      아래 볼드체로 작성된 부분은 lotto 값이 6보다 작을 때에만 실행됩니다.

      lotto의 값은 1~10 사이의 숫자가 랜덤으로 지정됩니다.

      따라서, lotto<6은 50% 확률을 의미합니다.


가장 중요한 로직입니다.

3 가지 조건 (좌측에 이미 가로줄이 생성됨, 우측에 이미 가로줄이 생성됨, 바로 위에 이미 가로줄이 생성됨, 바로 아래에 이미 가로줄이 생성됨) 을 피해 가로줄을 생성하는 로직입니다. 일종의 필터와 같은 역할을 하죠.

위 로직을 거치지 않고 랜덤하게 가로줄을 만들었을 경우, 아래와 같이 엉망으로 만들어집니다.





보시다시피 가로줄이 상하좌우 가리지 않고 겹쳐있습니다.


필터를 거치게 되면 아래와 같이 생성됩니다.


아주 이상적인 모양으로 사다리타기가 생성된 모습입니다.


cells(p,q) 에서 p와 q는 각각 선택된 셀의 행값, 열값을 뜻합니다.


p를 1씩 증가시키고, 사다리의 우측 끝에 다다르면,

q를 2씩 증가시켜서 바로 아래 가장 좌측 셀으로 이동합니다.



위 과정이 반복됩니다.




초록색 테두리로 선택된 칸을 cells(p,q)라고 할 때, 위 그림과 같은 순서로 이동합니다.


(p,q) 로직 실행

(p,q+2) 로직 실행

...

맨 오른쪽에 닿으면

(p+1,q) 로직 실행

(p+1,q+2) 로직 실행

... 반복


즉,


①셀이 우측으로 한칸씩 이동하며 50% 확률로 검정색 가로줄을 그리는 로직을 실행시키며,

②로직을 통해 가로줄이 생성되면 안되는 부분에 가로줄이 생성되는 것을 막고,

③맨 오른쪽 칸에 다다르면, 바로 아래 행으로 이동해서 ①부터 다시 시작하는 것입니다.


 If q > Int_PQuantity * 2 Then 


해당 조건문은 셀이 우측 끝에 도달했는지를 확인하는 조건문입니다.


첫 번째 셀(검정색 좁은 셀부터 시작)의 열값을 1이라고 할 때,

가로줄이 들어가야 할 마지막 우측 셀은, 3명 기준으로 4, 4명 기준 6, 5명 기준 8이 됩니다.(인원 수*2 - 2)

따라서 열값 (인원 수*2 - 2)를 넘어갈 때에는 우측으로 더 이상 이동하지 않고, 하단 좌측 끝으로 이동하게 됩니다.


제가 만든 엑셀에서 q는 3부터 시작하기 때문에,

사실 정확한 수식은  If q - 2 > Int_PQuantity * 2 - 2 Then  입니다.

양쪽의 -2 는 생략되었습니다.



행값(p)에 1을 더해 하단의 셀을 선택합니다.


열값(q)를 4로 초기화 하여 좌측 셀부터 시작한다.





이상은 사다리타기 만들기의 첫 번째 과정인 사다리 만들기에 대한 해설이었습니다.


사실, 해설이란게 필요한지는 잘 모르겠습니다.


제 블로그를 정주행하셨다면, 내장되어있는 코드만 조금 연구해보시면 어떻게 사다리가 만들어지는지 충분히 이해하실 수 있으리라 생각합니다.


사용된 문법은 지극히 기초적입니다.


반복문, 조건문이 다입니다.


반복문과 조건문 만으로 정말 다양한 기능을 만들어낼 수 있습니다.


다음 편에서는 자동으로 사다리를 타고 내려오는 기능에 대한 설명을 담아보겠습니다.


Posted by Simon K

댓글을 달아 주세요