이번 포스팅에서는 로또번호를 생성하는 간단한 앱을 만들어보도록 하겠습니다.
사양 정의
버튼을 누르면 1~45 사이에서 랜덤하게 6개의 번호를 추출하고 번호에 대응하는 이미지를 화면에 표시하도록 합니다. 재미를 위해서 전체 번호의 합과, 홀짝 비율이 어떻게 되는지도 같이 화면에 표시해 주도록 하겠습니다.
화면 디자인
drawable
폴더에는 번호순서대로 숫자와 색깔을 반영시킨 로또 공 이미지를 저장합니다. 화면에 ImageView
그룹을 추가하여 로또 공 이미지를 표시하고, TextView
에는 번호합과 홀짝비율을 표시하도록 하겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android= "http://schemas.android.com/apk/res/android"
xmlns:app= "http://schemas.android.com/apk/res-auto"
xmlns:tools= "http://schemas.android.com/tools"
android:layout_width= "match_parent"
android:layout_height= "match_parent"
tools:context= ".MainActivity" >
<TextView
android:id= "@+id/textView"
android:layout_width= "wrap_content"
android:layout_height= "wrap_content"
android:layout_marginBottom= "50dp"
android:text= "로또번호 생성기"
android:textAppearance= "@style/TextAppearance.AppCompat.Large"
app:layout_constraintBottom_toTopOf= "@+id/linearLayout"
app:layout_constraintEnd_toEndOf= "parent"
app:layout_constraintStart_toStartOf= "parent" />
<LinearLayout
android:orientation= "vertical"
android:layout_width= "0dp"
android:layout_height= "wrap_content"
android:id= "@+id/linearLayout"
app:layout_constraintTop_toTopOf= "parent"
app:layout_constraintBottom_toBottomOf= "parent"
app:layout_constraintStart_toStartOf= "parent"
app:layout_constraintEnd_toEndOf= "parent" >
<LinearLayout
android:orientation= "horizontal"
android:layout_width= "match_parent"
android:layout_height= "match_parent" >
<ImageView
android:layout_width= "50dp"
android:layout_height= "50dp"
app:srcCompat= "@drawable/ball_00"
android:id= "@+id/iv_game0"
android:layout_weight= "1" />
<ImageView
android:layout_width= "50dp"
android:layout_height= "50dp"
app:srcCompat= "@drawable/ball_00"
android:id= "@+id/iv_game1"
android:layout_weight= "1" />
<ImageView
android:layout_width= "50dp"
android:layout_height= "50dp"
app:srcCompat= "@drawable/ball_00"
android:id= "@+id/iv_game2"
android:layout_weight= "1" />
<ImageView
android:layout_width= "50dp"
android:layout_height= "50dp"
app:srcCompat= "@drawable/ball_00"
android:id= "@+id/iv_game3"
android:layout_weight= "1" />
<ImageView
android:layout_width= "50dp"
android:layout_height= "50dp"
app:srcCompat= "@drawable/ball_00"
android:id= "@+id/iv_game4"
android:layout_weight= "1" />
<ImageView
android:layout_width= "50dp"
android:layout_height= "50dp"
app:srcCompat= "@drawable/ball_00"
android:id= "@+id/iv_game5"
android:layout_weight= "1" />
</LinearLayout>
<TextView
android:layout_width= "match_parent"
android:layout_height= "wrap_content"
android:layout_marginTop= "20dp"
android:gravity= "center"
android:text= "분석결과"
android:id= "@+id/tv_analyze" />
</LinearLayout>
<Button
android:id= "@+id/generateButton"
android:layout_width= "wrap_content"
android:layout_height= "wrap_content"
android:layout_marginTop= "50dp"
android:text= "로또번호 생성"
app:layout_constraintEnd_toEndOf= "parent"
app:layout_constraintStart_toStartOf= "parent"
app:layout_constraintTop_toBottomOf= "@+id/linearLayout" />
</androidx.constraintlayout.widget.ConstraintLayout>
로또번호 작성 파트
로또번호를 만들어내는 방법은 여러가지가 있을 수 있는데, 여기서는 1에서 45까지의 정수배열을 만들고 그걸 랜덤하게 섞은 뒤 앞에서 6개 번호만 잘라내는 방법을 사용하도록 하겠습니다.
우선 IntArray 를 써서 정수배열을 만듭니다. 이 배열을 섞기 위해서 shuffle 메소드를 사용하는데 이 때 Random 클래스 의 인스턴스를 seed로 사용함으로써 섞을때마다 랜덤성이 달라지게 할 수 있습니다. 이 때 시간을 Ramdom의 소스로 사용하면 매 순간마다 변화하는 시드를 사용할 수 있습니다. 여기서는 SimpleDateFormat 으로 밀리초까지 반영한 시간을 랜덤소스로 사용하도록 했습니다.
배열을 섞었으면 slice 로 앞에서 숫자 6개만을 잘라낸 뒤 sort 로 정렬을 시키면 준비 완료입니다. 그리고 홀짝의 갯수를 센 뒤, 전체 숫자의 합도 sum 을 이용하여 배열에 추가하여 줍니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
private fun createLottoNumbers (): ArrayList < Int > {
val result = arrayListOf < Int >()
val source = IntArray ( 45 ){ it + 1 }
val seed = SimpleDateFormat ( "yyyy-MM-dd'T'HH:mm:ss.SSSZ" , Locale . KOREA ). format ( Date ()). hashCode (). toLong ()
Log . d ( "TAG" , seed . toString ())
val random = Random ( seed )
source . shuffle ( random )
source . slice ( 0. . 5 ). forEach { num ->
result . add ( num )
}
result . sort ()
var evenNumberCount = 0
var oddNumberCount = 0
for ( num in result ) {
if ( num % 2 == 0 ) {
evenNumberCount += 1
} else {
oddNumberCount += 1
}
}
result . add ( result . sum ())
result . add ( oddNumberCount )
result . add ( evenNumberCount )
return result
}
번호의 화면표시 파트
여기서는 위에서 만들어진 로또번호 배열을 전달받아 화면에 공 이미지를 표시합니다.
우선 getDrawableID
에서 각 번호에 대응하는 공 이미지를 getIdentifier
로 확인한 뒤 updateLottoBallImage
로 전달합니다.
updateLottoBallImage
에서는 전달받은 ID를 이미지뷰에 표시하고 나머지 텍스트 정보는 텍스트뷰에 표시하면 완료입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private fun getDrawableID ( number : Int ): Int {
val number = String . format ( "%02d" , number )
val string = "ball_ $number "
val id = resources . getIdentifier ( string , "drawable" , packageName )
return id
}
private fun updateLottoBallImage ( result : ArrayList < Int >) {
with ( binding ) {
ivGame0 . setImageResource ( getDrawableID ( result [ 0 ]))
ivGame1 . setImageResource ( getDrawableID ( result [ 1 ]))
ivGame2 . setImageResource ( getDrawableID ( result [ 2 ]))
ivGame3 . setImageResource ( getDrawableID ( result [ 3 ]))
ivGame4 . setImageResource ( getDrawableID ( result [ 4 ]))
ivGame5 . setImageResource ( getDrawableID ( result [ 5 ]))
tvAnalyze . text = "번호합: ${result[6]} 홀:짝= ${result[7]} : ${result[8]} "
}
}
이렇게 해서 간단한 로또번호 생성기를 만드는 법에 대해 알아보았습니다.
VIDEO