Notice
Recent Posts
Recent Comments
Link
«   2024/06   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
Archives
Today
Total
관리 메뉴

시작은 0부터

22. 달팽이형식 2차 도전 ( 코드 간편화 ) 본문

C# 학습일지

22. 달팽이형식 2차 도전 ( 코드 간편화 )

0base 2022. 7. 29. 00:29

지뢰찾기까지 모든 과제를 마치고 콘솔RPG를 시작하려는 찰나 교수님께서 달팽이형식 만들기를 다시 시키셨다. 이전에 만든 코드보다 더 간결하게 만들 것을 제안하셨는데, 기존에 방식보다 더 간단한 코드를 예전에 동기형이 보여준 사이트에서 얼추 기억하고 있던 것이 있었다. 2차원 배열 0, 0에서 시작해서 방향을 설정하는 함수 -1를 지정하고 상하좌우 방향을 두번 꺾을 때 마다 *1을 해주어 양수로 만들어서 X++(우측이동) Y++(아래이동) , X--(좌측이동) Y--(위로이동) 을 반복하는 구조로 for문 두개로 만들어진 상당히 가벼운 코드였다. 얼추 기억하는 것은 이정도 뿐이라 이 정보를 바탕으로 두개의 for문으로 코드를 짜보려고 했는데 생각처럼 되지 않는다.

 

이전에 만들었을 때도 약간 이상한 방법으로 힘들게 구현했는데, 보다 간결하게 만들어야한다는 강박 때문인지 원리를 대충 알더라도 코드로 어떻게 만들어야할 지 감이 오지 않는다. 그래서 결국 for문을 쓰지 않는 교수님의 코드 방식을 사용하기로 했다. 교수님의 코드는 상하좌우 이동을 결정하는 변수를 만들어 각 변수마다 if문으로 이동하는 구조였다. 그런데 이것도 막상 코드로 만들려니 머리가 안돌아간다.

 

while(count != arr.Length)
            {
                if (x < X && y < Y)
                {
                    if (dir == 0)
                    {
                        if (arr[y, x] != 0)
                        { dir = 1; }
                        else
                        {
                            count++;
                            x++;
                            arr[y, x] = count;
                            
                        }
                    }

                    if (dir == 1)
                    {

                        if (arr[y, x] != 0)
                        { dir = 2; }
                        else
                        { 
                            arr[y, x] = count;
                            count++;
                            y++;
                        }
                    }

                    if (dir == 2)
                    {
                        
                        if (arr[y, x] != 0)
                        { dir = 3; }
                        else
                        {
                            count++;
                            x--;
                            arr[y, x] = count;
                        }
                    }

                    if (dir == 3)
                    {
                        
                        if (arr[y, x] != 0)
                        { dir = 0; }
                        else
                        {
                            count++;
                            y--;
                            arr[y, x] = count;
                        }
                    }
                }

while문으로 카운트를 세다가 카운트가 배열의 최대값에 도달하면 그리기를 종료하고, 각 축이 배열의 범위를 벗어나지 않도록 하기 위해 if문으로 도입부에 조건을 걸었다. 방향을 결정하는 dir 변수의 초기값은 0이므로, 처음은 자동으로 우측으로 이동한다. 그리고 이동하다가 값이 넣어진 부분이나 배열의 위치를 벗어나면 다음 방향으로 전환하는 코드를 만들려고 했는데 어디선가 문제가 생겨 그려지지 않는다. 논리적으로 코드를 짜는 실력이 많이 부족한 것 같다. 주말에 코드 짜는 연습을 더 해야겠다.