2024.04.16
2024. 4. 16. 21:34ㆍTIL(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()
}
}
'TIL(Today I Learned)' 카테고리의 다른 글
240430_디모의 코틀린 문법 강의 정리 #3강. 형변환과 배열 (0) | 2024.04.30 |
---|---|
240429_디모의 코틀린 문법 강의 정리 #2강. 변수와 자료형 (0) | 2024.04.29 |
2024.04.18 (0) | 2024.04.18 |
2024.04.17 (0) | 2024.04.17 |
2024. 04. 15 (0) | 2024.04.15 |