본문 바로가기

Android Project

[kotlin]간단한 로또번호 생성앱 만들기

내가 원하는 번호를 선택해서 추가할수있고 자동생성시작 버튼을 누르면 내가 포함한값을 빼고 랜덤으로 번호가 자동생성되는 간단한 로또번호 생성앱을 만들어볼것이다.

내가 번호를 추가하지 않으면 6개가 아얘 랜덤으로 생성이 되고, 초기화버튼을 누르면 공과 번호 picker 선택창도 초기화된다

 

먼저 화면은 이렇게 디자인해줬다

로또 번호 선택하는 부분은 NumberPicker를 사용하여 디자인해줬고,

숫자적힌 공은 visiblity = "gone" 로 설정해서 일단 안보이게 해줬다 

activity_main

 

 

class MainActivity : AppCompatActivity() {

    // lazy를 사용해서 미리 선언
    private val clearButton by lazy { findViewById<Button>(R.id.btn_clear) }
    private val addButton by lazy { findViewById<Button>(R.id.btn_add) }
    private val runButton by lazy { findViewById<Button>(R.id.btn_run) }
    private val numPick by lazy { findViewById<NumberPicker>(R.id.np_num) }

    // 리스트 안에 공들을 넣어놓음
    private val numTextViewList : List<TextView> by lazy {

        listOf<TextView> (
            findViewById(R.id.tv_num1),
            findViewById(R.id.tv_num2),
            findViewById(R.id.tv_num3),
            findViewById(R.id.tv_num4),
            findViewById(R.id.tv_num5),
            findViewById(R.id.tv_num6),

            )
    }

    // 실행중인지
    private var didRun = false

    // 사용자가 지정한 숫자를 담아둘 공간
    private val pickNumberSet = hashSetOf<Int>()




    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 숫자 선택할수 있는 picker에 최대,최솟값 주기
        numPick.minValue = 1
        numPick.maxValue = 45


        initAddButton()
        initRunButton()
        initClearButton()

    }


    // 생성버튼 (아무것도 없을땐 6개 자동생성, 번호 2개있다고 가정하면 2개를 제외한 4개 자동생성 )
    private fun initRunButton() {
        runButton.setOnClickListener {
            // 랜덤값 가져오는 함수
            val list = getRandom()

            didRun = true


            list.forEachIndexed { index, number ->

                val textView = numTextViewList[index]
                textView.text = number.toString()       // 공집어넣은 리스트들에 숫자 보이게
                textView.isVisible = true               // 공 보이게

                // 색깔 선택함수 실행
                setNumBack(number, textView)

            }

        }
    }



    // 랜덤값 가져오는 함수
    // 랜덤함수는 반환값이 있음(List형태의 숫자로 반환해줘야함)
    private fun getRandom() : List<Int> {
        // 1~45까지의 숫자중에 pickNumberset(선택한수)에 해당하는 숫자는 뺴고
        // ex) 4,5 선택했으면 4,5빼고
        val numbers = (1..45).filter { it !in pickNumberSet }

        // pickNumberSet에 numbers를 섞어서 더해주고, 6-pickNumberSet만큼의 사이즈 리턴
        return (pickNumberSet + numbers.shuffled().take(6 - pickNumberSet.size)).sorted()

    }


    // 초기화 함수
    private fun initClearButton() {

        clearButton.setOnClickListener {

            // 슷자 담아둔 공간 클리어
            pickNumberSet.clear()

            // 공들 안보이게
            numTextViewList.forEach{it.isVisible = false}

            didRun = false

            // picker값 1으로 초기화
            numPick.value = 1

        }
    }




    // 숫자 추가 함수
    private fun initAddButton() {
        addButton.setOnClickListener {

            when{
                // 자동생성 버튼이 눌려서 꽉차있는 경우
                didRun -> showToast("초기화 후 시도해주세요")
                // 숫자가 5개 이상일떄
                pickNumberSet.size >= 5 -> showToast("숫자는 최대 5개까지 선택할수있습니다")
                // 같은 숫자가 있을때
                pickNumberSet.contains(numPick.value) -> showToast("이미 선택된 숫자는 선택할수없습니다")

                else -> {
                    // 예외가 없을때
                    // pickNumberSet의 사이즈만큼 넣어줌
                    val textView = numTextViewList[pickNumberSet.size]
                    textView.isVisible = true
                    // 공에 숫자 넣기
                    textView.text = numPick.value.toString()

                    // 색깔 선택함수 불러옴
                    setNumBack(numPick.value , textView)

                    // 숫자 담아둔 공간에 숫자 넣어줌
                    pickNumberSet.add(numPick.value)

                }
            }


        }
    }



    // 색깔 선택 함수
    private fun setNumBack (number : Int, textView : TextView){
        val background = when(number) {

            in 1..10 -> R.drawable.circle_yellow    // 1~10 노랑
            in 11..20 -> R.drawable.circle_blue     // 1~10 블루
            in 21..30 -> R.drawable.circle_red      // 1~10 레드
            in 31..40 -> R.drawable.circle_gray     // 1~10 그레이
            else -> R.drawable.circle_green               // 그외 그린
        }

            textView.background = ContextCompat.getDrawable(this, background)

    }
    
    
    private fun showToast(message : String){
        Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
    }


}

MainActivity.kt

 

 

 

MainActivity로가서 선언해줄 레이아웃들을 미리 선언해준다

공6개들을 리스트에 미리 담아놓고, 사용자가 지정한 숫자를 담아둘 공간도 선언해준다

그리고 실행중인지를 didRun을 통해 선언해놓는다. 지금은 false로 선언해서 실행중이 아니라고 설정한다

 

그리고 NumberPicker부분에는 최솟값과 최댓값 을 설정해야하기때문에 각각 1과 45로 설정해주어서 1~45까지 선택할수있도록 한다

 

이제 자동생성시작버튼을 누르면 작동할 부분을 initRunButton()이라는 함수를 만들어서 적용해볼것이다

자동생성시작 버튼을 눌렀을때 getRandom()함수를 통해 랜덤값을 가져오고, didRun = true로 설정해서 실행중이라고 설정한다. getRandom()함수 안에는 내가 선택한 숫자는 뺀뒤에 그값을 섞은후 6-내가지정한 숫자의 개수만큼 리턴한값을 내가 지정한 숫자 에 더해서 이 값들을 sorting(정렬)해준다... 헷갈린다...

예를들어보면, 1~45까지 숫자중에 내가 2,3을 선택했으면,   2,3을 뺀값을 섞은후에 6 - 2(내가 선택한숫자의 개수)에 내가 선택한 숫자를 합쳐서, 이값들을 오름차순으로 정렬해주는것이다

 

그리고 아까 리스트안에 집어넣은 숫자공의 숫자를 집어넣고, 공을 보이게 선택해준다.

숫자에 따라 색상이 다르게 나오도록 해야하므로 setNumBack()함수를 만들어서 해당하는 숫자에따라 백그라운드 색이 바뀌도록 지정해준다.   이렇게 만든 setNumBack함수에 number값과 textView값을 집어넣어 번호에따라 색상도 바뀌게 설정해준다

 

다음으로 initClearButton 함수를 만들어서 초기화버튼을 눌렀을때 공들을 담아놓은 공간(pickNumberSet)을 클리어해주고, isVisible = false로해서 공들이 안보이게 설정해준다. 그리고 실행상태도 아니라고 설정해주고, picker값이 1에 위치하도록 설정해준다. 이 함수에서는 다 초기화해준다고 생각하면 될것같다

 

마지막으로 가장 중요한 initAddButton()함수를 만들어서 번호추가하기 버튼을 눌렀을때 해당되는 번호가 추가되도록 할것이다. 근데 이 버튼은 자동생성버튼이 눌려서 꽉차 있는 경우와, 숫자가 5개 이상일때, 그리고 같은 숫자가 있을때는 작동하지 않도록 해야되므로 when ~ else문을 사용해서 예외처리를 해준다

else문에는 예외처리가 없을 때, 즉 번호가 랜덤으로 초기화되게 넣어줘야한다

numTextViewList 공을 넣어놓은 리스트안에 pickNumberSet의 사이즈만큼 넣어주고, 이거를 화면에 보이도록 해준다

그리고 공에 숫자와 색깔을 넣어주면 번호가 잘 추가되는 것을 볼수있다