상세 컨텐츠

본문 제목

[안드로이드 코틀린] 야구 게임 만드는 방법 part3 - 기능 구현

안드로이드

by aries574 2022. 8. 31. 12:48

본문


이번 시간에는 마지막으로 기능 구현을 알아보겠습니다.

이전 포스팅은 아래 링크를 들어가시면 됩니다.

2022.08.30 - [안드로이드] - [안드로이드 코틀린] 야구 게임 만드는 방법 part2 - 랜덤 숫자 생성

 

[안드로이드 코틀린] 야구 게임 만드는 방법 part2 - 랜덤 숫자 생성

이번 시간에는 야구 게임 랜덤 숫자 생성하는 방법을 알아보겠습니다. 목차 1. 실행 화면 2. 메인 코드 MainActivity.kt 1. 실행 화면 2. 메인 코드 MainActivity.kt - 설명 -  1. randomNumber()  ..

aries574.tistory.com


목차

1. 실행 화면
2. 메인 코드 MainActivity.kt


1. 실행 화면

 

2. 메인 코드 MainActivity.kt

- 설명 -

 1. viewMode(mode: String)

   - 화면 구조 함수

   - 버튼 활성화 설정 및 색상 변경

 2. reset()

   - 기회 횟수, 답변, 결과 목록 초기화

 3. showResult(inputNumber: String)

   - 결과 보여주는 함수

   - Strike 3개면 성공

   - lifeCount 0이면 실패

   - 그 외는 계속 진행

 4. numberCheck()

   - 입력 숫자

비교

함수

 5. toastMessage(message: String)

   - 알림 함수

class MainActivity : AppCompatActivity() {

    lateinit var requestText: EditText //입력 텍스트
    lateinit var responseText: TextView //정답 체크
    lateinit var resultText: TextView //결과 모음
    lateinit var lifeCountText: TextView // 기회 횟수

    lateinit var startBtn: Button
    lateinit var answerBtn: Button
    lateinit var resetBtn: Button

    //랜덤 숫자 배열
    private val comNumbers: Array<Int?> = arrayOfNulls<Int>(3)

    //사용자 입력 배열
    private val userNumbers: Array<Int?> = arrayOfNulls<Int>(3)

    //기회 횟수
    private var lifeCount: Int = 10

    //스트라이크(위치랑 숫자 둘 다 맞춤)
    var strike: Int = 0

    //볼(숫자만 맞춤)
    var ball: Int = 0

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

        //입력된 숫자가 보여지는 텍스트
        requestText = findViewById(R.id.request_text)

        //정답이 맞는지 보여주는 텍스트
        responseText = findViewById(R.id.response_text)

        //기회 횟수
        lifeCountText = findViewById(R.id.life_count_text)

        //결과 모음
        resultText = findViewById(R.id.result_text)

        //버튼
        startBtn  = findViewById(R.id.start_btn)
        answerBtn = findViewById(R.id.answer_btn)
        resetBtn  = findViewById(R.id.reset_btn)

        //쉬는 중
        viewMode("end")

        //시작 버튼
        startBtn.setOnClickListener {

            //랜덤 숫자 생성
            randomNumber()

            toastMessage("게임 시작")

            viewMode("start")
        }

        //정답 버튼
        answerBtn.setOnClickListener {

            //숫자 비교
            numberCheck()
        }

        //초기화 버튼
        resetBtn.setOnClickListener {

            toastMessage("초기화")

            viewMode("end")

            //초기화
            reset()
        }

    }//onCreate

    /**
     * 랜덤 숫자 생성
     */
    private fun randomNumber() {

        //중복 방지 위한 HashSet
        val set: HashSet<Int> = HashSet()

        //set 담는 List
        val list: ArrayList<Int> = ArrayList()

        //숫자 3개 담을 때까지 반복
        while (set.size < 3){

            //랜덤 숫자 1 ~ 9 생성
            val randomValue = Random.nextInt(8) + 1

            //담기
            set.add(randomValue)
        }

        //list 담기
        list.addAll(set)

        //순서 섞기
        list.shuffle()

        //배열에 숫자 담기
        for((index, number: Int) in list.withIndex()){

            comNumbers[index] = number
        }

    }

    /**
     * 숫자 비교
     */
    private fun numberCheck(){

        //기회 횟수 감소
        --lifeCount

        lifeCountText.text = "기회 $lifeCount 번"

        //입력값
        val inputNumber: String = requestText.text.toString()

        //숫자 3개 입력 체크
        if(inputNumber.length == 3){

            //사용자가 입력한 숫자 배열에 담기
            userNumbers[0] = inputNumber.substring(0,1).toInt()
            userNumbers[1] = inputNumber.substring(1,2).toInt()
            userNumbers[2] = inputNumber.substring(2,3).toInt()

            //랜덤값과 입력값 비교
            for(num: Int in 0..2){

                for(num2: Int in 0..2){

                    //랜덤 숫자와 입력 숫자가 같다면
                    if(comNumbers[num] == userNumbers[num2]){

                        //위치까지 맞다면
                        if(num == num2){
                            strike++
                        }else{ //위치까진 아님
                            ball++
                        }
                    }
                }//내부 For
            }//외부 For

            //1. 숫자 다 맞음
            if(strike == 3){
                toastMessage("성공")

                //답변
                responseText.text = "정답: ${comNumbers[0]}, ${comNumbers[1]}, ${comNumbers[2]}"
            }
            else if(lifeCount == 0){ //2. 기회 횟수 없음
                toastMessage("실패")

                //답변
                responseText.text = "정답: ${comNumbers[0]}, ${comNumbers[1]}, ${comNumbers[2]}"

            }
            else{ //3. 계속 진행
                responseText.text = "Strike: $strike , Ball: $ball"

                //목록
                showResult(inputNumber)
            }


            //초기화
            requestText.setText("")
            strike = 0
            ball = 0

        }else{ //숫자 3개 입력 안되었다면
           toastMessage("숫자 3개를 입력해주세요.")
        }
    }

    /**
     * 결과 보여주기
     * inputNumber: 입력값
     */
    private fun showResult(inputNumber: String){

        //결과
        val result = "Strike: $strike, Ball: $ball"

        //결과 목록에 추가
        resultText.append("$inputNumber : $result \n")
    }

    /**
     * 초기화
     */
    private fun reset(){

        lifeCount = 10

        lifeCountText.text = "기회: $lifeCount 번"
        responseText.text = "" //답변
        resultText.text = "" //결과 목록
    }

    /**
     * 화면 구조
     * mode: 타입(start:시작, end: 쉬는중)
     */
    private fun viewMode(mode: String){

        //게임중
        if(mode == "start"){

            //활성화 설정
            startBtn.isEnabled = false //시작버튼
            answerBtn.isEnabled = true //정답 버튼
            resetBtn.isEnabled = true //초기화 버튼
            requestText.isEnabled = true //입력 텍스트

            //색상 변경
            startBtn.setBackgroundColor(getColor(android.R.color.darker_gray))
            answerBtn.setBackgroundColor(getColor(android.R.color.holo_green_light))
            resetBtn.setBackgroundColor(getColor(android.R.color.holo_green_light))

        }else if( mode == "end"){ //쉬는중

            //활성화 설정
            startBtn.isEnabled = true //시작버튼
            answerBtn.isEnabled = false //정답 버튼
            resetBtn.isEnabled = false //초기화 버튼
            requestText.isEnabled = false //입력 텍스트

            //색상 변경
            startBtn.setBackgroundColor(getColor(android.R.color.holo_green_light))
            answerBtn.setBackgroundColor(getColor(android.R.color.darker_gray))
            resetBtn.setBackgroundColor(getColor(android.R.color.darker_gray))
        }
    }

    /**
     * 메시지 알림
     * message: 메시지
     */
    private fun toastMessage(message: String){

        Toast.makeText(applicationContext, message, Toast.LENGTH_SHORT).show()
    }
}

2022.08.26 - [안드로이드] - [안드로이드 코틀린] 텍스트뷰 TextView 클릭 시 효과(ripple)주는 방법

 

[안드로이드 코틀린] 텍스트뷰 TextView 클릭 시 효과(ripple)주는 방법

이번 시간에는 클릭 시에 효과를 주는 방법을 알아보겠습니다. 목차 1. 실행 화면 2. 테마 themes.xml 3. 효과 drawable 4. 메인 화면 activity_main.xml 5. 메인 코드 MainActivity.kt 1. 실행 화..

aries574.tistory.com

2022.08.24 - [안드로이드] - [안드로이드 코틀린 ] 컨텍스트메뉴(ContextMenu) 바탕화면 변경하는 방법

 

[안드로이드 코틀린 ] 컨텍스트메뉴(ContextMenu) 바탕화면 변경하는 방법

이번 시간에는 PC에서 마우스 오른쪽 누르면 나오는 메뉴 ContextMenu를 통해 바탕화면 변경하는 방법을 알아보겠습니다. 메뉴 폴더 만드는 방법과 파일 만드는 방법은 이전 포스팅에 이어서 하니

aries574.tistory.com

2022.08.18 - [안드로이드] - [안드로이드 코틀린] 내가 원하는 글씨체 폰트(Font) 적용하는 방법

 

[안드로이드 코틀린] 내가 원하는 글씨체 폰트(Font) 적용하는 방법

이번 시간에는 안드로이드 기본 폰트가 아닌 다운로드한 폰트를 적용하는 방법에 대하여 알아보겠습니다. 목차 1. 실행 화면 2. 폰트 폴더 font 3. 메인 화면 activity_main.xml 4. 메인 코드 MainA

aries574.tistory.com

 

 

반응형

관련글 더보기

댓글 영역