0. 오리엔테이션 1. 코틀린의 기본의 기본을 읽혀요! - 코틀린이란 무엇일까? - 변수와 자료형, 연산자 2. 함수형 프로그래밍 이란? - 마법의 요술상자, 함수의 기본 - 요술상자, 함수 가지고 놀기 3. 프로그램 흐름의 제어 - 프로그램의 흐름을 제어해보자! 4. 코틀린의 표준함수 활용하기 - 코틀린과 표준함수 5. 강좌 마무리 프로젝트 |
▶ 깃허브 코드 : github.com/0525hhgus/Kotlin-study
[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차원 배열로 진행했습니다.
- 주석을 조금 많이 적어놔서 코드 실행시키면서 참고하시면 좋을 것 같습니다.
🤔 다음 포스팅
챕터별로 리뷰하다보니 생각보다 일찍 끝나버려서 강의에서 배웠던 내용 정리와 최종 후기로 다음 글을 작성하려고 합니다.
감사합니다!
'대외활동 > Naver Boostcourse' 카테고리의 다른 글
[코칭스터디 8기] <부스트코스 코칭스터디 : Data Science 2023> 후기 (리드 부스터) (0) | 2024.02.09 |
---|---|
[부스트코스] 코틀린 프로그래밍 기본 1/2(함수편) - 강의 핵심 정리 및 후기 (0) | 2021.02.23 |
[부스트코스] 코틀린 프로그래밍 기본 1/2(함수편) - 코틀린과 표준함수 (0) | 2021.02.12 |
[부스트코스] 코틀린 프로그래밍 기본 1/2(함수편) - 프로그램 흐름 제어 (0) | 2021.02.12 |
[부스트코스] 코틀린 프로그래밍 기본 1/2(함수편) - 람다식과 고차 함수 (0) | 2021.02.01 |