2024.04.16

2024. 4. 16. 21:34TIL(Today I Learned)

// 로또 번호 자동 생성기 만들기

package com.example.mylotto

import android.os.Bundle
import android.widget.Button
import android.widget.NumberPicker
import android.widget.TextView
import android.widget.Toast
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.isInvisible
import androidx.core.view.isVisible

class MainActivity : AppCompatActivity() {

// xml파일로부터 고유한 Id를 통해 값을 찾아 by lazy 함수를 통해 고윳값을 지정(private value)
    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)}

// xml파일로부터 고유한 Id를 통해 값을 찾아 List 형태로 저장장
    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)
        )
    }

// didRun 값을 통해 로또 번호 생성이 시행되었는지 여부를 확인
    private var didRun = false
    private val pickNumberSet = hashSetOf<Int>()

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

// 생성되는 번호의 min, max값을 지정
        numpick.minValue = 1
        numpick.maxValue = 45

        initAddButton()
        initRunButton()
        initClearButton()
    }

// "번호 생성하기" 동작을 실행하는 initAddButton() 함수를 정의
    private fun initAddButton() {
        addbutton.setOnClickListener{
            when {
            // 로또번호 실행이 이미 된 경우, showToast 함수를 통해 팝업창을 띄움
                didRun -> showToast("초기화 후에 시도해주세요.")
                // 이미 고른 숫자가 6개인 경우 예외처리
                pickNumberSet.size >= 7 -> showToast("숫자는 최대 6개까지 선택할 수 있습니다.")
                // 이미 고른 숫자를 또 골랐을 경우 예외처리
                pickNumberSet.contains(numpick.value) -> showToast("이미 선택한 숫자입니다.")
                // 이외의 경우에 대해 정상 동작
                else -> {
                	// pickNumberSet(고른 숫자들) 사이즈만큼의 List를 textview로 지정
                    val textview = numTextViewList[pickNumberSet.size]
                    // RunButton 전까지는 숫자를 안 보이게 설정(Invisible)
                    textview.isInvisible = true
                    // 고른 숫자 값을 string으로 변환한 것을 textview.text로 지정
                    textview.text = numpick.value.toString()

					// 숫자 배경 색깔 지정하는 함수를 통해 색깔 지정
                    setNumBack(numpick.value, textview)
                    pickNumberSet.add(numpick.value)
                }
            }
        }

    }
	
    // 초기화하는 함수를 정의
    private fun initClearButton() {

        clearbutton.setOnClickListener {
            pickNumberSet.clear()
            numTextViewList.forEach { it.isVisible = false }
            didRun = false
            numpick.value = 1
        }
    }

	// 로또번호 생성 동작 함수 정의
    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)
            }
        }
    }

	// 이미 고른 숫자를 제외(filter)한 1~45 사이의 숫자들을 numbers로 지정하고, 
    // 이미 고른 숫자(pickNumberSet)과 고르지 않은 숫자(numbers)를 섞어(shuffled) 골라야 하는 
    // 숫자만큼(6 - pickNumberSet.size)) 고르고 나서, 정렬함(sorted)
    private fun getRandom(): List<Int> {
        val numbers = (1..45).filter{it !in pickNumberSet}
        return (pickNumberSet + numbers.shuffled().take(6-pickNumberSet.size)).sorted()
    }


    private fun setNumBack(number:Int, textView: TextView) {
        val background = when(number) {
            in 1..10 -> R.drawable.circle_yellow
            in 11..20 -> R.drawable.circle_blue
            in 21..30 -> R.drawable.circle_red
            in 31..40 -> R.drawable.circle_gray
            else -> R.drawable.circle_green
        }
        textView.background = ContextCompat.getDrawable(this, background)
    }


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


}