이번 시간에는 같은 그림 찾기 게임 part4
첫 번째 클릭한 이미지와 두 번째 클릭한 이미지 비교하고
모든 이미지를 맞추면 게임 완료되는 방법에 대하여 알아보겠습니다.
이전 포스팅은 아래 링크를 들어가시면 됩니다.
2022.08.09 - [안드로이드] - [안드로이드 코틀린] 같은 그림 찾기 게임 만드는 방법 part3 - 클릭&뒤집기
- 설명 -
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) 쉽게 만드는 방법
2022.08.05 - [안드로이드] - [안드로이드 코틀린] 애니메이션으로 뷰(View) 표시 및 숨기기 - 회전 표시 쉽게 만드는 방법
2022.08.04 - [안드로이드] - [안드로이드] 애니메이션으로 뷰(View) 표시 및 숨기기 - 카드플립(CardFlip) 쉽게 만드는 방
[안드로이드 코틀린 ] RecyclerView Item Animation 서서히 나타나는 효과 주는 방법 part2 (0) | 2022.08.12 |
---|---|
[안드로이드 코틀린 ] RecyclerView Item Animation 서서히 나타나는 효과 주는 방법 part1 (0) | 2022.08.11 |
[안드로이드 코틀린] 같은 그림 찾기 게임 만드는 방법 part3 - 클릭&뒤집기 (0) | 2022.08.09 |
[안드로이드 코틀린] 같은 그림 찾기 게임 만드는 방법 part2 - 이미지 섞기& 보여주기 (0) | 2022.08.08 |
[안드로이드 코틀린] 간단한 할 일 목록(ToDo List) 쉽게 만드는 방법 (0) | 2022.08.06 |
댓글 영역