[TECHIT] 코틀린 10

hegleB·2023년 5월 26일
0
post-thumbnail

미니 프로젝트로 틱택토 게임을 만들어 보았다. 컴퓨터와 대전하는 것이 아니라 플레이어 2명에서 게임을 하는 방식으로 코드를 작성하였다.

[내가 작성한 코드]

import java.util.Scanner

fun main() {
    val ticTacToe = TicTacToe()
    ticTacToe.play()
}


// 틱택토 클래스
class TicTacToe{

    private val SIZE = 3
    private val LAST_ROUND = 9
    private val board = Array(SIZE) { Array(SIZE) { " " } }
    private var playerNumber = 0

    // 게임 플레이
    fun play() {
        var round = 0
        var cell = "O"

        val scanner = Scanner(System.`in`)
        while (true) {
            println("${round+1}번째 턴")
            printBoard()

            if (isGameOver(cell, round)) {
                break
            }
            try {
                playerNumber = round % 2 + 1

                val rowCol = inputRowCol(scanner)
                val row = rowCol[0]
                val col = rowCol[1]
                cell = if (round%2 == 0) "O" else "X"

                setCell(row, col, cell)
            } catch (e: NumberFormatException) {
                println("[ERROR] 숫자만 입력해야합니다.")
                continue
            } catch (e: IndexOutOfBoundsException) {
                println("[ERROR] 입력 형식이 잘못 되었습니다.")
                continue
            } catch (e: IllegalArgumentException) {
                println(e.message)
                continue
            }
            round++
        }
    }

    // 보드에 셀을 놓는다
    private fun setCell(row: Int, col: Int, cell: String) {
        if (board[row][col] != " ") {
            throw IllegalArgumentException("[ERROR] 빈칸이 아닙니다. 다시 입력해주세요.")
        }
        board[row][col] = cell
    }

    // 줄,칸 입력
    private fun inputRowCol(scanner: Scanner): List<Int> {
        print("Player$playerNumber 입력(줄,칸) ")
        val inputRowColumn = scanner.next()
        val rowCol = inputRowColumn.split(",").map { it.toInt() }
        if (rowCol.size != 2) {
            throw IllegalArgumentException("[ERROR] 숫자 2개여야 합니다.")
        }
        return rowCol
    }

    // 종료 여부 확인
    private fun isGameOver(cell: String, round: Int): Boolean {
        when {
            checkWin(cell) -> {
                println("Player${playerNumber} 승리!")
                return true
            }

            !checkWin(cell) && round == LAST_ROUND -> {
                println("무승부!!")
                return true
            }
        }
        return false
    }

    // Board 출력
    private fun printBoard() {
        for (i in 0 until SIZE) {
            print(" $i ")
        }
        println()

        for (i in 0 until SIZE) {
            print("$i ")

            for (j in 0 until  SIZE ) {
                print(board[i][j])
                if (j != SIZE - 1) print('|') else println()
            }
            if (i != SIZE - 1) println("  -+-+-") else println()
        }
    }

    // 게임 승리 확인
    private fun checkWin(player: String): Boolean {
        if (checkRow(player) || checkCol(player) || checkDiagonal(player) || checkReverseDiagonal(player)) {
            return true
        }
        return false
    }

    // ReverseDiagonal 확인
    private fun checkReverseDiagonal(player: String): Boolean {
        var count = 0
        for (row in 0 until SIZE) {
            if (board[row][SIZE - row - 1] != player) {
                return false
            } else {
                count++
            }
        }
        if (count != SIZE) {
            return false
        }
        return true
    }

    // Diagonal 확인
    private fun checkDiagonal(player: String): Boolean {
        var count = 0
        for (i in 0 until SIZE) {
            if (board[i][i] != player) {
                return false
            } else {
                count++
            }
        }
        if (count != SIZE) {
            return false
        }
        return true
    }

    // Row 확인
    private fun checkRow(player: String): Boolean {
        for (col in 0 until SIZE) {
            var count = 0
            for (row in 0 until SIZE) {
                if (board[row][col] != player) {
                    continue
                } else {
                    count++

                    if (count == SIZE) {
                        return true
                    }
                }
            }
        }
        return false
    }

    // Column 확인
    private fun checkCol(player: String): Boolean {
        for (row in 0 until SIZE) {
            var count = 0
            for (col in 0 until SIZE) {
                if (board[row][col] != player) {
                    continue
                } else {
                    count++
                    if (count == SIZE) {
                        return true
                    }
                }
            }
        }
        return false
    }
}

이 코드에서 발생할 수 있는 예외를 최대한 처리할 수 있도록 구현하였다. 플레이어가 줄,칸을 입력 했을 때 셀이 놓여져 있는 경우 예외 처리를 하였다. 또한, 줄,칸을 입력하는 부분에서 숫자가 아닌 다른 문자, 그리고 숫자가 2개를 입력하지 않은 경우 그리고 마지막으로 줄,칸 입력 형식으로 하지 않은 경우 예외 처리하였다. 또한 추가적으로 셀을 놓을 자리도 없고 승리 여부가 판단이 되지 않는 경우 게임이 종료되고 무승부가 출력되도록 구현하였다.

profile
성장하는 개발자

0개의 댓글

관련 채용 정보