Android 앱개발 공부/TIL(Today I Learned)

[Android] TIL 6일차

bunny code 2024. 5. 28. 20:59

로또 번호 생성기 만들기


 

  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) }

 

clearButton by lazy{} : 초기화 버튼(btn_clear) 지정

addButton by lazy{} : 번호 추가하기 버튼(btn_add) 지정

runButton by lazy{} : 자동 생성 시작 버튼(btn_run) 지정

numPick by lazy{} : 번호 생성기(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))
}

: xml로 작성해둔 6가지 원 모양의 도형들을 차례대로 작성한 것 

 

 

 private var didRun = false
 private val pickNumSet = hashSetOf<Int>()

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

        numPick.minValue = 1
        numPick.maxValue = 45

        initRunButton()
        initAddButton()
        initClearButton()
    }

 

didRun = false : Run 버튼을 아직 누르지 않았으니 초기값은 false로 지정

hashSetOf<Int>()를 이용하여 정수형 자료를 정렬

 

번호 생성기에 최소값(minValue) 1과 최대값(maxValue) 45 사이의 숫자만 나오도록 지정 

 

 

 

<AddButton> 코드 내용

    private fun initAddButton() {
        addButton.setOnClickListener {
            when {
                didRun -> showToast("초기화 후에 시도해주세요.")
                pickNumSet.size >= 5 -> showToast("숫자는 최대 5개까지 선택할 수 있습니다.")
                pickNumSet.contains(numPick.value) -> showToast("이미 선택한 숫자입니다.")
                else -> {
                    val textView = numTextViewList[pickNumSet.size]
                    textView.isVisible = true
                    textView.text = numPick.value.toString()

                    setNumBack(numPick.value, textView)
                    pickNumSet.add(numPick.value)
                }
            }
        }
    }

 

 

didRun -> showToast("초기화 후에 시도해주세요.")

 

: 자동 생성 버튼을 누르고 난 후 AddButton을 누르면 "초기화 후에 시도해주세요"라는 문구가 나오도록 한다.

 

pickNumSet.size >= 5 -> showToast("숫자는 최대 5개까지 선택할 수 있습니다.")

: 5개 이상의 숫자를 추가하고 또 추가하려는 경우 "숫자는 최대 5개까지 선택할 수 있습니다." 라는 문구가 나오도록 한다.

 

 
pickNumSet.contains(numPick.value) -> showToast("이미 선택한 숫자입니다.")

: 이미 추가한 숫자를 또 추가하려고 할 경우 "이미 선택한 숫자입니다."라는 문구가 나오도록 한다.

 

else -> {
    val textView = numTextViewList[pickNumSet.size]
    textView.isVisible = true
    textView.text = numPick.value.toString()

    setNumBack(numPick.value, textView)
    pickNumSet.add(numPick.value)
}

: 위 3가지 경우가 모두 아니라면 선택한 숫자가 textView(원형)과 같이 보여지도록 한다.

 

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)
}

: 숫자가 1~10 사이면 노란색, 11~20은 파란색, 21~30은 빨간색, 31~40 초록색, 그 외는 초록색 원이 숫자 뒷 배경으로 보이도록 한다.

 

 

 

<ClearButton> 코드 내용

private fun initClearButton() {
    clearButton.setOnClickListener {
        pickNumSet.clear()
        numTextViewList.forEach { it.isVisible = false }
        didRun = false
        numPick.value = 1
    }
}

 

: 초기화 버튼을 눌렀을 때 숫자들이 전부 지워지고 didRun도 초기화 되어 초기값인 false로 돌아간다.

 

 

<RunButton> 코드 내용

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)
        }
    }
}

:  getRandom()에서 list를 가지고 오고, 가져온 text는 자료형으로 전환되며 바로 숫자들이 보여지도록 한다.

 

 

<getRandom> 코드 내용

private fun getRandom(): List<Int> {
    val numbers = (1..45).filter { it !in pickNumSet }
    return (pickNumSet + numbers.shuffled().take(6 - pickNumSet.size)).sorted()
}

: I1~45의 숫자 중 6가지의 숫자를 랜덤으로 뽑고 그 이후 sorted()를 통해 6가지의 숫자를 차례대로 정렬하여 보여준다.

'Android 앱개발 공부 > TIL(Today I Learned)' 카테고리의 다른 글

[Android] TIL 8일차  (0) 2024.05.30
[Android] TIL 7일차  (0) 2024.05.29
[Android] TIL 5일차  (0) 2024.05.27
[Android] TIL 4일차  (2) 2024.04.18
[Android] TIL 3일차  (0) 2024.04.17