연습장/실습

로또번호 생성기_ MainActivity.kt

아이른 2024. 1. 19. 17:39

package com.example.numberlottery

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

class MainActivity : AppCompatActivity() {

1  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 {

//여섯개의 공을 리스트 목록에 넣어 선언: List<타입:TextView>
        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))
    }

2  private var didRun = false

//run이 실행중인지 확인해보는 변수: didRun

//현재 실행중이 아니므로 초기값: false 로 지정

//didRun=true일 경우, 번호 생성이 하는 곳이 꽉 차있기 때문에 번호 추가가 되지 않음
    private val pickNumSet = hashSetOf<Int>()
//사용자가 지정하는 숫자를 잠깐 담아둘 공간: hasgSetOf<Int>
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

    numPick.minValue = 1
        numPick.maxValue = 45

//숫자의 최대, 최솟값을 먼저 설정

        initRunButton()
        initAddButton()
        initClearButton()

//함수 3개를 호출하는 버튼
    }

4  private fun initAddButton() {
        addButton.setOnClickListener {

//didRun=false 이후 "번호 추가"버튼을 눌렀을 때 실행
6          when {
                didRun -> showToast("초기화 후에 시도해주세요.")

//자동 생성을 눌렀을 때, 칸 안이 꽉 차있을 때 문주 추가 > 5번
                pickNumSet.size >= 5 -> showToast("숫자는 최대 5개까지 선택할 수 있습니다.")

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

//숫자 중복 제한 설정
                else -> {
                    val textView = numTextViewList[pickNumSet.size]

//pickNumSet을 눌렀을때 숫자를 가져오는 코드
                    textView.isVisible = true

//false > true
                    textView.text = numPick.value.toString()
//공이 생성이 되고 그 공에 숫자가 써짐


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

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

//textView에 background 집어 넣기
    }

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

//공을 추가하면서 visible을 ture로 바꾼껄 다시 꺼줘야함
            didRun = false
            numPick.value = 1

        }
    }

10  private fun initRunButton() {

//지정한 번호가 추가 된 이후 남은 번호를 자동을 생성
        runButton.setOnClickListener {
12          val list = getRandom()

//남은 번호를 자동=랜덤으로 넣음
            didRun = true

            list.forEachIndexed { index, number ->
                val textView = numTextViewList[index]
                textView.text = number.toString()
                textView.isVisible = true
                setNumBack(number, textView)
            }
        }
    }

11  private fun getRandom(): List<Int> {
        val numbers = (1..45).filter { it !in pickNumSet }

//pickNumSet을 제외한 숫자: {it !in pickNumSet}
        return (pickNumSet + numbers.shuffled().take(6 - pickNumSet.size)).sorted()

//numbers: 지정한 숫자를 제외한 숫자_ shuffied: 남은 숫자들을 섞음

//take: 섞은 숫자를 불러옴

//어떤 섞은 숫자? (6 - pickNumSet.size): 6- 지정한 숫자를 뺀 나머지 숫자 

//sorted: 차례로 숫자가 나옴
    }

5  private fun showToast(message: String) {

//메세지를 띄울 수 있는 Toast
        Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
    }
}