타닥타닥 개발자의 일상

Kotlin 코틀린으로 랜넘 넘버 맞추는 안드로이드 빙고게임 만들기 / LinearLayout 이용한 동적 버튼 만들기 / spinner 사용 본문

코딩 기록/Kotlin

Kotlin 코틀린으로 랜넘 넘버 맞추는 안드로이드 빙고게임 만들기 / LinearLayout 이용한 동적 버튼 만들기 / spinner 사용

NomadHaven 2022. 2. 12. 16:57
<빙고게임 규칙>

1. 자신이 고를 숫자의 범위를 첫번째 화면에서 선택한다.
2. 프로그램이 랜덤번호를 1개 생성한다.
2.프로그램이 정한 랜덤넘버와 일치하는 번호를 누르면 bingo, 다른 번호를 누르면 safe다.

bingo걸린 사람이 커피쏘기 혹은 bingo 걸린 사람이 상금 타기 등등으로 활용할 수 있다.

 

 

파일 및 폴더 구성

com.example.binggobingo 폴더 우클릭 > 새로만들기  > Activity > Empty Activity 클릭해서 SecondActivity 생성

res > layout > item_spinner.xml 생성

res > values > array.xml 생성

 

 


스피너 생성을 위한 기본 설정

 

item_spinner.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/tvItemSpinner"

        android:layout_width="match_parent"
        android:layout_height="45dp"

        android:paddingTop="10dp"
        android:paddingStart="30dp"
        android:textColor="@android:color/black"
        android:textSize="15sp"
        android:paddingLeft="30dp"/>

 

array.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="number">
        <item>0</item>
        <item>1</item>
        <item>2</item>
        <item>3</item>
        <item>4</item>
        <item>5</item>
        <item>6</item>
        <item>7</item>
        <item>8</item>
        <item>9</item>
    </string-array>
</resources>

 


activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    <Spinner
            android:id="@+id/spinner"
            android:layout_width="350dp"
            android:layout_height="57dp"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintVertical_bias="0.433"
            app:layout_constraintHorizontal_bias="0.165"/>
    <Button
            android:id="@+id/setBtn"
            android:text="SET"
            android:layout_width="131dp"
            android:layout_height="107dp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintHorizontal_bias="0.895"
            app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintVertical_bias="0.33"/>
    <Button
            android:id="@+id/startBtn"
            android:text="Start"
            android:layout_width="131dp"
            android:layout_height="107dp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintHorizontal_bias="0.895"
            app:layout_constraintTop_toBottomOf="@+id/setBtn" android:layout_marginTop="32dp"/>
    <TextView
            android:text="0은 기본 값이며 선택한 값이 아닙니다."
            android:layout_width="342dp"
            android:layout_height="35dp" android:id="@+id/textView"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintBottom_toTopOf="@+id/spinner"
            app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.962"
            app:layout_constraintHorizontal_bias="0.168"/>
</androidx.constraintlayout.widget.ConstraintLayout>

 

MainActivity.kt
package com.example.bingobingo

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.*
import androidx.core.content.edit

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

        val setBtn = findViewById<Button>(R.id.setBtn)
        val startBtn = findViewById<Button>(R.id.startBtn)
        val spinner =findViewById<Spinner>(R.id.spinner)

        setUpSpinnerNumber()


        setBtn.setOnClickListener {
            val pref = getSharedPreferences("pref", MODE_PRIVATE)
            val editor = pref.edit()
            val userNum = spinner.selectedItem.toString().toInt()
            val toast = Toast.makeText(this.applicationContext, "선택값 저장", Toast.LENGTH_SHORT)
            editor.putInt("number",userNum)
            editor.commit()


            if(userNum!=0){
                toast.show()

            }


        }

        startBtn.setOnClickListener {
            val intent = Intent(this, SecondActivity::class.java)
            val userNum = spinner.selectedItem.toString().toInt()
            val toast = Toast.makeText(this.applicationContext, "0외의 수를 선택하시오.", Toast.LENGTH_SHORT)

            if(userNum!=0){
                startActivity(intent)
            }
           else{
                toast.show()
           }


        }


    }

    fun setUpSpinnerNumber(){
        val number = resources.getStringArray(R.array.number)
        val adapter = ArrayAdapter(this,R.layout.item_spinner,number)
        val spinner = findViewById<Spinner>(R.id.spinner)
        spinner.adapter = adapter
}

    fun setUpSpinnerHandler(){
        val spinner = findViewById<Spinner>(R.id.spinner)
    }


}

 


activity_second.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".SecondActivity">

    <LinearLayout
            android:orientation="vertical"
            android:layout_width="452dp"
            android:layout_height="542dp"
            android:id="@+id/linearLayout" app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent" app:layout_constraintVertical_bias="0.193"
            app:layout_constraintHorizontal_bias="0.567">
    </LinearLayout>
    <Button
            android:text="Restart"
            android:layout_width="162dp"
            android:layout_height="129dp" android:id="@+id/restartBtn"
            app:layout_constraintTop_toBottomOf="@+id/linearLayout"
            app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>

 

 

SecondActivity.kt
package com.example.bingobingo

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.LinearLayout
import android.widget.Toast

class SecondActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)

        match()

        var restartBtn = findViewById<Button>(R.id.restartBtn)


        restartBtn.setOnClickListener {
            val linerLayout = findViewById<LinearLayout>(R.id.linearLayout)
            linerLayout.removeAllViews()
            match()
        }

    }


    

    fun match(){

        val pref = getSharedPreferences("pref", MODE_PRIVATE)
        var number:Int = pref.getInt("number",0)

        val linearLayout =  findViewById<LinearLayout>(R.id.linearLayout)

        var childLayout:LinearLayout? = null



        var randomNum = (Math.random() * number).toInt() + 1
        var btnCount = number

        for(i in 0 until btnCount){

            if(i % 3 == 0) { //horizontal layout 3개 만들어서 linearlayout 한칸에 붙인다.

                childLayout = LinearLayout(this)
                childLayout.orientation = LinearLayout.HORIZONTAL
                val layoutParams =
                    LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 200) //horizontal layout
                childLayout.layoutParams = layoutParams
            }
            //가로와 세로를 모두 match parent로 매치 레이아웃 만드는 부분
            val btnParams = LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT)
            btnParams.weight = 1.0f

            //버튼 생성 및 버튼 할당하는 부분
            val normalBtn = Button(this).apply {

                text = (i + 1).toString()  //normalBtn.text =(i+1).toString()과 동일
                layoutParams = btnParams //동일한 크기의 버튼 넣어준다.
                id = i //버튼의 아이디가 순서대로 정해진다.


                setOnClickListener{

                    val btn = findViewById<Button>(id)

                    if(randomNum==id+1){
                        btn.text = "BINGO!"
                    }else{
                        btn.text ="SAFE"
                        btn.isEnabled = false
                    }
                }
            }

            childLayout?.addView(normalBtn)

            if(i % 3 == 2 || i == (btnCount-1)){
                linearLayout.addView(childLayout)
            }

        }

    }

}

 

 

실행화면

 

 

 

첫 페이지에서 선택한 숫자에 따라 두번째 페이지에서 생성되는 버튼의 수가 달라진다.

Comments