본문 바로가기
대외활동/Naver Boostcourse

[부스트코스] 코틀린 프로그래밍 기본 1/2(함수편) - 미니 프로젝트

by 드인 2021. 2. 14.

코틀린 프로그래밍 기본 1/2 (함수편)

 


 

0. 오리엔테이션

1. 코틀린의 기본의 기본을 읽혀요!

- 코틀린이란 무엇일까?

 - 변수와 자료형, 연산자

2. 함수형 프로그래밍 이란?

 - 마법의 요술상자, 함수의 기본

 - 요술상자, 함수 가지고 놀기

3. 프로그램 흐름의 제어

 - 프로그램의 흐름을 제어해보자!

4. 코틀린의 표준함수 활용하기

 - 코틀린과 표준함수

5. 강좌 마무리 프로젝트

▶ 깃허브 코드 : github.com/0525hhgus/Kotlin-study

 

0525hhgus/Kotlin-study

Kotlin-study. Contribute to 0525hhgus/Kotlin-study development by creating an account on GitHub.

github.com


[TicTacToe 미니 프로젝트]


※ 프로젝트 코드

// Kotlin Final Project <TicTacToc Game>
// 2021.2.14 (일)

/*
보드판 : 1차원 배열 (0~8로 각 자리 표현)

  0 1 2
0 0|1|2
  -+-+-
1 3|4|5
  -+-+-
2 6|7|8

EX1) Player 1이 2,0 입력 -> 보드 위치 = x*3+y = 2*3+1 = 7 -> board[7] = 1 -> O 표시
EX2) Player 2이 0,1 입력 -> 보드 위치 = x*3+y = 0*3+1 = 7 -> board[1] = 2 -> X 표시

*/

var x: Int = 0
var y: Int = 0

fun main() {

    var board = Array<Int>(9) { 0 } // 보드판
    
    play(board) // 게임시작
}

// 입력받은 값이 범위 안에 있는지 확인하는 람다식
val isInRange: (Int, Int) -> Boolean = { cx: Int, cy: Int ->
    cx in 0..2 && cy in 0..2
}

// 보드판 출력 함수
fun printBoard(borad: Array<Int>) {

    print("  ")
    (0..2).forEach { vx ->
        print("$vx ") // 열 번호
    }
    println()

    for (vy in 0..2) {
        print("$vy ") // 행 번호

        (0..2).forEach { vx ->
            val pos = vx * 3 + vy // 보드판 위치
            when(borad[pos]){
                1 -> print("O") // Player 1 입력 존재 -> O 표시
                2 -> print("X") // Player 2 입력 존재 -> X 표시
                else -> print(" ")
            }
            if (vx != 2) print("|")
        }
        println()

        if (vy != 2) {
            print("  ")
            (0..2).forEach { vx ->
                print("-")
                if (vx != 2) print("+")
            }
            println()
        }
    }
}

// 입력 함수
fun playerInput(player: String, board: Array<Int>): Boolean {
    print("$player 입력(줄, 칸): ")
    val input: String? = readLine() // a,b

    x = Integer.parseInt(input?.get(0).toString()) // input?.get(0) = a
    y = Integer.parseInt(input?.get(2).toString()) // input?.get(2) = b
    var pos = x * 3 + y // 보드판 위치

    if (!isInRange(x, y) || board[pos] > 0)
        return false

    return true
}

// 승리 여부 판별 함수
fun isWin(board: Array<Int>, x: Int, y: Int): Boolean {

    // 가로, 세로, 우하 대각선, 우상 대각선 방향에 대한 x, y 변화량
    val dx = arrayOf(-1, 1, 0, 0, -1, 1, 1, -1)
    val dy = arrayOf(0, 0, -1, 1, -1, 1, -1, 1)

    
    for(i in 0..3){
        var count = 1
        for(j in 0..1){
            val index = 2*i+j
            var cx = x + dx[index] // x 변화량 적용
            var cy = y + dy[index] // y 변화량 적용

            while(isInRange(cx, cy) && board[x * 3 + y] > 0){
                if(board[x * 3 + y] == board[cx * 3 + cy]) count++ // 변화량 범위 안에 Player가 입력한 값이 있을 경우
                cx += dx[index]
                cy += dy[index]
            }
        }
        if(count == 3) return true
    }
    return false
}

// 게임 플레이 함수
fun play(board: Array<Int>) {

    var round = 0
    var turn = 0

    while (true) {

        println("\n ${turn + 1}번째 턴\n")
        printBoard(board)

        val player = "Player ${turn + 1}" // Player 이름

        if (!playerInput(player, board)) // 다른 Player가 입력했거나 보드 범위가 아닌 경우 턴 전환 (continue)
            continue

        val pos = x * 3 + y

        when (turn) {
            0 -> board[pos] = 1 // Player 1 이면 보드 위치에 1 입력
            else -> board[pos] = 2 // Player 2 이면 보드 위치에 2 입력
        }

        round++

        if (round == 9) { // 보드판이 다 채워진 경우
            printBoard(board)
            println("무승부!")
            break
        }

        if (isWin(board, x, y)) { // 승리 판별
            printBoard(board)
            print(player)
            println(" 승리!")
            break
        }

        (if (turn == 0) 1 else 0).also { turn = it } // 턴 전환
    }

}

 

실행 결과

- 2차원 배열이 아닌 1차원 배열로 진행했습니다. 

- 주석을 조금 많이 적어놔서 코드 실행시키면서 참고하시면 좋을 것 같습니다.

 

🤔 다음 포스팅

  챕터별로 리뷰하다보니 생각보다 일찍 끝나버려서 강의에서 배웠던 내용 정리와 최종 후기로 다음 글을 작성하려고 합니다. 

 

 


서포터즈 네임택


감사합니다!