로또번호 생성기_ MainActivity.kt
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)
3 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 집어 넣기
}
9 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()
}
}