상세 컨텐츠

본문 제목

[안드로이드 코틀린] 같은 그림 찾기 게임 만드는 방법 part4 - 비교&완료

안드로이드

by aries574 2022. 8. 10. 14:49

본문


이번 시간에는 같은 그림 찾기 게임 part4

첫 번째 클릭한 이미지와 두 번째 클릭한 이미지 비교하고

모든 이미지를 맞추면  게임 완료되는 방법에 대하여 알아보겠습니다.

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

2022.08.09 - [안드로이드] - [안드로이드 코틀린] 같은 그림 찾기 게임 만드는 방법 part3 - 클릭&뒤집기

 

[안드로이드 코틀린] 같은 그림 찾기 게임 만드는 방법 part3 - 클릭&뒤집기

이번 시간에는 같은 그림 찾기 part3 클릭하면 랜덤한 이미지를 보여주는 방법을 알아보겠습니다. 이전 포스팅은 아래 링크를 들어가시면 됩니다. 2022.08.08 - [안드로이드] - [안드로이드 코틀린]

aries574.tistory.com


목차

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


1. 실행 화면

 


2. 메인 코드 MainActivity.kt

- 설명 -

1. !cards[index].isMatched

  카드 매치 상태 체크

2.  cards[index].isFaceUp = false

  카드 뒤집힘 상태 앞면으로 변경

3. if(cards[prePosition].imageId == cards[position].imageId)

  첫 번째 이미지와 두 번째 이미지 비교

4. buttons[prePosition]?.alpha = 0.1f

  비교해서 같다면 선명도 흐리게 변경

5. if(count == cards.size)

  매치 개수와 카드 개수 같다면 게임 완료

class MainActivity : AppCompatActivity(), View.OnClickListener{

    //버튼 리스트
    private val buttons: Array<ImageButton?> = arrayOfNulls<ImageButton>(8)

    //이미지 리스트
    private lateinit var imageList: ArrayList<Int>

    //카드 리스트
    private lateinit var cards: ArrayList<MemoryCard>

    //결과 텍스트
    private lateinit var resultText: TextView

    //이전 카드 위치
    private var preCardPosition: Int = -1

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

        //초기화
        resultText = findViewById(R.id.result_text)
        val resetBtn: Button = findViewById(R.id.reset_btn)
        resetBtn.setOnClickListener {
            //셋팅
            init()
        }

        //셋팅
        init()

    }//onCreate

    //셋팅 함수
    private fun init(){

        //이미지 리스트 초기화
        imageList = ArrayList()

        //카드 리스트 초기화
        cards = ArrayList()

        //리스트에 데이터 등록
        imageList.add(R.drawable.dog)
        imageList.add(R.drawable.pig)
        imageList.add(R.drawable.rabbit)
        imageList.add(R.drawable.cat)
        imageList.add(R.drawable.dog)
        imageList.add(R.drawable.pig)
        imageList.add(R.drawable.rabbit)
        imageList.add(R.drawable.cat)

        //순서 섞기
        imageList.shuffle()

        for((index, item) in buttons.withIndex()){

            //버튼 아이디
            val buttonID = "imageBtn${index}"

            //리소스 아이디
            val resource: Int = resources.getIdentifier(buttonID, "id", packageName)

            //버튼 초기화
            buttons[index] = findViewById(resource)

            //각 버튼에 클릭 이벤트 적용
            buttons[index]?.setOnClickListener(this)

            //카드 리스트에 데이터 담기
            cards.add(MemoryCard(imageList[index], false, false))

            //버튼에 기본 이미지 변경
            buttons[index]?.setImageResource(R.drawable.question)

            //선명도 설정
            buttons[index]?.alpha = 1.0f
        }
    }

    //클릭 이벤트
    override fun onClick(view: View?) {

        //view id 가져오기
        val id: Int? = view?.id

        //위치 변수
        var position: Int = 0

        when(id){
            R.id.imageBtn0 -> position = 0
            R.id.imageBtn1 -> position = 1
            R.id.imageBtn2 -> position = 2
            R.id.imageBtn3 -> position = 3
            R.id.imageBtn4 -> position = 4
            R.id.imageBtn5 -> position = 5
            R.id.imageBtn6 -> position = 6
            R.id.imageBtn7 -> position = 7
        }

        //업데이트 모델
        updateModel(position)

        //업데이트 뷰
        updateView(position)
    }

    //업데이트 모델
    private fun updateModel(position: Int){

        var card: MemoryCard = cards[position]

        //나중에 카드 비교할 때 뒤집고 다시 클릭하는지 방지
        if(card.isFaceUp){
            Toast.makeText(this, "이미 뒤집었음", Toast.LENGTH_SHORT).show()
            return
        }

        //뒤집힌 카드: 이전에 뒤집힌 카드 0 또는 2개일 때
        if(preCardPosition == -1){

            //카드 초기화
            restoreCard()

            //위치 저장
            preCardPosition = position

        }else{ // 이전에 뒤집힌 카드 1개 일때

            //카드 비교
            checkForMatch(preCardPosition, position)
                preCardPosition = -1

        }

        //반대의 값을 넣는다( 앞면 -> 뒷면, 뒷면 -> 앞면)
        cards[position].isFaceUp = !card.isFaceUp
    }

    //업데이트 뷰
    private fun updateView(position: Int){

        var card: MemoryCard = cards[position]

        //뒤집었다면 랜덤 이미지를 보여준다.
        if(card.isFaceUp){
            buttons[position]?.setImageResource(card.imageId)
        }else{
            //기본 이미지
            buttons[position]?.setImageResource(R.drawable.question)
        }
    }

    /**
     * 카드 초기화
     */
    private fun restoreCard(){

        for((index, item) in cards.withIndex()){

            //매치되지 않은 거
            if(!cards[index].isMatched){

                //이미지 앞으로
                buttons[index]?.setImageResource(R.drawable.question)

                //데이터 수정
                cards[index].isFaceUp = false
            }
        }
    }

    /**
     * 카드 이미지 비교
     * prePosition 이전 카드 위치
     * position 현재 카드 위치
     */
    private fun checkForMatch(prePosition: Int, position: Int){

        //처음 카드와 두 번째 카드 이미지가 같다면
        if(cards[prePosition].imageId == cards[position].imageId){

            resultText.text = "매치 성공"

            //매치 변경
            cards[prePosition].isMatched = true
            cards[position].isMatched = true

            //색상 변경
            buttons[prePosition]?.alpha = 0.1f
            buttons[position]?.alpha = 0.1f

            //완료 체크
            checkCompletion()
        }else{

            resultText.text = "매치 실패"
        }
    }

    /**
     * 완료 체크
     */
    private fun checkCompletion(){

        var count: Int = 0

        for((index, item) in cards.withIndex()){

            if(cards[index].isMatched){
                count++
            }
        }

        //매치 갯수가 카드 갯수와 같다면 완료
        if(count == cards.size){
            resultText.text = "게임 끝"
        }
    }

}

2022.08.06 - [안드로이드] - [안드로이드 코틀린] 간단한 할 일 목록(ToDo List) 쉽게 만드는 방법

 

[안드로이드 코틀린] 간단한 할 일 목록(ToDo List) 쉽게 만드는 방법

이번 시간에는 ListView를 이용해서 간단한 할 일(todo list) 목록 만드는 방법에 대하여 알아보겠습니다. 목차 1. 실행 화면 2. 아이템 화면 list_item.xml 3. 메인 화면 activity_main.xml 4. 메인 ..

aries574.tistory.com

2022.08.05 - [안드로이드] - [안드로이드 코틀린] 애니메이션으로 뷰(View) 표시 및 숨기기 - 회전 표시 쉽게 만드는 방법

 

[안드로이드 코틀린] 애니메이션으로 뷰(View) 표시 및 숨기기 - 회전 표시 쉽게 만드는 방법

이번 시간에는 애니메이션(Animation)을 이용해서 텍스트뷰가 퍼지듯이 나타났다가 퍼지듯이 사라지는 방법을 알아보겠습니다. 목차 1. 실행 화면 2. 메인 화면 activity_main.xml 3. 메인 코드 MainA

aries574.tistory.com

2022.08.04 - [안드로이드] - [안드로이드] 애니메이션으로 뷰(View) 표시 및 숨기기 - 카드플립(CardFlip) 쉽게 만드는 방

 

[안드로이드] 애니메이션으로 뷰(View) 표시 및 숨기기 - 카드플립(CardFlip) 쉽게 만드는 방

이번 시간에는 Animation을 이용해서 뒤집어서 TextView 변경하는 방법을 알아보겠습니다. 목차 1. 실행 화면 2. 메인 화면 activity_main.xml 3 애니메이션 폴더 만드는 방법 4 애니메이션 파일 만.

aries574.tistory.com

반응형

관련글 더보기

댓글 영역