이번 시간에는 둘 중 하나가 한 줄을 채우면 이기거나, 둘 다 못 채우면 무승부가 되는 승리 체크 로직을 구현하겠습니다.
이전 포스팅은 아래 링크를 들어가시면 됩니다.
2022.10.07 - [안드로이드] - [안드로이드 코틀린] tic-tac-toe 보드게임 만드는 방법 part2 - 기능 구현(클릭 이벤트)
- 설명 -
1. playAgain()
게임 초기화 함수
클릭 횟수, 플레이어 차례, 버튼 표시 초기화
2. updatePlayerScore()
플레이어 승수 업데이트 함수
변경된 플레이어 승수 화면에 적용
3. checkWinner()
승리 체크 함수
플레이어가 입력한 위치와 승리 위치 비교
class MainActivity : AppCompatActivity(), View.OnClickListener {
lateinit var binding: ActivityMainBinding
//버튼 객체 담을 변수
private val buttons = arrayOfNulls<Button>(9)
//활성화 플레이어(true: p1 , false : p2)
private var activityPlayer: Boolean = true
private var p1ScoreCount = 0 //플레이어1 승수
private var p2ScoreCount = 0 //플레이어2 승수
private var roundCount = 0 // 클릭 갯수
//클릭 한 버튼위치 들어갈 배열
var gameState: IntArray = intArrayOf(2, 2, 2, 2, 2, 2, 2, 2, 2)
//승리 위치
var winningPosition: Array<IntArray> =
arrayOf<IntArray>(
intArrayOf(0, 1, 2),
intArrayOf(3, 4, 5),
intArrayOf(6, 7, 8),
intArrayOf(0, 3, 6),
intArrayOf(1, 4, 7),
intArrayOf(2, 5, 8),
intArrayOf(0, 4, 8),
intArrayOf(2, 4, 6)
)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
//순서 표시
viewMode()
//버튼 초기화
for((index, item) in buttons.withIndex()){
val buttonID = "btn_${index}"
val resourceID = resources.getIdentifier(buttonID, "id", packageName)
buttons[index] = findViewById(resourceID)
buttons[index]?.setOnClickListener(this)
}
//초기화 버튼
binding.resetBtn.setOnClickListener {
//게임 초기화
playAgain()
p1ScoreCount = 0
p2ScoreCount = 0
//승수 업데이트
updatePlayerScore()
}
}//onCreate
/**
* 버튼 클릭 이벤트
*/
override fun onClick(view: View?) {
//이미 값이 있으면 리턴
if((view as Button).text.toString() != ""){
Toast.makeText(applicationContext, "이미 체크됨", Toast.LENGTH_SHORT).show()
return
}
//1. 버튼 ID 변수에 담기(예: btn_2)
val buttonId = view.resources.getResourceEntryName(view.id)
//2. 버튼 ID에서 숫자만 변수에 담기(예: 2)
val gameStatePointer = buttonId.substring(buttonId.length-1, buttonId.length).toInt()
//사용자 순서
if((activityPlayer)){ //플레이어 1
//텍스트 설정
view.text = "X"
//텍스트 색상 설정
view.setTextColor(Color.parseColor("#FFC34A"))
//해당 위치에 0을 넣는다.
gameState[gameStatePointer] = 0
}else{ //플레이어2
//텍스트 설정
view.text = "O"
//텍스트 색상 설정
view.setTextColor(Color.parseColor("#70FFEA"))
//해당 위치에 0을 넣는다.
gameState[gameStatePointer] = 1
}
roundCount++ //턴 수 올리기기
//승리 체크
if(checkWinner()){
if(activityPlayer){//플레이어1이 승리
p1ScoreCount++ //승수올리기
updatePlayerScore() //승수 업데이트
Toast.makeText(this, "플레이어1 승리", Toast.LENGTH_SHORT).show()
playAgain()//게임 초기화
}else{//플레이어2 승리
p2ScoreCount++ //승수올리기
updatePlayerScore() //승수 업데이트
Toast.makeText(this, "플레이어2 승리", Toast.LENGTH_SHORT).show()
playAgain()//게임 초기화
}
}else if(roundCount == 9){ //클릭 횟수 9개 채웠는데 승부가 안나면
playAgain()//초기화
Toast.makeText(this, "무승부", Toast.LENGTH_SHORT).show()
}else{ //계속 게임
//순서 변경
activityPlayer = !activityPlayer
}
//순서 표시
viewMode()
}
/**
* 순서 표시
*/
private fun viewMode(){
if(activityPlayer){
binding.player1.setTextColor(Color.RED)
binding.player2.setTextColor(Color.BLACK)
}else{
binding.player1.setTextColor(Color.BLACK)
binding.player2.setTextColor(Color.RED)
}
}
/**
* 게임 초기화
*/
private fun playAgain(){
roundCount = 0 //클릭 횟수
activityPlayer = true // 플레이어 순서
//버튼 초기화
for((index, item) in buttons.withIndex()){
gameState[index] = 2
buttons[index]?.text = ""
}
}
/**
* 승수 업데이트
*/
private fun updatePlayerScore(){
//화면에 승수 적용
binding.player1Score.text = p1ScoreCount.toString()
binding.player2Score.text = p2ScoreCount.toString()
}
/**
* 승리 체크
*/
private fun checkWinner(): Boolean{
//결과
var winnerResult = false
for(winPosition in winningPosition){
//승리위치 비교
if(gameState[winPosition[0]] == gameState[winPosition[1]] &&
gameState[winPosition[1]] == gameState[winPosition[2]] &&
gameState[winPosition[0]] != 2){
winnerResult = true
}
}
return winnerResult
}
}
2022.10.04 - [안드로이드] - [안드로이드 코틀린] CountDownTimer 타이머 쉽게 만드는 방법 part1 뷰 바인딩 및 화면 구성
2022.09.30 - [안드로이드] - [안드로이드 코틀린] HTTP Glide 이미지 쉽게 보여주는 방법
2022.09.28 - [안드로이드] - [안드로이드 코틀린] HTTP 통신 Retrofit2 사용법 part1 - 권한 및 설정
[안드로이드 코틀린] 갤러리에서 다중 선택 사진 RecycelrView 에 보여주는 방법 (0) | 2022.10.12 |
---|---|
[안드로이드 코틀린] 갤러리에서 선택한 사진 이미지뷰(ImageView)에 보여주는 방법 (1) | 2022.10.11 |
[안드로이드 코틀린] tic-tac-toe 보드게임 만드는 방법 part2 - 기능 구현(클릭 이벤트) (0) | 2022.10.07 |
[안드로이드 코틀린] tic-tac-toe 보드게임 만드는 방법 part1 - 뷰 바인딩 및 화면구성 (0) | 2022.10.06 |
[안드로이드 코틀린] CountDownTimer 타이머 쉽게 만드는 방법 part2 기능 구현 (1) | 2022.10.05 |
댓글 영역