Ad Block 한번만 꺼주시면 안될까요..?
게임 개발/게임수학

유니티 콜라츠 추측 계산기 - 2부

UniCoti(유니코티) 2022. 9. 19.

2편으로 돌아왔다. 

생각해보니 1편에서 콜라츠 추측이 뭔지 설명안해서

지금 수정하고 와야겠다.

 

수정끝.

본격적으로 코드를 써보겠다.

Scripts 폴더를 하나 만들어준다.

솔직히 내 반년전 코딩실력과 지금 코딩실력은 다를바가 많이 없지만

다른점은 폴더를 만들기, 주석쓰기, 코드를 체계적으로 쓰기

등 체계에 관한 부분이다.

결론은 폴더같은거 만드는거는 중요하다는 거다.

 

아무튼 폴더안에 "UIManager"라는 C# 스크립트를 만들어준다.

그리고 열어준다.

 

일단 우리가 해야만 하는것은

 

버튼을 눌렀을때

입력칸에서 값을 받아와,

계산을 한뒤 Text로 넘기는 것이다.

 

그렇기때문에

우리는 버튼, 입력칸, Text를 가져올 필요가 있다.

 

그런 이유로

using TMPro;

를 맨 위에 넣어서

TMP를 사용할 수 있도록 해주고,

public TextMeshProUGUI ResultText;
public TMP_InputField Input;

이런 코드를 써서 나중에 에디터로 두 오브젝트를 불러올 수 있도록 해준다.

 

버튼 오브젝트를 안가져온 이유는 버튼은 상호작용을 하는 기능을

유니티내 에서 지원해주기 때문이다.(컴포넌트 Button)

이걸 쓰면 된다.

 

일단 이걸 유니티 에디터에서 가져와준다.

빈 오브젝트를 하나 만들어준다.

이름을 UIManager로 고쳐주고,

스크립트를 넣어준다.

그럼 이렇게 두 넣을 공간이 생긴다.

Result Text에는 변동값확인을 드래그하여 넣어주고,

Input에는 입력칸을 드래그하여 넣어준다.

이렇게 유니티 에디터 내에서 연결해주는 것을

"아웃렛 연결" 이라고 한다.

있어보이도록 알아두자.

이런 상태가 되었다면

이제 다시 코드로 돌아가자.

public void OnCheckBtnClick() { //버튼 이벤트
        ResultText.text = ""; // 전 결과 초기화
        float n = float.Parse(Input.text); //입력칸 값 받아오기
        while(n != 1) { //1이 될때까지 실행
            ResultText.text += n.ToString() + " ";
            if(n%2 == 0) { //짝수라면
                n = n * 0.5f; //2로 나누기 (2분의 1 곱하기)
                //n *= 0.5f;
            } else { //홀수라면
                n = n * 3 + 1; //3곱하고 1더하기
            }
        }
        ResultText.text += "1"; //마지막 1 추가
    }

좀 막막해보이지만 생각보다 별거없다.

버튼 이벤트를 위한 함수를 만들어주었다.

먼저 제일 처음으로 전 결과에 계속 더해지는걸 막기 위해

초기화를 해주고,

 

사용자가 입력한 값을 받아와준다.

그리고  While문을 사용하여

1이 아니라면 계속 실행하게 해주었다.

즉, 1이 될때까지 저 안의 if문이 실행되는것이다.

 

While안쪽을 살펴보자면

While이 한번 반복될때마다 결과에

하나씩 추가함으로서 

중간중간 변하는 값을 실시간으로 추가해주었다.

 

그리고 if문을 두었는데, %연산자는 뒤의 숫자로 나눴을때 나머지 값이다.

즉 2로 나눴을때 남는게 없다면, 짝수이고,

남는게 있다면 홀수인 것이다.

 

그래서 짝수면 2로 나누기코드를 썻는데,

잘보면 /2 가 아닌 * 0.5f로 되어있다.

이유가 무엇일까? 이유는 나누기를 하는 과정보다

곱하기를 하는게 연산을 덜 하기 때문이다.

그래서 2로 나누기대신 2분의 1을 곱해주는게

 

더 최적화가 좋다. 연산량이 급격하게 많아질수도 있는 구조기에

이런거 하나하나가 좀 중요하다.

 

그리고 홀수있대는

3을 곱하고 1을 더해주는 코드를 주었다.

 

그리고 While문을 빠져나가면, (1이 되면)

결과 텍스트에 1을 더해주는 코드가 있는데,

 

이유는 n이 1이 되자마자 나가버려서

1이 텍스트에 포함이 안되서

끝이 2로 나온다.

1로 끝나야 보기 좋기에 저런 코드를 넣어주었다.

 

이제 코드를 저장하고,

확인버튼의 Button 컴포넌트에 이런식으로 "아웃렛 연결" 해준다.

이제 실행해서 확인해보자.

아무 정수나 놓고 돌리면 콜라츠의 추측이 맞는 모습을 보여준다.

 

이제 완성같아 보이지만

항상 그랬듯이 유저들은 미쳐있기에

예상못할 상황이 생긴다.

 

예를들어 한글을 입력한다던지

영어 입력,

소수입력,

음수입력등 골치아프기때문에

입력칸의 텍스트 컴포넌트의 Content Type을 Integer Number 정수형으로 변경해주면

소수입력, 한글, 영어입력을 막을 수 있다.

음수는 입력되는데, 콜라츠추측을 음수에 대입하면 

4-2-1 이 아닌 다른 패턴 3가지를 발견할 수 있으니 

음수를 넣어봐도 좋을 것 같다.

 

이상 콜라츠 추측 계산기였고,

시간이 많이 늦었는데,

빨리 자고싶다

이런 계산기를 만들때 수학에 재미를 느끼는것같다.

 

도움이 되었길 바라며,

 

끝.

댓글

💲 추천 글